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