Как настроить доступность реквизита "Месяц" в документе "Табель" для скопированной роли в 1С:ЗУП 3.1?

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

При настройке прав доступа в конфигурации 1С:Зарплата и Управление Персоналом 3.1 разработчики часто сталкиваются с неожиданным поведением системы. Если в типовой конфигурации реквизит Месяц документа "Табель" успешно редактируется у пользователей с ролью "Добавление и изменение рабочего времени", то при простом копировании этой роли и назначении ее пользователю поле блокируется. Установка флажков в разделе "Редактирование" для реквизита МесяцРегистрацииСтрокой в свойствах скопированной роли также не дает результата.

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

Почему блокируется поле при копировании роли?

Проанализируем основные причины, по которым платформа ограничивает редактирование реквизита для новых ролей:

  1. Отсутствие наследования ролей: В конфигураторе 1С нет механизма наследования свойств ролей. При копировании создается абсолютно новый объект метаданных. Платформа не переносит настройки видимости и доступности элементов управляемой формы автоматически на новую роль.
  2. Программная блокировка в модулях формы: В типовых решениях, таких как ЗУП 3.1, доступностью элементов часто управляют программно в серверных процедурах (например, в ПриСозданииНаСервере или ПриЧтенииНаСервере). Система проверяет наличие конкретной роли через функцию РольДоступна("ДобавлениеИИзменениеРабочегоВремени"). Поскольку имя вашей новой скопированной роли отличается, проверка возвращает Ложь, и код принудительно устанавливает полю свойство "Только просмотр".
  3. Условное оформление: Редактирование поля может дополнительно блокироваться динамически через встроенное "Условное оформление" формы, которое также может опираться на наличие типовых ролей.

Решение 1: Изменение свойств формы через расширение (Визуальный подход)

Разберем первый, самый очевидный способ, который часто применяют на практике. Он заключается в переопределении свойств элементов формы непосредственно через расширение.

Для реализации этого метода:

  1. Добавьте форму документа "Табель" в ваше расширение.
  2. Откройте форму в расширении и найдите элемент МесяцРегистрацииСтрокой.
  3. Перейдите в раздел свойств "Редактирование".
  4. Установите галочку напротив вашей новой (скопированной) роли.

Недостаток метода: Изменение свойств самой формы считается изменением структуры. При будущих обновлениях типовой конфигурации это может вызвать конфликты и потребует дополнительного внимания при сравнении и объединении.

Решение 2: Программное снятие блокировки в расширении (Рекомендуемый подход)

Посмотрим на более надежный с точки зрения обновлений программный метод. Вместо расстановки галочек в свойствах формы, мы переопределим доступность элемента кодом. Это позволит обойтись без модификации структуры формы.

Добавьте форму документа в расширение и создайте обработчик события ПриСозданииНаСервере (или ПриЧтенииНаСервере, в зависимости от того, где происходит блокировка в типовом коде) с аннотацией &После. В обработчике снимите блокировку с поля для вашей роли:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие нашей кастомной роли
    Если РольДоступна("НашаСкопированнаяРоль") Тогда
        // Снимаем блокировку с элемента формы
        Элементы.МесяцРегистрацииСтрокой.ТолькоПросмотр = Ложь;
        // Либо альтернативный вариант:
        // Элементы.МесяцРегистрацииСтрокой.Доступность = Истина;
    КонецЕсли;
    
КонецПроцедуры

Если программное изменение свойства ТолькоПросмотр не помогает, выясним причину в коллекции условного оформления. Необходимо в этом же обработчике обойти коллекцию ЭтаФорма.УсловноеОформление, найти элемент, который применяет блокировку к полю МесяцРегистрацииСтрокой, и программно отключить его для пользователей с вашей ролью.

Решение 3: Использование профилей групп доступа (Штатный подход пользователя)

Проанализируем ситуацию с точки зрения архитектуры Библиотеки стандартных подсистем (БСП) и ЗУП 3.1. Копирование ролей в конфигураторе в современных конфигурациях не приветствуется и часто считается антипаттерном. Гораздо правильнее и безопаснее решать подобные задачи в режиме "1С:Предприятие".

Вместо создания новой роли в конфигураторе, выполните следующие шаги:

  1. Зайдите в режим "1С:Предприятие" в раздел администрирования.
  2. Создайте новый "Профиль групп доступа".
  3. Включите в этот профиль типовую роль "Добавление и изменение рабочего времени". Это гарантирует, что все жестко прописанные в коде проверки функции РольДоступна отработают корректно.
  4. Если стандартная роль дает слишком много прав (например, доступ ко всем организациям), ограничьте эти права с помощью стандартных механизмов RLS. Настройте ограничения доступа на уровне записей в самой группе доступа (например, укажите конкретные организации или группы физических лиц).

При использовании профилей групп доступа типовые механизмы формы продолжают работать штатно, и реквизит Месяц останется доступным для редактирования без написания дополнительного кода и модификации расширений.

← На главную