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