1 мар. 2013 г.

Получение коллекции областей макета табличного документа

Сделав недавно подряд с десяток отчетов с макетами в виде табличного документа, задумался о том, что было бы неплохо сократить часть кода, отвечающего за описание областей макета. Возникла идея набросать функционал, позволяющий собрать все именованные области макета в коллекцию, нежели каждый раз объявлять для этого переменные. В итоге получилось довольно простое решение. Оно позволяет получать как перечень областей макета, так и пересечения горизонтальных и вертикальных областей. К тому же, при добавлении по мере разработки отчета новых именованных областей в макет нет необходимости дополнительно описывать их в коде.

Основной код вынесен в общий модуль ОбластиМакета:
Функция ЭтоСтрока(Область)
 
 Возврат Область.Лево = 0 И Область.Право = 0;
 
КонецФункции

Функция ЭтоСтолбец(Область)
 
 Возврат Область.Верх = 0 И Область.Низ = 0;
 
КонецФункции

Функция ПолучитьОбласти(Макет, ПересечениеОбластей = Ложь) Экспорт
 
 Перем мПересечения;
 
 Если ПересечениеОбластей Тогда
  мПересечения = Новый Массив;
  Для Каждого Область Из Макет.Области Цикл
   Если ЭтоСтолбец(Область) Тогда
    мПересечения.Добавить(Область.Имя);
   КонецЕсли;
  КонецЦикла;
 КонецЕсли;
 
 СтруктураОбластей = Новый Структура;
 Для Каждого Область Из Макет.Области Цикл
  Если ПересечениеОбластей Тогда
   Если ЭтоСтолбец(Область) Тогда
    Продолжить;
   КонецЕсли;
   Если ЭтоСтрока(Область) Тогда
    Для Каждого Пересечение Из мПересечения Цикл
     СтруктураОбластей.Вставить(Область.Имя + Пересечение, Макет.ПолучитьОбласть(Область.Имя + "|" + Пересечение));
    КонецЦикла;
   Иначе
    СтруктураОбластей.Вставить(Область.Имя, Макет.ПолучитьОбласть(Область.Имя));
   КонецЕсли;
  Иначе
   СтруктураОбластей.Вставить(Область.Имя, Макет.ПолучитьОбласть(Область.Имя));
  КонецЕсли;
 КонецЦикла;
 
 Возврат СтруктураОбластей;
 
КонецФункции
Теперь достаточно передать в функцию ПолучитьОбласти необходимый макет и мы получим коллекцию его областей в виде структуры, в которой имена ключей соответствуют именам областей.
Набросаем для теста простую обработку, макет которой содержит как горизонтальные, так и вертикальные области, а так же добавим именованную ячейку.



Процедура КнопкаСформироватьНажатие(Кнопка)
 
 Макет = ПолучитьМакет("Макет");
 Обл = ОбластиМакета.ПолучитьОбласти(Макет, ПолучитьПересечения);
 
КонецПроцедуры

Теперь посмотрим в отладчике, какие данные попадают в структуру при разных значениях флага "ПолучитьПересечения".

ПолучитьПересечения = Ложь

ПолучитьПересечения = Истина
Привычный код
ОблСтрока1 = Макет.ПолучитьОбласть("Строка1");
//.. прочий код
ОблСтрока1.Параметры.ПП = 1;
 
при использовании моего способа аналогичен
Обл.Строка1.Параметры.ПП = 1;
 
где Обл - структура областей, полученная через функцию ПолучитьОбласти.

2 комментария:

  1. Спасибо за статью,
    по логике, имхо, в случае пересечения областей мы получаем ячейки, тогда список нужно дополнить оригинальными областями.

    ОтветитьУдалить
  2. Все верно, в дальнейшем я так и сделал )

    ОтветитьУдалить