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

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

Как программно создать макет в 1С

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

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

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

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

Что такое макет и какие его виды существуют

Макет в 1С — это объект метаданных, хранящий шаблон вывода. Платформа поддерживает несколько типов макетов: табличный документ, схема компоновки данных, макет оформления компоновки, HTML-документ, текстовый документ, географическая схема и другие. На практике чаще всего встречаются два: табличный документ и схема компоновки данных.

Макет табличного документа состоит из именованных областей — строк, колонок или прямоугольных диапазонов ячеек. Внутри ячеек размещаются шаблоны с параметрами в квадратных скобках, например [Номенклатура]. Программно разработчик получает область, заполняет её параметры и выводит в результирующий табличный документ.

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

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

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

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

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

Порядок создания макета в конфигураторе
  1. 1
    Откройте объект конфигурации, закладка «Макеты», нажмите «Добавить»
  2. 2
    Выберите тип «Табличный документ», задайте имя макета
  3. 3
    Нарисуйте структуру: шапку, строку данных, подвал
  4. 4
    Выделите диапазоны и назначьте имена областей
  5. 5
    В ячейках задайте параметры [ИмяПараметра] и тип заполнения
  6. 6
    Настройте поля, ориентацию и повторяющиеся строки шапки

Программное заполнение и вывод макета

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

ТабДок = Новый ТабличныйДокумент;

Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("МакетПечати");

// Шапка

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

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

ОбластьШапка.Параметры.Контрагент = Ссылка.Контрагент;

ТабДок.Вывести(ОбластьШапка);

// Строки табличной части

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

Для Каждого СтрокаТЧ Из Ссылка.Товары Цикл

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

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

КонецЦикла;

Метод Параметры.Заполнить() удобен тем, что автоматически переносит значения из строки табличной части или структуры в одноимённые параметры области. Если имя параметра в макете не совпадает с именем поля данных, значение присваивается явно через точку: Область.Параметры.ИмяПараметра = Значение;.

Для вывода областей горизонтально (например, при формировании кросс-таблиц) используется Присоединить() вместо Вывести(). Перед выводом очередной секции полезно проверять, поместится ли она на странице, методом ПроверитьВывод(), и при необходимости выводить горизонтальный разделитель страниц.

1c
Если Не ТабДок.ПроверитьВывод(ОбластьСтрока) Тогда ТабДок.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; ТабДок.Вывести(ОбластьСтрока);

Полностью программное создание табличного документа без макета

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

ТабДок = Новый ТабличныйДокумент;

НомерСтроки = 1;

Для Каждого СтрокаДанных Из РезультатЗапроса Цикл

ТабДок.Область(НомерСтроки, 1).Текст = СтрокаДанных.Наименование;

ТабДок.Область(НомерСтроки, 2).Текст = Формат(СтрокаДанных.Сумма, "ЧДЦ=2");

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

// Оформление шапки

ОбластьЗаголовка = ТабДок.Область(1, 1, 1, 2);

ОбластьЗаголовка.Шрифт = Новый Шрифт(, , Истина);

ОбластьЗаголовка.Границы = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);

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

Готовый табличный документ можно показать пользователю (ТабДок.Показать()), напечатать, сохранить в файл Excel или PDF методом Записать() с указанием типа файла, либо вернуть из серверной функции в виде адреса временного хранилища для отображения в управляемой форме.

Макет на основе схемы компоновки данных

Для отчётов с отборами, группировками и итогами макетом служит схема компоновки данных. Она создаётся в том же конструкторе макетов — выбирается тип «Схема компоновки данных». В редакторе СКД на закладке «Наборы данных» пишется запрос, на закладке «Настройки» задаются группировки, выбранные поля и отборы по умолчанию.

Программно отчёт на СКД формируется через компоновщик макета и процессор компоновки:

СхемаКомпоновки = Отчеты.ПродажиПоМесяцам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ТабДок = Новый ТабличныйДокумент;

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(ТабДок);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Здесь важно не путать два разных объекта: «макет» в терминах СКД — это результат работы компоновщика макета (промежуточное описание структуры вывода), а не макет в конфигураторе. Если нужно изменить оформление отдельных элементов отчёта, дополнительно создаётся макет оформления компоновки данных, где переопределяются области заголовков, ресурсов и итогов.

Сравнение подходов

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

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

СКД

Отчёты с отборами, группировками, настройками пользователя. Больше порог входа, но минимум кода вывода.

Полностью программный вывод

Динамическая структура, служебные выгрузки. Максимум гибкости, но вся логика и оформление — в коде.

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

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

Типичные ошибки
01
Опечатка в имени области или параметра — платформа выдаёт ошибку «Область не найдена» либо параметр остаётся пустым; сверяйте имена в макете посимвольно
02
Вывод области без заполнения параметров — в документе появляются пустые строки или текст шаблона в квадратных скобках
03
Игнорирование ПроверитьВывод() — шапка таблицы оказывается на одной странице, а строки на следующей
04
Смешение Вывести() и Присоединить() без понимания направления — структура документа «разъезжается»
05
Изменение макета без обновления конфигурации базы данных — код работает со старой версией макета
Контрольные точки

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

Заполнение параметров
Норма

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

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

Пустые ячейки или текст [ИмяПараметра] в выведенном документе

Имена областей
Норма

Код выполняется без исключений

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

Ошибка «Область не найдена» при ПолучитьОбласть()

Разбиение на страницы
Норма

Шапка и строки не разрываются неожиданно

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

Одиночная строка или подвал на отдельной странице

Итоговые суммы
Норма

Итоги совпадают с запросом или табличной частью

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

Расхождения — признак пропущенных строк или дублирования вывода

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

Как вывести макет в Excel или PDF?

Используйте метод табличного документа Записать() с указанием типа файла: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX) или PDF. Предварительно убедитесь, что у документа заданы корректные параметры страницы, иначе при экспорте в PDF разбиение может отличаться от экранного вида.

Можно ли получить макет из общего макета, а не из объекта?

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

Как передать в параметр области картинку?

Ячейке макета задаётся тип заполнения «Параметр» и свойство «Картинка». В коде параметру присваивается объект типа Картинка, например полученный из двоичных данных хранилища: Область.Параметры.Логотип = Новый Картинка(ДвоичныеДанные).

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

Чаще всего имя параметра в макете не совпадает с именем в коде с учётом регистра и русских/латинских букв, либо у ячейки не установлено свойство «Заполнение — Параметр». Откройте свойства ячейки в макете и сверьте оба имени посимвольно.

Как повторять шапку таблицы на каждой странице?

В свойствах результирующего табличного документа задайте ПовторятьПриПечатиСтроки через соответствующее свойство или метод, указав область шапки. Альтернатива — при использовании СКД повторение заголовков настраивается в настройках группировки автоматически.

Итог

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

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