Разработка и Конфигурация · 11 мин
Как вывести макет в табличное поле 1С
Как вывести макет в табличное поле 1С: получение макета, заполнение параметров и областей, вывод в поле табличного документа на форме. Примеры кода и типичные ошибки.
Вывод макета в табличное поле — одна из базовых задач при разработке на платформе 1С:Предприятие. Под «табличным полем» в данном контексте обычно понимают элемент формы «Поле табличного документа» (в обычных формах — «ПолеТабличногоДокумента»), в который программно выводится табличный документ, построенный по заранее созданному макету. Такой подход используют для печатных форм, предпросмотра отчётов, произвольных таблиц с оформлением, которые неудобно строить через СКД.
Общая схема всегда одинакова: получить макет, получить из него нужные области, заполнить параметры, последовательно вывести области в табличный документ и отобразить результат в элементе формы. Ошибки чаще всего возникают из-за неверных имён областей, незаполненных параметров и путаницы между обычными и управляемыми формами.
Создание макета табличного документа
Макет создаётся в конфигураторе: у объекта (справочника, документа, отчёта, обработки) на закладке «Макеты» нажмите «Добавить» и выберите тип «Табличный документ». Для общего макета используйте ветку «Общие макеты» — тогда он будет доступен из любого места конфигурации.
Внутри макета выделите диапазон ячеек и создайте именованную область через меню «Таблица — Имена — Назначить имя» (или Ctrl+Shift+N). Практичная структура макета — области «Шапка», «Строка» и «Подвал»: шапка выводится один раз, область «Строка» — в цикле по данным, подвал — в конце. В ячейках, куда должны подставляться данные, укажите параметр: в свойствах ячейки установите «Заполнение» = «Параметр» и задайте имя параметра, например НоменклатураНаименование.
Добавление поля табличного документа на форму
В управляемой форме добавьте реквизит формы с типом «ТабличныйДокумент», например с именем РезультатДокумент. Затем перетащите этот реквизит в дерево элементов формы — платформа автоматически создаст поле вида «Поле табличного документа». Без реквизита формы элемент создать нельзя: поле отображает именно данные реквизита.
В обычной форме проще: добавьте элемент управления «Поле табличного документа» прямо на форму и задайте ему имя, например ТабДок. Обращение к нему в коде идёт через ЭлементыФормы.ТабДок, и вывод выполняется напрямую в этот элемент без промежуточного реквизита.
Полезные свойства поля, которые стоит настроить сразу: «ТолькоПросмотр» — чтобы пользователь не редактировал результат, «ОтображатьСетку» и «ОтображатьЗаголовки» — для управления видимостью сетки и заголовков строк/колонок, «Защита» — для запрета изменения содержимого.
Программный вывод макета: базовый код
Типовой фрагмент кода для управляемой формы обработки выглядит так: получаем макет, очищаем результирующий документ, выводим области. Метод Очистить() обязателен при повторном формировании, иначе новый вывод добавится ниже старого.
&НаСервере
Процедура СформироватьНаСервере()
РезультатДокумент.Очистить();
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.ПериодОтчета = Формат(ТекущаяДатаСеанса(), "ДЛФ=D");
РезультатДокумент.Вывести(ОбластьШапка);
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаДанных);
РезультатДокумента.Вывести(ОбластьСтрока);
КонецЦикла;
КонецПроцедуры
Метод Параметры.Заполнить() удобен, когда имена параметров в макете совпадают с именами колонок выборки или структуры: заполнение происходит автоматически по совпадению имён. Если параметр не заполнен, на месте ячейки выведется пустое значение или текст ошибки вида «<Параметр не найден>» — это зависит от настроек ячейки.
- 1Создайте макет типа «Табличный документ» и разметьте именованные области
- 2В ячейках задайте параметры заполнения
- 3Добавьте на форму реквизит типа ТабличныйДокумент и связанное поле
- 4В коде получите макет через ПолучитьМакет()
- 5Получите области, заполните параметры, выведите через Вывести()
- 6Проверьте результат на форме и повторное формирование без дублирования
Вывод в обычных формах и из внешних обработок
В обычных формах код компактнее, потому что вывод идёт напрямую в элемент формы. Получение макета зависит от контекста: в модуле объекта — ПолучитьМакет("ИмяМакета"), для общего макета — ПолучитьОбщийМакет("ИмяМакета"), во внешней обработке — ЭтотОбъект.ПолучитьМакет("ИмяМакета").
Процедура КнопкаСформироватьНажатие(Кнопка)
Макет = ПолучитьМакет("Макет");
ЭлементыФормы.ТабДок.Очистить();
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Организация = Организация;
ЭлементыФормы.ТабДок.Вывести(Область);
КонецПроцедуры
Частая ситуация во внешних обработках: макет лежит не в обработке, а в справочнике дополнительных отчётов и обработок или присоединён к объекту. В этом случае макет получают из двоичных данных через ПолучитьМакет() недоступен — придётся либо хранить макет в самой обработке, либо загружать табличный документ из файла методом Прочитать().
Заполнение параметров, областей и циклический вывод
Помимо простого вывода сверху вниз, табличный документ поддерживает присоединение областей справа методом Присоединить() — так строят матричные отчёты, где колонки формируются динамически (например, по месяцам или складам). При этом горизонтальные области в макете должны иметь одинаковую высоту с уже выведенными.
Для многострочных данных важен контроль разрыва страниц при последующей печати. Метод ПроверитьВывод() позволяет заранее узнать, поместится ли область на текущей странице, и при необходимости вывести горизонтальный разделитель страниц через ВывестиГоризонтальныйРазделительСтраниц(). Это избавляет от «оторванных» строк в конце листа.
Если данные берутся из запроса, удобно обходить выборку по группировкам: для каждой группировки выводится своя область («ГруппаТовары», «ГруппаСклад»), а детальные записи — областью «Строка». Имена параметров в макете должны точно совпадать с именами полей выборки, включая регистр букв, если используется Параметры.Заполнить(Выборка).
Перед массовым выводом строк полезно один раз получить область «Строка» до цикла и внутри цикла только заполнять параметры и выводить её. Получение области внутри цикла на каждой итерации заметно замедляет формирование больших документов.
Типичные ошибки и их диагностика
Самая частая ошибка — «Ошибка при вызове метода контекста (ПолучитьОбласть): Область не найдена». Причины: опечатка в имени области, область в макете создана как вертикальная, а запрашивается как горизонтальная, либо макет вообще другой (путают макет объекта и общий макет с похожим именем). Проверяйте имя области прямо в редакторе макета через «Таблица — Имена».
Вторая группа проблем — пустые ячейки вместо данных. Причины: параметр в макете назван иначе, чем в коде; у ячейки не установлено свойство «Заполнение — Параметр» (по умолчанию стоит «Текст», и содержимое воспринимается как литерал); параметр заполнен значением неподходящего типа без форматирования.
Третья типовая ситуация — при повторном нажатии кнопки «Сформировать» данные дублируются ниже. Это верный признак того, что забыли Очистить() перед выводом. Обратная проблема — поле на форме пустое при корректном коде: обычно вывод идёт в локальную переменную, а не в реквизит формы, связанный с полем.
Проверка результата и отладка
Быстрый способ отладить макет без запуска всей логики — вывести макет целиком: метод Вывести(Макет) без получения областей выведет макет как есть, и вы увидите структуру, имена параметров и оформление. Это помогает убедиться, что проблема в коде, а не в самом макете.
Для проверки заполнения параметров используйте отладчик: поставьте точку останова после Параметры.Заполнить() и посмотрите значения в табло. Если параметр равен Неопределено — имя не совпало с источником данных. Также полезно временно выводить имя параметра прямо в соседнюю ячейку макета, чтобы видеть, какие значения реально подставляются.
Как проверить результат
Документ отображается, области в правильном порядке
Поле пустое или данные удвоились
Подставлены значения из данных
Пустые ячейки или текст имени параметра
Документ пересоздаётся с нуля
Новый вывод добавляется ниже старого
Когда макет в табличное поле — не лучший выбор
Вывод через макет оправдан, когда нужно точное оформление: печатные формы, фиксированная структура, объединённые ячейки, рамки. Если задача — просто показать пользователю таблицу данных с возможностью отбора и сортировки, удобнее динамический список или таблица значений на форме: они дают интерактивность «из коробки».
Для аналитических отчётов с группировками, ресурсами и настройками пользователя правильнее использовать СКД — макет ручной сборки придётся переписывать под каждое новое требование. Макет же остаётся лучшим инструментом там, где важен пиксель-в-пиксель результат для печати.
Сравнение вариантов
Точное оформление, печатные формы; нет интерактивности, всё программируется вручную
Отбор и сортировка пользователем; ограниченные возможности оформления
Гибкие отчёты с настройками; избыточна для простых фиксированных форм
Что важно запомнить
Вывод макета в табличное поле строится по схеме: ПолучитьМакет → ПолучитьОбласть → заполнить Параметры → Вывести в реквизит формы типа ТабличныйДокумент. Не забывайте Очистить() перед формированием, сверяйте имена областей и параметров, а в управляемом приложении выполняйте вывод на сервере.
Частые вопросы
Почему поле табличного документа на форме остаётся пустым?
Чаще всего вывод выполнен в локальную переменную типа ТабличныйДокумент, а не в реквизит формы, к которому привязано поле. Проверьте, что методы Вывести() вызываются именно у реквизита формы, и что элемент формы действительно связан с этим реквизитом в свойстве «ПутьКДанным».
Как вывести макет не сверху вниз, а слева направо?
Используйте метод Присоединить() вместо Вывести() — он добавляет область справа от уже выведенных. В макете для этого готовят вертикальные области одинаковой высоты.
Можно ли изменить уже выведенную ячейку?
Да. После вывода обратитесь к области результирующего документа через Область("R1C1") или ПолучитьОбласть() и измените свойства Текст, ЦветФона, Шрифт и другие. Это удобно для условного оформления по итогам вывода.
Как запретить пользователю редактировать выведенный документ?
Установите у реквизита или элемента формы свойство ТолькоПросмотр в Истина, а для полного запрета изменений — свойство Защита у самого табличного документа. Дополнительно можно скрыть сетку и заголовки строк/колонок.
Чем отличается ПолучитьМакет() от ПолучитьОбщийМакет()?
ПолучитьМакет() вызывается у конкретного объекта (документа, обработки) и возвращает его собственный макет. ПолучитьОбщийМакет() — это глобальный метод для макетов из ветки «Общие макеты», доступный из любого модуля.
Почему вместо значения выводится имя параметра?
У ячейки макета не установлено свойство «Заполнение» в значение «Параметр» — платформа трактует содержимое как обычный текст. Откройте свойства ячейки в конфигураторе и измените тип заполнения.