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