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

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

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

Причина 1: Некорректный синтаксис обращения к коллекции элементов

Разберем первую и самую очевидную синтаксическую ошибку. В обычных формах платформы 1С (конфигурации на базе 8.1 или обычные формы 8.2/8.3) для доступа к элементам формы используется коллекция ЭлементыФормы. Однако в управляемых формах имя этой коллекции изменилось на Элементы.

Если в коде управляемой формы написать:


// Ошибка: ЭлементыФормы не используются в управляемых формах
ЭлементыФормы.Реквизит1.Видимость = Ложь;

Платформа не сможет найти коллекцию ЭлементыФормы в контексте управляемой формы. Правильный вариант обращения выглядит следующим образом:

Элементы.Реквизит1.Видимость = Ложь;

Причина 2: Отсутствие права «Просмотр» на реквизит в роли пользователя

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

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

Способы решения и безопасной работы в коде

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

Способ 1. Безопасное получение элемента через метод Найти()

Посмотрим на применение метода Найти() коллекции Элементы. Этот метод возвращает Неопределено, если элемент на форме не создан из-за нехватки прав, что позволяет избежать падения программы:


ЭлементФормы = Элементы.Найти("Реквизит1");
Если ЭлементФормы <> Неопределено Тогда
    ЭлементФормы.Видимость = Ложь;
КонецЕсли;

Способ 2. Проверка прав доступа в коде

Проанализируем проверку прав на уровне метаданных с помощью функции ПравоДоступа(). Перед тем как обращаться к элементу, проверим, есть ли у текущего сеанса право на просмотр соответствующего реквизита:


Если ПравоДоступа("Просмотр", Метаданные.Документы.ИмяДокумента.Реквизиты.Реквизит1) Тогда
    Элементы.Реквизит1.Видимость = Ложь;
КонецЕсли;

Способ 3. Проверка и настройка прав в Конфигураторе

Разберем по шагам порядок проверки прав в Конфигураторе, если элемент должен быть виден пользователю:

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

Способ 4. Сброс пользовательских настроек формы

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

Для восстановления видимости элемента выполним следующие действия:

  1. Откроем форму документа в режиме «1С:Предприятие» под проблемным пользователем.
  2. Нажмем командную кнопку Ещё в правой верхней части формы.
  3. Выберем пункт Установить стандартные настройки.
← На главную