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