Почему при перепроведении документа в 1С:ЗУП возникает ошибка прав доступа RLS и как ее исправить?

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При настройке ограничений на уровне записей (RLS) в конфигурации 1С:Зарплата и Управление Персоналом 2.5 разработчики нередко сталкиваются с ситуацией: пользователь без ошибок создает и проводит документ, но при попытке повторно провести этот же документ система выдает ошибку: «У пользователя недостаточно прав на исполнение операции над базой данных». Разберем детально, почему это происходит и как правильно решить данную проблему.

Причина возникновения ошибки при перепроведении документа

Проанализируем механику работы платформы «1С:Предприятие» при записи движений документов в регистры накопления и расчета. Когда пользователь создает новый документ, в базе данных еще нет сформированных движений по этому регистратору. При первой проводке формируются новые строки и записываются в регистры.

Однако при повторном проведении или отмене проведения документа платформа действует по следующему алгоритму:

  1. Платформа инициирует очистку движений документа, обращаясь к объекту НаборЗаписей соответствующего регистра с отбором по Регистратор.
  2. Операция модификации или очистки регистра выполняется не построчно, а целиком над набором записей.
  3. Перед перезаписью или удалением набора записей СУБД выполняет считывание существующих данных.
  4. Если в наборе уже содержатся строки по сотрудникам или подразделениям, на чтение которых у пользователя наложено ограничение RLS, платформа блокирует операцию на этапе чтения набора.

В результате возникает конфликт: даже если на сам документ и на запись в регистр у пользователя есть полные права, ограничение RLS на «Чтение» записей регистра прерывает процесс перепроведения еще до записи новых данных.

Особенность обычного приложения и флажка «Привилегированный режим при проведении»

В обычном приложении (толстый клиент) автоматическая очистка движений выполняется платформой до передачи управления в процедуру-обработчик ОбработкаПроведения модуля объекта. Так как операция инициируется в контексте клиентской сессии под ограниченными правами пользователя, свойство документа «Привилегированный режим при проведении» не успевает сработать, и система падает с ошибкой прав доступа.

Способ 1. Ручное управление движениями и привилегированный модуль

Рассмотрим основной способ решения проблемы, который позволяет полностью контролировать очистку и запись движений без нарушения логики RLS:

  1. В свойствах документа в дереве метаданных находим свойство «Удаление движений» и переключаем его со значения Автоматически на значение Не очищать (или Управлять вручную).
  2. Переносим очистку старых движений и запись новых в процедуры модуля объекта или вызываем серверный общий модуль.
  3. Перед очисткой и формированием движений программно включаем привилегированный режим, чтобы чтение наборов записей выполнялось без ограничений RLS.

Посмотрим на пример кода в модуле документа:


Процедура ОбработкаПроведения(Отказ, Режим)
    
    // Включаем привилегированный режим для работы с наборами движений
    УстановитьПривилегированныйРежим(Истина);
    
    // Очищаем существующие движения вручную
    Для Каждого Движение Из Движения Цикл
        Движение.Прочитать();
        Если Движение.Количество() > 0 Тогда
            Движение.Очистить();
            Движение.Записать();
        КонецЕсли;
    КонецЦикла;
    
    // Формируем новые проводки и движения документа
    СформироватьДвижения(Режим, Отказ);
    
    УстановитьПривилегированныйРежим(Ложь);
    
КонецПроцедуры

Если конфигурация работает в клиент-серверном режиме, операцию проведения документа можно вынести в отдельный общий модуль с установленным свойством «Привилегированный» (с признаками Сервер, Вызов сервера).

Способ 2. Корректировка шаблонов RLS для регистров

Разберем вариант, когда требуется оставить автоматическое проведение, но скорректировать логику ограничений RLS на чтение таблиц регистров. Ошибка возникает из-за того, что ограничение проверяет аналитику самой строки регистра (например, измерение Подразделение или Сотрудник).

Чтобы разрешить чтение наборов при перепроведении, в текст RLS для регистра на право «Чтение» добавляют условие проверки прав по документу-регистратору:

  1. Разрешить чтение записи регистра, если пользователю доступно чтение документа, указанного в поле Регистратор (проверка по подразделению шапки документа).
  2. Применить условие, разрешающее чтение набора записей в контексте его перезаписи текущим регистратором.

Способ 3. Перенос ограничений с уровня регистров на уровень отчетов

Проанализируем альтернативный архитектурный подход. Если RLS на регистры накладывался исключительно для того, чтобы пользователи не видели движения чужих подразделений в типовых отчетах, эффективнее снять RLS с самих регистров накопления и расчета.

  1. Оставить RLS только на уровне нормативно-справочной информации (справочники СотрудникиОрганизаций, ПодразделенияОрганизаций) и документов.
  2. Ограничение видимости данных в отчетах настроить через типовые механизмы системы компоновки данных (СКД) с установкой фиксированных отборов по доступным подразделениям текущего пользователя.
  3. Ограничить права доступа пользователей к общим отчетам конфигурации через роли.

Такой подход устраняет конфликты блокировок и проверок прав при перепроведении документов, существенно повышая общую производительность системы.

← На главную