При разработке отчетов и печатных форм в платформе 1С стандартным подходом является создание визуального макета в конфигураторе с последующим выводом именованных областей. Однако возникают задачи, когда структура вывода заранее неизвестна: число колонок динамически меняется, в разных строках требуется разное смещение ячеек, или макет должен генерироваться полностью «на лету» без привязки к метаданным. Рассмотрим, как решить эту задачу исключительно средствами встроенного языка 1С.
Платформа 1С позволяет манипулировать ячейками табличного документа напрямую с помощью координат строк и колонок. Для этого инициализируется новый объект ТабличныйДокумент, после чего вызывается метод Область(R1, C1, R2, C2).
Разберем по шагам создание документа с нуля и оформление ячеек:
ТабДок = Новый ТабличныйДокумент;.Посмотрим на пример программного оформления ячеек и установки рамок:
ТабДок = Новый ТабличныйДокумент;
// Создаем объекты оформления заранее для оптимизации
ШрифтЗаголовка = Новый Шрифт(ТабДок.Область(1, 1).Шрифт, , 11, Истина);
ЦветФонаШапки = Новый Цвет(230, 230, 250);
ТонкаяЛиния = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
// Оформляем шапку
ОбластьШапки = ТабДок.Область(1, 1, 1, 3);
ОбластьШапки.Объединить();
ОбластьШапки.Текст = "Динамический отчет";
ОбластьШапки.Шрифт = ШрифтЗаголовка;
ОбластьШапки.ЦветФона = ЦветФонаШапки;
ОбластьШапки.ГоризонтальноеПоложение = ПоложениеТекстаВЯчейке.Центр;
// Заполняем строку данных и устанавливаем рамки
Ячейка1 = ТабДок.Область(2, 1);
Ячейка1.Текст = "Параметр 1";
Ячейка1.Обвести(ТонкаяЛиния, ТонкаяЛиния, ТонкаяЛиния, ТонкаяЛиния);
Ячейка2 = ТабДок.Область(2, 2);
Ячейка2.СодержитЗначение = Истина;
Ячейка2.ТипЗначения = Новый ОписаниеТипов("Число");
Ячейка2.Значение = 1500;
Ячейка2.Обвести(ТонкаяЛиния, ТонкаяЛиния, ТонкаяЛиния, ТонкаяЛиния);
Если макет состоит из повторяющихся блоков разной ширины, формировать координаты вручную неудобно. В этом случае эффективнее конструировать промежуточные фрагменты в памяти и выводить их в результирующий документ с помощью методов Вывести() (добавление новой строки вниз) и Присоединить() (добавление ячеек справа в текущую строку).
Рассмотрим пример формирования динамической таблицы с переменным количеством колонок:
ТабДок = Новый ТабличныйДокумент;
// Вспомогательный табличный документ для сборки одной ячейки
Фрагмент = Новый ТабличныйДокумент;
ЯчейкаШаблона = Фрагмент.Область(1, 1);
ЯчейкаШаблона.Обвести(Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1));
Для НомерСтроки = 1 По 5 Цикл
Для НомерКолонки = 1 По 4 Цикл
ЯчейкаШаблона.Текст = "Стр " + НомерСтроки + ", Кол " + НомерКолонки;
Если НомерКолонки = 1 Тогда
// Первую колонку строки выводим вниз
ТабДок.Вывести(Фрагмент);
Иначе
// Остальные колонки пристыковываем справа
ТабДок.Присоединить(Фрагмент);
КонецЕсли;
КонецЦикла;
КонецЦикла;
По умолчанию сетка колонок в табличном документе 1С является сквозной по всей высоте: изменение ширины колонки влияет на все строки. Если в динамическом отчете требуется, чтобы в разных строках колонки имели разную ширину и независимые смещения, необходимо использовать функционал индивидуального формата строк.
Проанализируем способы управления сеткой:
ТабличныйДокумент.СоздатьФорматСтрок(НомерСтроки). После этого изменение свойств колонок в указанной строке не отразится на остальном документе.ТабДок.Вывести(Область, , , Истина) или ТабДок.Присоединить(Область, , , Истина) передаем значение Истина в четвертый параметр СоздаватьФорматСтрок.
// Пример создания независимой ширины колонок для конкретной строки
ТабДок.СоздатьФорматСтрок(3);
ОбластьСтроки = ТабДок.Область(3, 1, 3, 1);
ОбластьСтроки.ШиринаКолонки = 40; // Изменит ширину только в третьей строке
Программное создание стилей для каждой отдельной ячейки создает повышенную нагрузку на платформу. Чтобы генерация отчета выполнялась быстро, соблюдайте следующие правила:
Новый Шрифт(), Новый Цвет() и Новый Линия() один раз перед обходом данных.Область().Присоединить() — это избавит от ручного описания десятков свойств оформления.