При работе с 1С:Управление нашей фирмой (УНФ) часто возникает ситуация, когда типового функционала недостаточно, и мы добавляем новые реквизиты в документы через расширения. Однако при попытке вывести эти данные во внешнюю печатную форму (ВПФ) после обновления конфигурации разработчики часто сталкиваются с ошибкой Поле объекта не обнаружено. Рассмотрим детально, почему это происходит и как правильно пробросить данные из расширения в макет печати.
Ошибка Поле объекта не обнаружено (ИР_Грузополучатель) в модуле объекта внешней печатной формы сигнализирует о том, что в структуре или строке таблицы значений, которая передается в процедуру формирования печатного листа, отсутствует колонка с вашим реквизитом. Проанализируем цепочку формирования данных в УНФ. В этой конфигурации печать реализована через Библиотеку стандартных подсистем (БСП), но с глубокой кастомизацией. Данные обычно собираются в модуле менеджера документа (например, в функции УниверсальныйЗапросПоДаннымДокумента) и проходят через ряд общих модулей, таких как ПечатьДокументовУНФ и УправлениеПечатью.
Основная сложность заключается в том, что между получением данных запросом и их выводом на печать таблица данных может многократно пересобираться. Если в коде используется метод ЗаполнитьЗначенияСвойств или явное создание новой таблицы с перечислением колонок, ваш новый реквизит будет просто отсечен, так как типовой код о нем "не знает".
Для того чтобы понять, на каком этапе пропадает поле, нам необходимо выполнить качественную отладку. Разберем, как это сделать правильно, учитывая, что ВПФ запускается во временном хранилище.
ДанныеДокументовРегУчет или УниверсальныйЗапросПоДаннымДокумента. Проверьте, что в тексте запроса поле выбрано и ему назначен правильный псевдоним.УниверсальныйЗапросПоДаннымДокумента на строке возврата результата. Проанализируем переменную ДанныеДокументов.ДанныеДокументов и нажмем F2 (Показать значение). Если это таблица значений, мы увидим список колонок. Проверим наличие колонки ИР_Грузополучатель.ДоставкаСервер.ДобавитьСтрокуДоставкиУниверсальныеДанные(ДанныеДокументов). В подобных методах часто создается новая таблица, куда копируются только "нужные" (типовые) поля.Рассмотрим способы сохранения данных в структуре для печати.
В современных версиях УНФ рекомендуется использовать переопределяемые модули для добавления своих полей в запросы печати. Вместо того чтобы напрямую менять УниверсальныйЗапросПоДаннымДокумента, что усложняет поддержку, проанализируем возможности расширения состава полей через ОбщийМодуль.УправлениеПечатьюПереопределяемый. Это позволит системе учитывать ваш реквизит на всех этапах трансформации данных.
Если данные пропадают в общем модуле ПечатьДокументовУНФ, можно воспользоваться расширением процедуры ДобавитьСуммовыеПоля. Рассмотрим пример кода, который принудительно добавляет реквизит, если печатается конкретный тип документа:
&После("ДобавитьСуммовыеПоля")
Процедура ИР_ДобавитьСуммовыеПоля(ПараметрыЗапроса, ТекстЗапроса)
Если ТипЗнч(ПараметрыЗапроса.Ссылка) = Тип("ДокументСсылка.РасходнаяНакладная") Тогда
// Здесь можно модифицировать текст запроса или структуру параметров,
// чтобы поле ИР_Грузополучатель было включено в итоговую выборку
КонецЕсли;
КонецПроцедуры
Важный технический момент: внешние печатные формы по умолчанию запускаются в безопасном режиме. В этом режиме доступ к метаданным расширений может быть ограничен политикой безопасности платформы. Выясним, как это исправить:
Проанализируем ситуацию в модуле объекта самой ВПФ. Если вы используете заполнение данных по строке табличной части, убедитесь, что структура ДанныеПечати была инициализирована с учетом вашего поля. Посмотрим на пример безопасного заполнения:
Процедура ИР_ЗаполнитьДанныеПечатиПоСтрокеТабличнойЧасти(СтрокаТабличнойЧасти, ДанныеПечати)
// Проверяем наличие колонки перед обращением, чтобы избежать падения
Если СтрокаТабличнойЧасти.Свойства().Найти("ИР_Грузополучатель") <> Неопределено Тогда
ДанныеПечати.Вставить("Грузополучатель", СтрокаТабличнойЧасти.ИР_Грузополучатель);
Иначе
// Пытаемся получить данные напрямую из ссылки, если их нет в таблице
ДанныеПечати.Вставить("Грузополучатель", СтрокаТабличнойЧасти.Ссылка.ИР_Грузополучатель);
КонецЕсли;
КонецПроцедуры
Важное примечание: обращение к ссылке (СтрокаТабличнойЧасти.Ссылка.ИР_Грузополучатель) внутри цикла печати крайне негативно сказывается на производительности (проблема N+1 запрос). Стремитесь к тому, чтобы данные попадали в СтрокаТабличнойЧасти (которая обычно является строкой таблицы значений) еще на этапе выполнения общего запроса в модуле менеджера.
Для успешного вывода реквизитов расширения в ВПФ необходимо выполнить три условия: включить реквизит в основной запрос в модуле менеджера (через расширение), проследить с помощью отладчика, что он не удаляется в промежуточных модулях (таких как ДоставкаСервер), и отключить безопасный режим для самой внешней обработки. Соблюдение этих шагов гарантирует стабильную работу печатных форм даже после масштабных обновлений конфигурации УНФ.