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