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