Почему в 1С:ЗУП пропадают элементы формы при настройке прав доступа и как это исправить?

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

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

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

Причина проблемы: Механизм платформы «Нет прав — нет элемента»

Разберем фундаментальное правило работы управляемого интерфейса 1С. Если у пользователя в его наборе прав отсутствует право Просмотр (View) на реквизит, к которому привязан элемент формы, платформа действует радикально: она не просто делает элемент невидимым, она не создает его в коллекции ЭтаФорма.Элементы.

Проанализируем ситуацию: когда программа выполняет код в событии ПриСозданииНаСервере или ПриОткрытии, она пытается обратиться к Элементы.ФизлицоИНН. Если права на ИНН у пользователя нет, этого ключа в коллекции элементов не существует, и система закономерно выдает фатальную ошибку. Это и произошло в рассматриваемом случае с ролью «ТабельщикСОграничениями».

Шаг 1. Проверка прав доступа в метаданных

Первым делом рассмотрим настройки роли в расширении. Для того чтобы элемент ФизлицоИНН (который обычно ссылается на реквизит связанного справочника ФизическиеЛица) был доступен на форме сотрудника, необходимо убедиться в наличии прав на стороне источника данных.

  1. Откроем роль в расширении (или создадим новую).
  2. Найдем в дереве объектов справочник ФизическиеЛица.
  3. Проверим права на сам справочник: должно быть установлено Чтение и Просмотр.
  4. Важный момент: развернем список реквизитов справочника и найдем ИНН. Убедимся, что для этого конкретного реквизита установлена галочка Просмотр. Без этой галочки элемент на форме не появится, даже если есть права на весь справочник.

Шаг 2. Настройка прав на уровне реквизитов формы

Иногда прав на уровне метаданных объекта (справочника) недостаточно. В сложных формах 1С:ЗУП, таких как карточка сотрудника, данные могут отображаться через дополнительные реквизиты формы или через реквизиты-объекты.

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

  1. Откроем форму элемента справочника Сотрудники в расширении.
  2. Перейдем на вкладку Реквизиты.
  3. Найдем реквизиты, связанные с физическим лицом (например, ФизическоеЛицо или ФизическоеЛицоСсылка).
  4. Нажмем на кнопку Права... в свойствах реквизита (или вызовем контекстное меню).
  5. В открывшемся окне найдем нашу новую роль и убедимся, что в колонке Просмотр стоит отметка.

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

Шаг 3. Безопасное обращение к элементам формы в коде

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

Вместо опасного кода:


// Это вызовет ошибку, если прав нет
Элементы.ФизлицоИНН.Видимость = Ложь;

Рассмотрим и применим безопасный вариант:


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

Этот метод гарантирует, что даже если платформа удалила элемент из-за ограничений прав, программа не «вылетит» с ошибкой, а просто пропустит это действие.

Дополнительные факторы влияния в 1С:ЗУП

Посмотрим на ситуацию шире. В ЗУП 3.1 существуют встроенные механизмы управления составом форм, которые могут программно удалять элементы.

1. Подсистема «ЗарплатаКадрыСоставФорм»
В типовых решениях часто используются общие модули, которые динамически меняют интерфейс в зависимости от функциональных опций или прав. Проанализируем работу модуля ЗарплатаКадрыСоставФорм.ПриСозданииНаСервере. Если в нем прописана логика, скрывающая ИНН для определенных профилей доступа, ваши ручные настройки видимости в расширении могут перекрываться программным кодом типовой конфигурации.

2. Функциональные опции
Проверьте, не привязан ли элемент ФизлицоИНН к какой-либо функциональной опции. Если опция выключена (например, учет ИНН для определенных категорий сотрудников не ведется), элемент будет удален платформой автоматически.

3. Использование замера производительности для поиска «виновника»
Если права настроены, но элемент все равно исчезает, выясним причину с помощью отладки:

  1. Установим точку остановки в начале процедуры ПриСозданииНаСервере в модуле формы.
  2. Проверим наличие элемента через ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Элементы, "ФизлицоИНН").
  3. Если элемент есть, идем по шагам (F8) или используем замер производительности, чтобы увидеть, в какой момент и в каком общем модуле происходит обращение к свойству Видимость или удаление элемента.

Резюме

Проблема исчезновения ФизлицоИНН в ЗУП решается комплексным подходом к правам доступа. Чтение данных в роли дает возможность получить ИНН запросом, но только право Просмотр в роли и в свойствах реквизитов формы заставляет платформу создать визуальный элемент. При работе в расширениях всегда проверяйте, чтобы новые роли имели явный доступ к полям основных справочников (ФизическиеЛица, Сотрудники), а код был защищен проверкой Элементы.Найти().

← На главную