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