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