При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда добавленные в расширение реквизиты справочников или документов ведут себя «невидимо» для стандартных механизмов конфигурации. Типичный пример: вы добавили новый реквизит в расширение для справочника Номенклатура, но при попытке отредактировать макет через интерфейс НСИ и Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм, этот реквизит отсутствует в списке доступных полей. Давайте разберем, почему это происходит и как решить данную задачу несколькими способами.
Основная причина кроется в архитектуре Библиотеки стандартных подсистем (БСП), на которой построены практически все современные конфигурации (ERP, КА, УТ, БП). Механизм пользовательского редактирования макетов работает с метаданными, которые регистрируются в специальных справочниках идентификаторов. Рассмотрим подробнее:
ИдентификаторыОбъектовМетаданных. Реквизиты, добавленные через расширения, регистрируются в другом справочнике — ИдентификаторыОбъектовРасширений.Рассмотрим по шагам основные варианты решения этой проблемы.
Это самый надежный и «чистый» способ. Внешняя печатная форма (дополнительная обработка) работает как независимый объект, который при выполнении запросов видит все доступные метаданные — и основной конфигурации, и всех подключенных расширений.
Проанализируем алгоритм действий:
СведенияОВнешнейОбработке).Преимущество этого метода в том, что вам не нужно менять логику работы стандартных команд печати, и вы полностью контролируете набор данных, передаваемый в макет.
Если вы хотите, чтобы печатная форма была частью системы, а не внешним файлом, следует перенести логику печати в само расширение. Рассмотрим, как это сделать правильно.
Для того чтобы система увидела новые поля, нам необходимо расширить метод, отвечающий за формирование структуры данных для печати. Обычно это происходит в модуле менеджера объекта. Выясним, какой метод отвечает за печать, и создадим его аналог в расширении.
Пример программного добавления полей в данные печати:
&ИзменениеИКонтроль("СформироватьДанныеДляПечати")
Процедура П_СформироватьДанныеДляПечати(ПараметрыПечати, ДанныеДляПечати)
// Здесь мы дополняем стандартный запрос БСП своими полями
// ТекстЗапроса = ...
// Выбираем наш реквизит: Справочник.Номенклатура.П_НовыйРеквизитИзРасширения
КонецПроцедуры
После того как данные будут программно переданы в структуру ДанныеДляПечати, вы сможете использовать их в макете, даже если визуальный конструктор их не показывает. Достаточно будет вручную вписать имя параметра в ячейку макета в формате [ИмяРеквизита].
Иногда проблема решается простым обновлением справочников, хранящих информацию о метаданных. Посмотрим, как это сделать:
/С ЗапуститьОбновлениеИнформационнойБазы.
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();
Разберем ситуацию: вы редактируете макет в пользовательском режиме, и списка полей справа нет. Однако механизм печати в БСП часто устроен так, что он собирает данные на основе тех параметров, которые найдены в макете.
Попробуйте следующий лайфхак:
П_ДополнительныйСрок).Важно: этот способ сработает только в том случае, если стандартный запрос формирования данных в программном коде 1С является «динамическим» (например, использует * или автоматически достраивается подсистемой печати на основе анализа макета). В большинстве современных конфигураций БСП именно так и работает.
Проанализировав все варианты, мы рекомендуем следующее:
Помните, что работа с расширениями требует внимательности к именованию. Всегда добавляйте уникальный префикс (например, П_) к своим реквизитам, чтобы избежать конфликтов с будущими обновлениями типовой конфигурации от поставщика. Это упростит поддержку и сделает ваш код более надежным.