Как исправить ошибку «Поле объекта не обнаружено» при обращении к реквизитам расширения из внешней печатной формы в 1С:УНФ?

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

При обновлении конфигурации 1С:Управление нашей фирмой (УНФ) до версии 3.0 многие разработчики сталкиваются с тем, что внешние печатные формы (ВПФ), которые раньше работали исправно, начинают выдавать ошибку: Поле объекта не обнаружено (Имя_Реквизита). Особенно часто это происходит, если печатная форма обращается к реквизитам, добавленным через расширения. Проблема осложняется тем, что в самой конфигурации реквизит виден, в расширении он активен, но внешняя обработка «отказывается» его распознавать.

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

Разберем причину возникновения ошибки

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

Второй аспект — переход УНФ 3.0 на механизмы печати через фоновые задания. Если расширение не имеет признака использования в фоновых заданиях или если сеанс фонового задания не «подхватил» расширение, обращение к его полям приведет к падению системы.

Решение 1: Отключение безопасного режима

Первым делом проанализируем настройки подключения внешней обработки. В 1С:УНФ это делается в разделе «Дополнительные отчеты и обработки».

  1. Перейдем в справочник Дополнительные отчеты и обработки.
  2. Найдем нашу проблемную печатную форму.
  3. Обратим внимание на флаг Безопасный режим.
  4. Попробуем снять этот флаг. Если форма требует разрешений, система предложит их настроить, либо можно полностью отключить безопасный режим для проверки.

Важно: Работа в небезопасном режиме позволяет коду обработки видеть все реквизиты, включая те, что добавлены расширениями. Это самый быстрый способ «вылечить» ошибку, если она вызвана ограничениями прав доступа.

Решение 2: Проверка программного формирования запроса в менеджере документа

В УНФ 3.0 данные для печати часто собираются в модуле менеджера документа (например, РасходнаяНакладная) с помощью специализированных функций. Если вы добавили реквизит в расширение, вам нужно убедиться, что он попадает в выборку запроса, который формирует таблицу данных для печати.

Рассмотрим пример внесения изменений в расширение модуля менеджера. Предположим, нам нужно добавить поле ИР_Грузополучатель в структуру данных. Мы должны перехватить запрос, например, в процедуре ДобавитьСуммовыеПоля или напрямую в формировании временных таблиц.

Проанализируем пример кода, который необходимо внедрить в расширение:


&После("ДобавитьСуммовыеПоля")
Процедура ИР_ДобавитьРеквизитыРасширения(ПараметрыЗапроса)
    Если ТипЗнч(ПараметрыЗапроса.Ссылка) = Тип("ДокументСсылка.РасходнаяНакладная") Тогда
        // Добавляем выборку нашего поля из расширения в текст запроса
        ТекстЗапроса = ПараметрыЗапроса.ТекстЗапроса;
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДокументТаблица.Ссылка КАК Ссылка,", 
            "ДокументТаблица.Ссылка КАК Ссылка, ДокументТаблица.ИР_Грузополучатель КАК ИР_Грузополучатель,");
        ПараметрыЗапроса.ТекстЗапроса = ТекстЗапроса;
    КонецЕсли;
КонецПроцедуры

Здесь мы используем метод СтрЗаменить, чтобы «подмешать» наше поле в основной запрос формирования данных. Если этого не сделать, то даже если поле существует в базе, оно не попадет в структуру СтрокаТабличнойЧасти, которую ВПФ использует для вывода на печать.

Решение 3: Проверка доступности расширения в фоновых заданиях

Если печать в УНФ 3.0 настроена через фоновые задания (что является стандартом для повышения производительности), убедимся, что расширение корректно подключено. Выясним причину, почему серверный контекст может не видеть изменения:

  1. Откроем Конфигуратор.
  2. Перейдем в список расширений (Конфигурация — Расширения конфигурации).
  3. Проверим свойства расширения. Убедимся, что снята галочка Безопасный режим в свойствах самого расширения (не путать с ВПФ).
  4. Убедимся, что стоит флаг Активно.

Если расширение само находится в безопасном режиме, оно может блокировать передачу своих данных во внешние объекты.

Решение 4: Корректное обращение к полям в модуле ВПФ

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

Вместо прямого обращения:

ДанныеПечати.Вставить("Грузополучатель", СтрокаТабличнойЧасти.ИР_Грузополучатель);

Рекомендуется использовать проверку наличия свойства или универсальные методы БСП. Но если мы уверены, что поле должно быть, сначала проверим саму структуру СтрокаТабличнойЧасти в отладчике. Если поля там нет, значит, проблема в шаге №2 (формирование запроса в менеджере).

Пример безопасного заполнения данных в ВПФ:


Если СтрокаТабличнойЧасти.Свойства().Найти("ИР_Грузополучатель") <> Неопределено Тогда
    ДанныеПечати.Вставить("Грузополучатель", СтрокаТабличнойЧасти.ИР_Грузополучатель);
Иначе
    // Если поле не найдено в структуре, попробуем получить его напрямую из ссылки
    ДанныеПечати.Вставить("Грузополучатель", СтрокаТабличнойЧасти.Ссылка.ИР_Грузополучатель);
КонецЕсли;

Внимание: Обращение через Ссылка.ИР_Грузополучатель внутри цикла печати существенно замедляет работу системы (создает лишние обращения к БД), поэтому этот метод стоит использовать только как временную меру для диагностики.

Использование отладчика для поиска причины

Если вышеописанные методы не помогли, воспользуемся проверенным способом — отладкой. Чтобы отладить внешнюю печатную форму, которая выдает ошибку в УНФ 3.0, выполним следующие шаги:

  1. В модуле объекта ВПФ найдем строку, где происходит обращение к полю ИР_Грузополучатель.
  2. Установим точку останова.
  3. Запустим печать. Если точка останова не срабатывает, значит, печать уходит в фоновое задание.
  4. Чтобы «поймать» фоновое задание, зайдем в меню Отладка — Подключение и в списке доступных предметов выберем фоновое задание на сервере.
  5. Когда выполнение остановится, проанализируем содержимое переменной СтрокаТабличнойЧасти. Выясним, какие колонки присутствуют в этой структуре.

Если колонки ИР_Грузополучатель нет в списке, значит, вам необходимо вернуться к модификации процедур ДанныеДокументовРегУчет или УниверсальныйЗапросПоДаннымДокумента в расширении менеджера документа. Именно там формируется «скелет» данных, который потом передается в печатную форму.

Проанализировав ситуацию, мы видим, что обновление УНФ 3.0 требует более строгого подхода к расширениям. Использование префиксов (например, ИР_) обязательно, а правильная регистрация полей в запросах через механизмы БСП — залог стабильной работы ваших внешних печатных форм.

← На главную