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

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

Как получить макет справочника в 1С

Как получить макет справочника в 1С через ПолучитьМакет, общие макеты и табличные документы. Примеры кода, ошибки и проверка результата.

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

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

Ниже разобраны все рабочие способы: получение макета, созданного непосредственно в справочнике, обращение к общим макетам, вывод данных в табличный документ, а также типичные ошибки, из-за которых метод возвращает ошибку «Макет не найден».

Что такое макет справочника и где он хранится

Макет — это объект конфигурации, который описывает структуру будущего документа или отчёта. В справочнике макеты создаются на закладке «Макеты» в конфигураторе и могут иметь типы: табличный документ, текстовый документ, схема компоновки данных, HTML-документ, географическая схема, двоичные данные, ActiveDocument и другие.

Макеты бывают двух уровней. Первый — макеты, привязанные к конкретному объекту метаданных, например макет «Печать» внутри справочника «Контрагенты». Второй — общие макеты, доступные всей конфигурации через ветку «Общие → Общие макеты». Способ получения в коде отличается, поэтому перед написанием вызова уточните, где именно создан макет.

Как создать макет в конфигураторе перед получением

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

В редакторе табличного документа разметьте области: выделите строки и задайте имя области через меню «Таблица → Имена → Назначить имя». Ячейки, в которые будут подставляться данные, оформите как параметры: в свойствах ячейки установите «Заполнение — Параметр» и укажите имя параметра, например НаименованиеОрганизации.

Проверьте, что имя макета в метаданных совпадает с тем, что вы будете указывать в коде. Регистр букв значения не имеет, но лишние пробелы или опечатки приведут к ошибке «Макет не найден» уже на этапе выполнения.

Создание макета справочника
  1. 1
    Откройте справочник в конфигураторе, закладка «Макеты»
  2. 2
    Нажмите «Добавить» и выберите тип «Табличный документ»
  3. 3
    Задайте имя макета, например «ПечатьКарточки»
  4. 4
    Разметьте области и назначьте имена строкам
  5. 5
    В ячейках-параметрах установите заполнение «Параметр»
  6. 6
    Обновите конфигурацию базы данных (F7)

Получение макета справочника через ПолучитьМакет

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

Макет = Справочники.Контрагенты.ПолучитьМакет("ПечатьКарточки");

// Макет — объект типа ТабличныйДокумент

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

ОбластьШапка.Параметры.НаименованиеОрганизации = Контрагент.Наименование;

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

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

ТабДок.Показать("Карточка контрагента");

Обратите внимание: ПолучитьМакет() вызывается у менеджера справочника (Справочники.Контрагенты), а не у конкретной ссылки или объекта элемента. У объекта элемента такого метода нет — это частая причина путаницы у начинающих разработчиков.

Если код выполняется на сервере (в модуле менеджера, общем модуле с признаком «Сервер»), метод работает без ограничений. В тонком и веб-клиенте получение макета на клиенте невозможно — вызывайте серверную процедуру и передавайте результат как табличный документ или адрес во временном хранилище.

Получение общего макета конфигурации

Если макет создан не в справочнике, а в ветке «Общие → Общие макеты», используется глобальный метод ПолучитьОбщийМакет(). Это удобно, когда один шаблон обслуживает несколько объектов — например, единый бланк организации для печати карточек разных справочников.

Макет = ПолучитьОбщийМакет("БланкОрганизации");

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

ОбластьПодвал.Параметры.ИНН = Контрагент.ИНН;

Разница в вызове принципиальна: ПолучитьМакет требует указания менеджера объекта, а ПолучитьОбщийМакет вызывается без контекста. Если перепутать способы — запросить общий макет через менеджер справочника или наоборот — система сообщит, что макет не найден, хотя в конфигураторе он существует.

Сравнение вариантов

ПолучитьМакет менеджера справочника

Подходит для макетов, созданных внутри конкретного справочника. Логично для печатных форм, относящихся только к этому объекту.

ПолучитьОбщийМакет

Подходит для шаблонов, используемых несколькими объектами конфигурации. Требует создания макета в ветке «Общие макеты».

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

Подходит для отчётов: макет типа СКД получают тем же ПолучитьМакет, но дальше работают через компоновщик, а не области.

Заполнение макета данными элементов справочника

Типовая задача — вывести список элементов справочника в табличный документ. Для этого в макете готовят области «Шапка», «Строка» и «Подвал», затем в цикле по выборке заполняют строковую область параметрами каждого элемента.

Макет = Справочники.Номенклатура.ПолучитьМакет("ПрайсЛист");

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

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

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

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

Выборка = Справочники.Номенклатура.Выбрать();

Пока Выборка.Следующий() Цикл

Если Выборка.ЭтоГруппа Тогда

Продолжить;

КонецЕсли;

ОбластьСтрока.Параметры.Наименование = Выборка.Наименование;

ОбластьСтрока.Параметры.Артикул = Выборка.Артикул;

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

КонецЦикла;

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

Если нужно вывести не все элементы, а отобранные, используйте запрос вместо метода Выбрать() — это быстрее и позволяет задать условия, сортировку и соединения с другими таблицами.

Перед выводом большого табличного документа проверяйте методом ТабДок.ПроверитьПрисоединение(), поместятся ли присоединяемые области на страницу, и используйте ВывестиГоризонтальныйРазделительСтраниц для аккуратной печати.
ПЗ
Практическое замечание

Типичные ошибки и их диагностика

Самая частая ошибка — «Макет не найден». Причины три: макет создан в другом месте (общий вместо макета справочника), опечатка в имени, либо конфигурация базы данных не обновлена после добавления макета. Проверяйте в указанном порядке — чаще всего виновато именно отсутствие обновления конфигурации БД.

Вторая группа ошибок — обращение к несуществующей области или параметру. Если ПолучитьОбласть("Строка") возвращает ошибку, откройте макет и убедитесь, что область с таким именем действительно создана и назначена именно строкам, а не ячейке. Имена областей и параметров чувствительны к точному написанию.

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

Типичные ошибки
01
Вызов ПолучитьМакет у ссылки или объекта элемента вместо менеджера справочника — метод недоступен
02
Получение макета на клиенте в управляемой форме — ошибка контекста, переносите код на сервер
03
Забытое обновление конфигурации БД после добавления макета — ошибка «Макет не найден»
04
Заполнение параметра, которого нет в макете — значение молча не подставляется или возникает ошибка
05
Получение области внутри цикла по выборке — лишние обращения и замедление на больших данных

Проверка результата и ограничения

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

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

Контрольные точки

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

Макет получен без ошибки
Норма

Переменная содержит объект нужного типа (ТабличныйДокумент)

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

Ошибка «Макет не найден» — проверьте имя и обновление конфигурации

Области выводятся
Норма

В итоговом документе видны шапка, строки, подвал

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

Пустой документ — параметры не заполнены или области не выведены

Параметры подставлены
Норма

В ячейках реальные значения из справочника

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

Пустые ячейки — имя параметра в коде не совпадает с макетом

FAQ

Можно ли получить макет справочника из внешней обработки?

Да. Во внешней обработке доступны те же методы: Справочники.ИмяСправочника.ПолучитьМакет("Имя") и ПолучитьОбщийМакет("Имя"). Кроме того, у самой обработки могут быть собственные макеты, которые получают через ЭтотОбъект.ПолучитьМакет("Имя") или ПолучитьМакет в модуле объекта обработки.

Как получить макет типа «Схема компоновки данных»?

Тем же методом ПолучитьМакет — он вернёт объект типа СхемаКомпоновкиДанных. Дальше схему передают в компоновщик макета, настраивают параметры и выводят результат через процессор вывода в табличный документ. Получать области из СКД напрямую нельзя.

Почему ПолучитьМакет возвращает «Макет не найден», хотя макет есть в конфигураторе?

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

Можно ли изменить макет программно, без конфигуратора?

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

Как сохранить полученный и заполненный макет в файл?

Итоговый табличный документ сохраняется методом ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Поддерживаются форматы MXL, XLSX, PDF, HTML и другие. На сервере файл пишется во временный каталог, затем передаётся клиенту через временное хранилище.

Итог

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

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