Почему реквизит из расширения не отображается в макете печатной формы и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда добавленные в расширение реквизиты справочников или документов ведут себя «невидимо» для стандартных механизмов конфигурации. Типичный пример: вы добавили новый реквизит в расширение для справочника Номенклатура, но при попытке отредактировать макет через интерфейс НСИ и Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм, этот реквизит отсутствует в списке доступных полей. Давайте разберем, почему это происходит и как решить данную задачу несколькими способами.

Выясним причину проблемы

Основная причина кроется в архитектуре Библиотеки стандартных подсистем (БСП), на которой построены практически все современные конфигурации (ERP, КА, УТ, БП). Механизм пользовательского редактирования макетов работает с метаданными, которые регистрируются в специальных справочниках идентификаторов. Рассмотрим подробнее:

  1. Идентификаторы объектов метаданных: Стандартные механизмы печати часто обращаются к справочнику ИдентификаторыОбъектовМетаданных. Реквизиты, добавленные через расширения, регистрируются в другом справочнике — ИдентификаторыОбъектовРасширений.
  2. Контекст выполнения: Программный код, формирующий список доступных полей в пользовательском конструкторе, может выполняться в контексте основной конфигурации, которая «не догадывается» о существовании полей в расширении, если не реализованы специфические вызовы.
  3. Обновление кэша: Даже если система поддерживает работу с расширениями, иногда требуется принудительное обновление справочников идентификаторов и кэша метаданных.

Рассмотрим по шагам основные варианты решения этой проблемы.

Решение 1. Использование внешней печатной формы (ВПФ)

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

Проанализируем алгоритм действий:

  1. Создайте новую внешнюю обработку.
  2. В модуле объекта реализуйте стандартный интерфейс БСП для внешних печатных форм (процедура СведенияОВнешнейОбработке).
  3. В запросе для формирования данных печати вы сможете напрямую обратиться к вашему реквизиту из расширения.
  4. Загрузите обработку через НСИ и Администрирование — Дополнительные отчеты и обработки.

Преимущество этого метода в том, что вам не нужно менять логику работы стандартных команд печати, и вы полностью контролируете набор данных, передаваемый в макет.

Решение 2. Создание макета и логики печати внутри расширения

Если вы хотите, чтобы печатная форма была частью системы, а не внешним файлом, следует перенести логику печати в само расширение. Рассмотрим, как это сделать правильно.

Для того чтобы система увидела новые поля, нам необходимо расширить метод, отвечающий за формирование структуры данных для печати. Обычно это происходит в модуле менеджера объекта. Выясним, какой метод отвечает за печать, и создадим его аналог в расширении.

Пример программного добавления полей в данные печати:


&ИзменениеИКонтроль("СформироватьДанныеДляПечати")
Процедура П_СформироватьДанныеДляПечати(ПараметрыПечати, ДанныеДляПечати)
    // Здесь мы дополняем стандартный запрос БСП своими полями
    // ТекстЗапроса = ... 
    // Выбираем наш реквизит: Справочник.Номенклатура.П_НовыйРеквизитИзРасширения
КонецПроцедуры

После того как данные будут программно переданы в структуру ДанныеДляПечати, вы сможете использовать их в макете, даже если визуальный конструктор их не показывает. Достаточно будет вручную вписать имя параметра в ячейку макета в формате [ИмяРеквизита].

Решение 3. Принудительное обновление идентификаторов

Иногда проблема решается простым обновлением справочников, хранящих информацию о метаданных. Посмотрим, как это сделать:

  1. Запустите информационную базу с параметром /С ЗапуститьОбновлениеИнформационнойБазы.
  2. Либо воспользуйтесь консолью кода или обработкой «Инструменты разработчика», чтобы вызвать метод обновления идентификаторов: Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();
  3. Убедитесь, что в расширении у справочника НЕ установлена галочка «Используется только в расширении», если вы планируете обращаться к нему извне.

Решение 4. Ручной ввод параметров в макет

Разберем ситуацию: вы редактируете макет в пользовательском режиме, и списка полей справа нет. Однако механизм печати в БСП часто устроен так, что он собирает данные на основе тех параметров, которые найдены в макете.

Попробуйте следующий лайфхак:

  1. Откройте макет для редактирования.
  2. В нужной ячейке выберите тип Параметр.
  3. В поле «Параметр» впишите точное имя вашего реквизита из расширения (например, П_ДополнительныйСрок).
  4. Сохраните макет.

Важно: этот способ сработает только в том случае, если стандартный запрос формирования данных в программном коде 1С является «динамическим» (например, использует * или автоматически достраивается подсистемой печати на основе анализа макета). В большинстве современных конфигураций БСП именно так и работает.

Рекомендации по выбору решения

Проанализировав все варианты, мы рекомендуем следующее:

Помните, что работа с расширениями требует внимательности к именованию. Всегда добавляйте уникальный префикс (например, П_) к своим реквизитам, чтобы избежать конфликтов с будущими обновлениями типовой конфигурации от поставщика. Это упростит поддержку и сделает ваш код более надежным.

← На главную