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

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

Как вывести макет на форму 1С

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

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

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

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

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

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

Внутри макета разметьте области: выделите строки или диапазон ячеек, нажмите правой кнопкой и выберите «Именованные области → Создать». Области бывают строковыми (по строкам) и колоночными (по колонкам); для вывода чаще используют строковые. Типичный набор областей: «Шапка», «Строка», «Подвал».

Ячейки, в которые нужно подставлять данные, оформите как параметры: в свойствах ячейки установите «Заполнение» = «Параметр» и задайте имя параметра, например «Номенклатура» или «Сумма». Если в ячейке нужен статичный текст с подстановкой, используйте шаблон: «Заполнение» = «Шаблон», а в тексте укажите параметр в квадратных скобках — [Контрагент].

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

Откройте форму объекта в конфигураторе. В правой панели «Реквизиты» добавьте новый реквизит формы, например «Результат», и установите тип «ТабличныйДокумент». Этот реквизит станет хранилищем, в которое программно будет помещен сформированный документ.

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

Если табличный документ должен быть доступен только для чтения (обычный случай для печатных форм и предпросмотра), установите у элемента «ТолькоПросмотр» = Истина либо управляйте этим программно. Это защитит сформированный макет от случайного редактирования пользователем.

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

Программный вывод макета в управляемой форме

Основной сценарий — формирование документа в серверной процедуре и запись его в реквизит формы. Макет получают методом ПолучитьМакет("ИмяМакета") у объекта (в модуле менеджера объекта или через Документы.Имя.ПолучитьМакет) либо через ПолучитьОбщийМакет() для общих макетов. Затем из макета извлекают области методом ПолучитьОбласть("ИмяОбласти") и выводят их в табличный документ методом Вывести().

&НаСервере

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

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

Результат.Очистить();

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

ОбластьШапка.Параметры.НомерДокумента = Объект.Номер;

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

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

Для Каждого СтрокаТовара Из Объект.Товары Цикл

ОбластьСтрока.Параметры.Номенклатура = СтрокаТовара.Номенклатура;

ОбластьСтрока.Параметры.Количество = СтрокаТовара.Количество;

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

КонецЦикла;

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

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

Для горизонтального присоединения областей используйте метод Присоединить() вместо Вывести(), а для проверки помещения на страницу при печати — ПроверитьВывод() и ПроверитьПрисоединение(). Эти методы важны, если макет дальше пойдет на печать с разрывами страниц.

1c
Макет = ПолучитьОбщийМакет("МакетОтчета");
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Заголовок = "Список товаров";
Результат.Вывести(Область);

Вывод макета в обычной форме

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

Программный вывод в обычной форме аналогичен управляемой, но без ограничений клиент-серверного взаимодействия: получить макет и вывести области можно прямо в модуле формы в любом контексте. Реквизит формы типа «ТабличныйДокумент» также используется как источник данных поля.

Если вы переносите решение с обычного приложения на управляемое, учтите: прямая привязка макета к полю исчезает, и весь статический вывод придется заменить программным формированием на сервере.

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

Привязка макета к полю (обычная форма)

Быстро и без кода, но только статичное содержимое; недоступно в управляемом приложении.

Программный вывод областей

Универсальный способ для обоих типов форм; позволяет подставлять параметры и строить документ динамически, но требует серверного кода.

СКД с макетом

Подходит для отчетов со сложной структурой и группировками; избыточен для простой печатной формы.

Работа с параметрами, шаблонами и расшифровкой

Параметры области заполняются до вывода области в табличный документ: Область.Параметры.ИмяПараметра = Значение. Если параметр не заполнен, в документе останется пустая ячейка — платформа ошибку не выдаст, поэтому незаполненные параметры легко пропустить при тестировании.

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

Если нужно вывести один и тот же макет несколькими экземплярами (например, печать нескольких документов), формируйте каждый экземпляр в отдельный табличный документ и объединяйте через Вывести(), не забывая про разрывы страниц методом ВывестиГоризонтальныйРазделительСтраниц().

Проверка результата и типичные ошибки

После внедрения откройте форму в режиме предприятия и проверьте: документ отображается в поле, параметры подставлены, области идут в правильном порядке, при изменении данных документ можно пересформировать. Полезно добавить на форму команду «Сформировать», которая заново очищает реквизит и выводит макет — это упрощает отладку.

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

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

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

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

Содержимое поля на форме
Норма

Табличный документ отображается с заполненными параметрами

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

Поле пустое или показывает старые данные

Повторное формирование
Норма

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

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

Области добавляются к предыдущему результату

Клик по ячейке с расшифровкой
Норма

Открывается связанный объект

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

Ничего не происходит или ошибка обработчика

FAQ

Можно ли вывести макет на форму без программирования?

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

Почему макет формируется, но на форме его не видно?

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

Как вывести в макет картинку или штрихкод?

Для картинки добавьте в макет ячейку с типом «Картинка» и присвойте параметру значение типа Картинка, полученное из хранилища или файла. Штрихкод выводится через специальный элемент управления или компоненту печати штрихкодов, вставляемую в область перед выводом.

Чем вывод макета через СКД отличается от ручного вывода областей?

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

Как обновить макет на форме при изменении данных?

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

Можно ли вывести один макет на несколько форм?

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

Итог

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

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