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