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