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