При настройке ограничений на уровне записей (RLS) в конфигурации 1С:Зарплата и Управление Персоналом 2.5 разработчики нередко сталкиваются с ситуацией: пользователь без ошибок создает и проводит документ, но при попытке повторно провести этот же документ система выдает ошибку: «У пользователя недостаточно прав на исполнение операции над базой данных». Разберем детально, почему это происходит и как правильно решить данную проблему.
Проанализируем механику работы платформы «1С:Предприятие» при записи движений документов в регистры накопления и расчета. Когда пользователь создает новый документ, в базе данных еще нет сформированных движений по этому регистратору. При первой проводке формируются новые строки и записываются в регистры.
Однако при повторном проведении или отмене проведения документа платформа действует по следующему алгоритму:
НаборЗаписей соответствующего регистра с отбором по Регистратор.В результате возникает конфликт: даже если на сам документ и на запись в регистр у пользователя есть полные права, ограничение RLS на «Чтение» записей регистра прерывает процесс перепроведения еще до записи новых данных.
В обычном приложении (толстый клиент) автоматическая очистка движений выполняется платформой до передачи управления в процедуру-обработчик ОбработкаПроведения модуля объекта. Так как операция инициируется в контексте клиентской сессии под ограниченными правами пользователя, свойство документа «Привилегированный режим при проведении» не успевает сработать, и система падает с ошибкой прав доступа.
Рассмотрим основной способ решения проблемы, который позволяет полностью контролировать очистку и запись движений без нарушения логики RLS:
Посмотрим на пример кода в модуле документа:
Процедура ОбработкаПроведения(Отказ, Режим)
// Включаем привилегированный режим для работы с наборами движений
УстановитьПривилегированныйРежим(Истина);
// Очищаем существующие движения вручную
Для Каждого Движение Из Движения Цикл
Движение.Прочитать();
Если Движение.Количество() > 0 Тогда
Движение.Очистить();
Движение.Записать();
КонецЕсли;
КонецЦикла;
// Формируем новые проводки и движения документа
СформироватьДвижения(Режим, Отказ);
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Если конфигурация работает в клиент-серверном режиме, операцию проведения документа можно вынести в отдельный общий модуль с установленным свойством «Привилегированный» (с признаками Сервер, Вызов сервера).
Разберем вариант, когда требуется оставить автоматическое проведение, но скорректировать логику ограничений RLS на чтение таблиц регистров. Ошибка возникает из-за того, что ограничение проверяет аналитику самой строки регистра (например, измерение Подразделение или Сотрудник).
Чтобы разрешить чтение наборов при перепроведении, в текст RLS для регистра на право «Чтение» добавляют условие проверки прав по документу-регистратору:
Регистратор (проверка по подразделению шапки документа).Проанализируем альтернативный архитектурный подход. Если RLS на регистры накладывался исключительно для того, чтобы пользователи не видели движения чужих подразделений в типовых отчетах, эффективнее снять RLS с самих регистров накопления и расчета.
СотрудникиОрганизаций, ПодразделенияОрганизаций) и документов.Такой подход устраняет конфликты блокировок и проверок прав при перепроведении документов, существенно повышая общую производительность системы.