При настройке прав доступа в современных типовых конфигурациях (например, «Бухгалтерия предприятия 3.0» или «Управление торговлей 11») программисты часто сталкиваются с ситуацией: роль в расширении создана, права на объект (чтение, добавление, изменение) выданы, но у пользователя документ все равно открывается в режиме «Только просмотр». Рассмотрим подробно, почему это происходит и как правильно настроить систему, чтобы права заработали корректно.
Проанализируем типичную ошибку при создании роли в расширении. Когда мы добавляем существующий документ в роль внутри расширения, мы часто проставляем галочки «Чтение», «Изменение» и «Интерактивное добавление» для самого объекта. Однако этого недостаточно.
Разберем важный нюанс: в окне редактирования роли есть отдельная вкладка «Стандартные реквизиты». К ним относятся такие поля, как Дата, Номер, Проведен, ПометкаУдаления. Если в роли для этих реквизитов не установлено право «Редактирование», платформа 1С заблокирует возможность изменения всего документа, так как ключевые поля (дата и номер) будут недоступны для правки. Выясним, все ли галочки стоят на этой вкладке в вашей роли в расширении.
В современных конфигурациях права управляются декларативно. Это означает, что простого наличия роли у пользователя может быть недостаточно, так как подсистема «Управление доступом» должна «знать» о существовании этой роли и её назначении. Рассмотрим, как это работает на уровне кода.
Для того чтобы система корректно обрабатывала новые права, иногда требуется программно добавить их в описание профилей. Посмотрим на пример кода, который позволяет дополнить существующий профиль (например, «Кладовщик») новой ролью через расширение:
&После("ПриЗаполненииПоставляемыхПрофилейГруппДоступа")
Процедура ДФ_ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления)
Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
// Поиск профиля по его идентификатору (GUID) или имени
Если ОписаниеПрофиля.Идентификатор = "28f1fe22-299d-4135-ac9f-fe338ce51571" Тогда
ОписаниеПрофиля.Роли.Добавить("ВашаНоваяРольИзРасширения");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важный момент: использование жестко прописанных GUID (идентификаторов) в коде — спорная практика. Лучше выполнять поиск по имени профиля, чтобы код оставался работоспособным после обновлений конфигурации.
Рассмотрим альтернативный, зачастую более правильный путь, который не требует написания кода или создания расширений. Поставляемые (типовые) профили в 1С закрыты для редактирования, но система позволяет создавать на их основе собственные профили.
Этот метод считается наиболее «чистым», так как он использует штатные механизмы конфигурации и не вызывает проблем при последующих обновлениях программы.
Если в базе включено ограничение доступа на уровне записей (например, по организациям или складам), ситуация усложняется. Проанализируем ситуацию: у пользователя могут быть полные права на документ, но если в «Группе доступа» не указан конкретный склад, по которому разрешены операции, документ будет доступен только для чтения.
Проверьте настройки в разделе «Группы доступа». Убедитесь, что для пользователя разрешены те значения доступа (конкретные организации или склады), которые указаны в документе «Списание товаров».
Иногда причина кроется не в правах платформы, а в коде самой формы документа. В процедурах ПриСозданииНаСервере или ПриЧтенииНаСервере часто встречаются проверки типа:
Если НЕ РольДоступна("ПолныеПрава") И НЕ РольДоступна("НужнаяРоль") Тогда
ТолькоПросмотр = Истина;
КонецЕсли;
В этом случае, даже если вы добавили роль в расширение, типовой код о ней ничего не знает. Вам потребуется в том же расширении перехватить процедуру формы (используя аннотацию &После) и программно установить ТолькоПросмотр = Ложь;, если ваша роль доступна пользователю.
Чтобы решить проблему «Только просмотра», рекомендуется действовать по следующему алгоритму:
/UpdateDBCfg или специальные обработки БСП), чтобы система «увидела» изменения в структуре прав.