Как исправить ошибку «Поле объекта не обнаружено» при обращении к реквизитам расширения во внешнем отчете 1С

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

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

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

Выясняем техническую причину ошибки

Прежде чем переходить к исправлению кода, давайте разберемся, почему платформа 1С ведет себя подобным образом. Взаимодействие внешних файлов (отчетов .erf и обработок .epf) с метаданными расширений имеет ряд архитектурных особенностей:

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

Анализ ошибочного кода

Проанализируем типичный сценарий, с которым столкнулся автор темы. В коде отчета присутствует запрос, который успешно получает данные:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Калькуляция1.Подписант КАК Подписант,
    |	Калькуляция1.Подписант.Должность КАК Должность
    |ИЗ
    |	Документ.Калькуляция КАК Калькуляция1";

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

ОбластьПодвал.Параметры.Должность1 = Подписант.Должность;

В данном случае переменная Подписант содержит объект типа СправочникСсылка.ФизическиеЛица. Попытка обратиться к реквизиту Должность через точку от этой ссылки приводит к ошибке «Поле объекта не обнаружено», так как для платформы в текущем контексте выполнения ссылка не содержит этого свойства.

Решение №1. Получение данных напрямую из выборки запроса (Рекомендуемое)

Поскольку поле Должность уже было успешно получено и обработано СУБД внутри тела запроса, нам нет никакой необходимости обращаться к нему повторно через ссылку. Мы должны извлечь готовое значение из результата выборки запроса. Рассмотрим правильный пример обхода выборки:


ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Неправильно: ОбластьПодвал.Параметры.Должность1 = ВыборкаДетальныеЗаписи.Подписант.Должность;
    // Правильно: берем значение, которое уже выбрано в колонку «Должность»
    ОбластьПодвал.Параметры.Должность1 = ВыборкаДетальныеЗаписи.Должность;
КонецЦикла;

Этот способ решает проблему сразу в двух направлениях. Во-первых, он устраняет ошибку обращения к несуществующему (для ссылки) полю объекта. Во-вторых, он колоссально оптимизирует скорость работы отчета, избавляя СУБД от сотен дополнительных неявных микрозапросов при выводе каждой строки макета.

Решение №2. Отключение безопасного режима для внешнего отчета

Если код написан верно, но отчет все равно выдает ошибку, вероятнее всего, дело в безопасном режиме БСП. Чтобы исправить это, выполним следующие шаги в режиме «1С:Предприятие»:

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

Решение №3. Внедрение отчета в состав расширения

Если отчет планируется использовать постоянно и он жестко завязан на реквизиты, добавленные в расширении, то лучшим архитектурным решением будет отказаться от концепции внешнего файла .erf. Перенесем отчет внутрь расширения:

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

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

Решение №4. Очистка кэша метаданных платформы

Бывают ситуации, когда ошибка появляется внезапно без изменения кода (например, «вчера все работало»). Это может быть связано с тем, что платформа закэшировала старую структуру метаданных справочника ФизическиеЛица и при запуске внешнего отчета обращается к неактуальным адресам памяти. Для решения этой проблемы выполним очистку кэша:

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

Перспективы развития платформы 1С

Разработчики фирмы «1С» знают о неудобствах, связанных с невидимостью расширенных реквизитов во внешних файлах. Начиная с будущих релизов платформы (анонсировано в версии 8.3.28), планируется полноценная интеграция метаданных активных расширений во внешние отчеты и обработки на уровне Конфигуратора. Конструкторы запросов и СКД смогут работать с добавленными реквизитами напрямую, что существенно упростит жизнь разработчикам и снизит количество подобных ошибок.

← На главную