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