При разработке печатных форм и отчетов в 1С часто возникает задача вывести произвольное количество колонок. Например, когда список характеристик, складов, месяцев или типов упаковок заранее неизвестен и определяется только набором данных из документа или запроса.
Разберем подробно, как правильно размечать макет табличного документа и использовать комбинацию методов Вывести() и Присоединить() для построения динамических таблиц.
Для корректного формирования динамических колонок макет должен быть размечен одновременно по горизонтали (строки) и по вертикали (колонки). Вывод выполняется путем получения пересечений этих областей.
Синтаксис получения пересечения областей макета выглядит следующим образом:
Область = Макет.ПолучитьОбласть("ИмяИменованнойСтроки|ИмяИменованнойКолонки");
При формировании табличного документа используются два ключевых метода:
Вывести() — помещает полученную область ниже самой нижней ранее выведенной строки, создавая новую строку табличного документа.Присоединить() — помещает область справа от самой правой выведенной колонки, с сохранением текущей строки табличного документа.Рассмотрим пошаговую логику построения динамической таблицы:
Вывести() (например, колонка «Номенклатура»).Присоединить().Вывести().Присоединить(). Порядок обхода колонок в строке должен строго совпадать с порядком обхода при выводе шапки.Проанализируем пример кода формирования печатной формы, где количество колонок характеристик формируется динамически:
// 1. Инициализация табличного документа и макета
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ПогрузочныйЛист");
// 2. Вывод фиксированного заголовка таблицы (левая часть)
ОбластьЗаголовокНоменклатура = Макет.ПолучитьОбласть("ЗаголовокТаблицы|Номенклатура");
ТабДок.Вывести(ОбластьЗаголовокНоменклатура);
// 3. Динамический вывод заголовков колонок
ОбластьЗаголовокХарактеристика = Макет.ПолучитьОбласть("ЗаголовокТаблицы|Характеристика");
Для Каждого ТекущаяХарактеристика Из МассивХарактеристик Цикл
ОбластьЗаголовокХарактеристика.Параметры.НазваниеХарактеристики = ТекущаяХарактеристика;
ТабДок.Присоединить(ОбластьЗаголовокХарактеристика);
КонецЦикла;
// 4. Вывод строк таблицы
ОбластьСтрокаНоменклатура = Макет.ПолучитьОбласть("СтрокаТЧ|Номенклатура");
ОбластьСтрокаХарактеристика = Макет.ПолучитьОбласть("СтрокаТЧ|Характеристика");
Пока ВыборкаНоменклатура.Следующий() Цикл
// Выводим левую фиксированную ячейку строки
ОбластьСтрокаНоменклатура.Параметры.Номенклатура = ВыборкаНоменклатура.Номенклатура;
ТабДок.Вывести(ОбластьСтрокаНоменклатура);
// Выводим динамические ячейки строки строго в том же порядке, что и шапку
Для Каждого ТекущаяХарактеристика Из МассивХарактеристик Цикл
// Получаем значение для конкретной характеристики
ЗначениеКоличества = ПолучитьЗначениеХарактеристики(ВыборкаНоменклатура, ТекущаяХарактеристика);
ОбластьСтрокаХарактеристика.Параметры.Количество = ЗначениеКоличества;
ТабДок.Присоединить(ОбластьСтрокаХарактеристика);
КонецЦикла;
КонецЦикла;
ТабДок.Показать();
Разберем частые проблемы, с которыми сталкиваются разработчики при вызове метода Присоединить():
Присоединить(). Цикл присоединения должен отрабатывать для каждой колонки из шапки. Если значения нет, необходимо присоединять пустую область-заглушку с сохраненным оформлением borders и шрифтов.Присоединить() берет ширину из присоединяемой вертикальной области макета. Убедитесь, что в макете задана явная ширина для именованной колонки.Помимо ручного вывода через Присоединить(), в платформе 1С существуют другие способы решения задачи:
ТабДок.Область(): Допускается предварительный вывод пустой сетки необходимого размера с последующей записью значений напрямую по индексам строк и колонок через координаты области ТабДок.Область(НомерСтроки, НомерКолонки).