Как исправить ошибку «Поле объекта не обнаружено (ПараметрыОбменаСКонтрагентами)» в 1С?

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

При работе пользователей с ограниченными правами в конфигурациях на базе 1С:Предприятие (таких как 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей) нередко возникают неожиданные сбои в типовом коде. Один из классических примеров — ошибка «Поле объекта не обнаружено (ПараметрыОбменаСКонтрагентами)», возникающая в момент нажатия кнопки «Закончить редактирование» при работе с прикрепленными файлами в договорах контрагентов или других документах.

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

Анализ проблемы и причин ее возникновения

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


{Справочник.ДоговорыКонтрагентов.Форма.ФормаЭлемента.Форма(5008)}: Поле объекта не обнаружено (ПараметрыОбменаСКонтрагентами)

Если мы заглянем в конфигуратор и попытаемся найти реквизит ПараметрыОбменаСКонтрагентами на форме элемента справочника ДоговорыКонтрагентов, мы его там не обнаружим. Выясним причину этого явления.

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

Процедура инициализации ЭДО в обязательном порядке выполняет проверку прав текущего пользователя. Если у пользователя отсутствуют права на чтение объектов ЭДО (в частности, на чтение метаданных электронных документов), инициализация подсистемы прерывается. Как результат — программное добавление реквизита ПараметрыОбменаСКонтрагентами на форму не происходит. Форма открывается без этого реквизита.

В то же время на клиенте в обработчике оповещения о записи файла (например, при вызове РаботаСФайламиОбработкаОповещения) выполняется следующий код:


Если ЗначениеЗаполнено(Параметр) И Параметр.Свойство("Событие") И Параметр.Событие = "ВерсияСохранена" 
    И ЭтотОбъект.ПараметрыОбменаСКонтрагентами.ДанныеСостоянияЭДОТекущие <> Неопределено
    И ЭтотОбъект.ПараметрыОбменаСКонтрагентами.ДанныеСостоянияЭДОТекущие.СуществуетАктуальныйДокумент Тогда
    // Логика обработки
КонецЕсли;

Поскольку реквизита ПараметрыОбменаСКонтрагентами физически нет на форме у данного пользователя, обращение к нему вызывает фатальное исключение. При этом у пользователей с полными правами такой ошибки нет, так как для них подсистема ЭДО инициализируется корректно.

Ниже подробно описаны три способа устранения этой проблемы.

Способ 1. Настройка прав доступа (Решение без изменения кода)

Самый простой и быстрый способ решить проблему, не прибегая к программированию и снятию конфигурации с поддержки, — предоставить пользователю минимально необходимые права на работу с объектами ЭДО. Проанализируем, какие именно роли за это отвечают.

Для корректной инициализации реквизитов обмена с контрагентами на форме платформе требуется проверить доступ к метаданным электронных документов. В частности, к справочнику СообщенияЭДОПрикрепленныеФайлы и документу СообщениеЭДО. За это отвечают типовые роли:

Выполним настройку по шагам:

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

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

Способ 2. Статическое добавление реквизита в конфигураторе (Рекомендация 1С)

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

Разберем процесс реализации в конфигураторе:

  1. Откроем конфигурацию и найдем справочник ДоговорыКонтрагентов (или иной объект, в форме которого возникает ошибка).
  2. Перейдем к списку форм и откроем форму элемента (например, ФормаЭлемента).
  3. В правом верхнем углу окна редактора формы перейдем на вкладку Реквизиты.
  4. Добавим новый реквизит формы. Назовем его в точном соответствии с кодом: ПараметрыОбменаСКонтрагентами.
  5. В поле Тип укажем тип данных Произвольный.
  6. Сохраним и обновим конфигурацию базы данных.

При таком подходе реквизит будет существовать на форме всегда, вне зависимости от прав пользователя и результатов работы серверных процедур инициализации ЭДО. По умолчанию он будет инициализирован значением Неопределено, что позволит избежать ошибки "Поле объекта не обнаружено" на клиенте.

Способ 3. Безопасная доработка программного кода

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

Посмотрим на пример безопасного написания кода. Нам необходимо разделить длинное условие на несколько частей и применить специализированные функции проверки наличия свойств у объектов формы.

Рекомендуется использовать стандартную функцию БСП ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(). Перепишем проблемный участок кода следующим образом:


&НаКлиенте
Процедура РаботаСФайламиОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    // Проверяем базовые параметры события
    Если ЗначениеЗаполнено(Параметр) 
        И Параметр.Свойство("Событие") 
        И Параметр.Событие = "ВерсияСохранена" Тогда
        
        // Безопасно проверяем, существует ли вообще реквизит на форме
        Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ЭтотОбъект, "ПараметрыОбменаСКонтрагентами") Тогда
            
            ПараметрыЭДО = ЭтотОбъект.ПараметрыОбменаСКонтрагентами;
            
            // Если реквизит создан программно и заполнен, проверяем внутренние свойства
            Если ПараметрыЭДО <> Неопределено 
                И ПараметрыЭДО.ДанныеСостоянияЭДОТекущие <> Неопределено 
                И ПараметрыЭДО.ДанныеСостоянияЭДОТекущие.СуществуетАктуальныйДокумент Тогда
                
                // Здесь располагается оригинальный код обработки состояния ЭДО
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

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

Резюме

Мы проанализировали ошибку «Поле объекта не обнаружено (ПараметрыОбменаСКонтрагентами)» и пришли к выводу, что она вызвана особенностями интеграции подсистем БСП и БЭД при работе под ограниченными правами доступа. Для устранения неполадки вы можете выбрать любой из трех предложенных путей:

← На главную