К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как вывести макет в табличное поле 1С

Как вывести макет в табличное поле 1С: получение макета, заполнение параметров и областей, вывод в поле табличного документа на форме. Примеры кода и типичные ошибки.

Вывод макета в табличное поле — одна из базовых задач при разработке на платформе 1С:Предприятие. Под «табличным полем» в данном контексте обычно понимают элемент формы «Поле табличного документа» (в обычных формах — «ПолеТабличногоДокумента»), в который программно выводится табличный документ, построенный по заранее созданному макету. Такой подход используют для печатных форм, предпросмотра отчётов, произвольных таблиц с оформлением, которые неудобно строить через СКД.

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

Создание макета табличного документа

Макет создаётся в конфигураторе: у объекта (справочника, документа, отчёта, обработки) на закладке «Макеты» нажмите «Добавить» и выберите тип «Табличный документ». Для общего макета используйте ветку «Общие макеты» — тогда он будет доступен из любого места конфигурации.

Внутри макета выделите диапазон ячеек и создайте именованную область через меню «Таблица — Имена — Назначить имя» (или Ctrl+Shift+N). Практичная структура макета — области «Шапка», «Строка» и «Подвал»: шапка выводится один раз, область «Строка» — в цикле по данным, подвал — в конце. В ячейках, куда должны подставляться данные, укажите параметр: в свойствах ячейки установите «Заполнение» = «Параметр» и задайте имя параметра, например НоменклатураНаименование.

Добавление поля табличного документа на форму

В управляемой форме добавьте реквизит формы с типом «ТабличныйДокумент», например с именем РезультатДокумент. Затем перетащите этот реквизит в дерево элементов формы — платформа автоматически создаст поле вида «Поле табличного документа». Без реквизита формы элемент создать нельзя: поле отображает именно данные реквизита.

В обычной форме проще: добавьте элемент управления «Поле табличного документа» прямо на форму и задайте ему имя, например ТабДок. Обращение к нему в коде идёт через ЭлементыФормы.ТабДок, и вывод выполняется напрямую в этот элемент без промежуточного реквизита.

Полезные свойства поля, которые стоит настроить сразу: «ТолькоПросмотр» — чтобы пользователь не редактировал результат, «ОтображатьСетку» и «ОтображатьЗаголовки» — для управления видимостью сетки и заголовков строк/колонок, «Защита» — для запрета изменения содержимого.

Программный вывод макета: базовый код

Типовой фрагмент кода для управляемой формы обработки выглядит так: получаем макет, очищаем результирующий документ, выводим области. Метод Очистить() обязателен при повторном формировании, иначе новый вывод добавится ниже старого.

&НаСервере

Процедура СформироватьНаСервере()

РезультатДокумент.Очистить();

Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ОбластьШапка.Параметры.ПериодОтчета = Формат(ТекущаяДатаСеанса(), "ДЛФ=D");

РезультатДокумент.Вывести(ОбластьШапка);

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

Для Каждого СтрокаДанных Из ТаблицаДанных Цикл

ОбластьСтрока.Параметры.Заполнить(СтрокаДанных);

РезультатДокумента.Вывести(ОбластьСтрока);

КонецЦикла;

КонецПроцедуры

Метод Параметры.Заполнить() удобен, когда имена параметров в макете совпадают с именами колонок выборки или структуры: заполнение происходит автоматически по совпадению имён. Если параметр не заполнен, на месте ячейки выведется пустое значение или текст ошибки вида «<Параметр не найден>» — это зависит от настроек ячейки.

Порядок действий
  1. 1
    Создайте макет типа «Табличный документ» и разметьте именованные области
  2. 2
    В ячейках задайте параметры заполнения
  3. 3
    Добавьте на форму реквизит типа ТабличныйДокумент и связанное поле
  4. 4
    В коде получите макет через ПолучитьМакет()
  5. 5
    Получите области, заполните параметры, выведите через Вывести()
  6. 6
    Проверьте результат на форме и повторное формирование без дублирования

Вывод в обычных формах и из внешних обработок

В обычных формах код компактнее, потому что вывод идёт напрямую в элемент формы. Получение макета зависит от контекста: в модуле объекта — ПолучитьМакет("ИмяМакета"), для общего макета — ПолучитьОбщийМакет("ИмяМакета"), во внешней обработке — ЭтотОбъект.ПолучитьМакет("ИмяМакета").

Процедура КнопкаСформироватьНажатие(Кнопка)

Макет = ПолучитьМакет("Макет");

ЭлементыФормы.ТабДок.Очистить();

Область = Макет.ПолучитьОбласть("Шапка");

Область.Параметры.Организация = Организация;

ЭлементыФормы.ТабДок.Вывести(Область);

КонецПроцедуры

Частая ситуация во внешних обработках: макет лежит не в обработке, а в справочнике дополнительных отчётов и обработок или присоединён к объекту. В этом случае макет получают из двоичных данных через ПолучитьМакет() недоступен — придётся либо хранить макет в самой обработке, либо загружать табличный документ из файла методом Прочитать().

Заполнение параметров, областей и циклический вывод

Помимо простого вывода сверху вниз, табличный документ поддерживает присоединение областей справа методом Присоединить() — так строят матричные отчёты, где колонки формируются динамически (например, по месяцам или складам). При этом горизонтальные области в макете должны иметь одинаковую высоту с уже выведенными.

Для многострочных данных важен контроль разрыва страниц при последующей печати. Метод ПроверитьВывод() позволяет заранее узнать, поместится ли область на текущей странице, и при необходимости вывести горизонтальный разделитель страниц через ВывестиГоризонтальныйРазделительСтраниц(). Это избавляет от «оторванных» строк в конце листа.

Если данные берутся из запроса, удобно обходить выборку по группировкам: для каждой группировки выводится своя область («ГруппаТовары», «ГруппаСклад»), а детальные записи — областью «Строка». Имена параметров в макете должны точно совпадать с именами полей выборки, включая регистр букв, если используется Параметры.Заполнить(Выборка).

Перед массовым выводом строк полезно один раз получить область «Строка» до цикла и внутри цикла только заполнять параметры и выводить её. Получение области внутри цикла на каждой итерации заметно замедляет формирование больших документов.
ПЗ
Практическое замечание

Типичные ошибки и их диагностика

Самая частая ошибка — «Ошибка при вызове метода контекста (ПолучитьОбласть): Область не найдена». Причины: опечатка в имени области, область в макете создана как вертикальная, а запрашивается как горизонтальная, либо макет вообще другой (путают макет объекта и общий макет с похожим именем). Проверяйте имя области прямо в редакторе макета через «Таблица — Имена».

Вторая группа проблем — пустые ячейки вместо данных. Причины: параметр в макете назван иначе, чем в коде; у ячейки не установлено свойство «Заполнение — Параметр» (по умолчанию стоит «Текст», и содержимое воспринимается как литерал); параметр заполнен значением неподходящего типа без форматирования.

Третья типовая ситуация — при повторном нажатии кнопки «Сформировать» данные дублируются ниже. Это верный признак того, что забыли Очистить() перед выводом. Обратная проблема — поле на форме пустое при корректном коде: обычно вывод идёт в локальную переменную, а не в реквизит формы, связанный с полем.

Типичные ошибки
01
Вывод в локальный ТабличныйДокумент вместо реквизита формы — поле на форме остаётся пустым
02
Пропуск Очистить() перед формированием — результат дублируется при повторном запуске
03
Опечатка в имени области или параметра — исключение или пустые ячейки
04
Получение макета на клиенте в управляемом приложении — ошибка вызова метода
05
Заполнение параметров после вывода области — изменения не попадают в документ

Проверка результата и отладка

Быстрый способ отладить макет без запуска всей логики — вывести макет целиком: метод Вывести(Макет) без получения областей выведет макет как есть, и вы увидите структуру, имена параметров и оформление. Это помогает убедиться, что проблема в коде, а не в самом макете.

Для проверки заполнения параметров используйте отладчик: поставьте точку останова после Параметры.Заполнить() и посмотрите значения в табло. Если параметр равен Неопределено — имя не совпало с источником данных. Также полезно временно выводить имя параметра прямо в соседнюю ячейку макета, чтобы видеть, какие значения реально подставляются.

Контрольные точки

Как проверить результат

Поле на форме после формирования
Норма

Документ отображается, области в правильном порядке

Тревожный признак

Поле пустое или данные удвоились

Ячейки с параметрами
Норма

Подставлены значения из данных

Тревожный признак

Пустые ячейки или текст имени параметра

Повторное нажатие «Сформировать»
Норма

Документ пересоздаётся с нуля

Тревожный признак

Новый вывод добавляется ниже старого

Когда макет в табличное поле — не лучший выбор

Вывод через макет оправдан, когда нужно точное оформление: печатные формы, фиксированная структура, объединённые ячейки, рамки. Если задача — просто показать пользователю таблицу данных с возможностью отбора и сортировки, удобнее динамический список или таблица значений на форме: они дают интерактивность «из коробки».

Для аналитических отчётов с группировками, ресурсами и настройками пользователя правильнее использовать СКД — макет ручной сборки придётся переписывать под каждое новое требование. Макет же остаётся лучшим инструментом там, где важен пиксель-в-пиксель результат для печати.

Сравнение вариантов

Макет + поле табличного документа

Точное оформление, печатные формы; нет интерактивности, всё программируется вручную

Динамический список

Отбор и сортировка пользователем; ограниченные возможности оформления

СКД

Гибкие отчёты с настройками; избыточна для простых фиксированных форм

Итог

Что важно запомнить

Вывод макета в табличное поле строится по схеме: ПолучитьМакет → ПолучитьОбласть → заполнить Параметры → Вывести в реквизит формы типа ТабличныйДокумент. Не забывайте Очистить() перед формированием, сверяйте имена областей и параметров, а в управляемом приложении выполняйте вывод на сервере.

Частые вопросы

Почему поле табличного документа на форме остаётся пустым?

Чаще всего вывод выполнен в локальную переменную типа ТабличныйДокумент, а не в реквизит формы, к которому привязано поле. Проверьте, что методы Вывести() вызываются именно у реквизита формы, и что элемент формы действительно связан с этим реквизитом в свойстве «ПутьКДанным».

Как вывести макет не сверху вниз, а слева направо?

Используйте метод Присоединить() вместо Вывести() — он добавляет область справа от уже выведенных. В макете для этого готовят вертикальные области одинаковой высоты.

Можно ли изменить уже выведенную ячейку?

Да. После вывода обратитесь к области результирующего документа через Область("R1C1") или ПолучитьОбласть() и измените свойства Текст, ЦветФона, Шрифт и другие. Это удобно для условного оформления по итогам вывода.

Как запретить пользователю редактировать выведенный документ?

Установите у реквизита или элемента формы свойство ТолькоПросмотр в Истина, а для полного запрета изменений — свойство Защита у самого табличного документа. Дополнительно можно скрыть сетку и заголовки строк/колонок.

Чем отличается ПолучитьМакет() от ПолучитьОбщийМакет()?

ПолучитьМакет() вызывается у конкретного объекта (документа, обработки) и возвращает его собственный макет. ПолучитьОбщийМакет() — это глобальный метод для макетов из ветки «Общие макеты», доступный из любого модуля.

Почему вместо значения выводится имя параметра?

У ячейки макета не установлено свойство «Заполнение» в значение «Параметр» — платформа трактует содержимое как обычный текст. Откройте свойства ячейки в конфигураторе и измените тип заполнения.