Как исправить ошибки в запросах без слова РАЗРЕШЕННЫЕ после добавления RLS в 1С?

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

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

Причины падения запросов при включении RLS

Выясним причину такого поведения платформы. В типовых конфигурациях запросы условно разделяются на две категории:

  1. Интерфейсные запросы: выборки для динамических списков, отчетов и форм выбора, где пользователь должен видеть только те данные, на которые у него есть права.
  2. Алгоритмические запросы: выборки в обработках проведения, расчетах себестоимости, закрытии месяца или проверках целостности данных.

Если в запросе не указано ключевое слово РАЗРЕШЕННЫЕ, платформа требует наличия полных прав на чтение всех строк и реквизитов, к которым обращается запрос. Если RLS отсекает хотя бы одну запись или ограничение наложено на отдельное поле (в секциях ГДЕ, ПО при соединениях или при обращении через точку), платформа намеренно прерывает выполнение с исключением. Это защитный механизм: выполнение алгоритма на неполных данных может привести к искажению учетных итогов и нарушению ссылочной целостности базы.

Способ 1. Разделение логики: «РАЗРЕШЕННЫЕ» или привилегированный режим

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

  1. Если данные предназначены только для отображения пользователю: в текст запроса необходимо добавить ключевое слово РАЗРЕШЕННЫЕ. Запрос отберет только доступные текущему пользователю записи, а недоступные будут пропущены без генерации ошибки.
  2. Если данные требуются для проведения документа или служебного расчета: такой код нельзя выполнять с РАЗРЕШЕННЫЕ, иначе расчет остатков или движений будет ошибочным. Такие алгоритмы необходимо выносить в привилегированные общие модули либо обрамлять вызов конструкцией установки привилегированного режима.

Посмотрим на пример установки привилегированного режима для служебных расчетов:


УстановитьПривилегированныйРежим(Истина);
// Выполнение алгоритма проведения или расчета
Выборка = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);

Способ 2. Программная модификация запросов через объект «СхемаЗапроса»

Если текст запроса формируется динамически или генерируется типовыми механизмами, простая текстовая замена (поиск слова «ВЫБРАТЬ») может нарушить синтаксис пакетных запросов или вложенных конструкций с ОБЪЕДИНИТЬ. В таких случаях рассмотрим применение объекта СхемаЗапроса.

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


Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(ИсходныйТекстЗапроса);

Для Каждого ЭлементПакета Из Схема.ПакетЗапросов Цикл
    Если ТипЗнч(ЭлементПакета) = Тип("ЗапросВыбораСхемыЗапроса") Тогда
        Для Каждого Оператор Из ЭлементПакета.Операторы Цикл
            Оператор.Разрешенные = Истина;
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

МодифицированныйТекст = Схема.ПолучитьТекстЗапроса();
Запрос.Текст = МодифицированныйТекст;

Использование объекта СхемаЗапроса гарантирует корректную расстановку ключевого слова РАЗРЕШЕННЫЕ во всех ветках сложных и пакетных запросов без риска повредить синтаксис.

Способ 3. Интеграция в подсистему «Управление доступом» БСП

В современных конфигурациях на базе «1С:Библиотеки стандартных подсистем» (БСП) прямое редактирование условий RLS в ролях конфигурации часто приводит к конфликтам с типовыми алгоритмами. Проанализируем правильный порядок встраивания RLS:

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

Риски и ограничения принудительного использования «РАЗРЕШЕННЫЕ»

Рассмотрим подробнее последствия, о которых важно помнить при массовом добавлении РАЗРЕШЕННЫЕ:

  1. Искажение учетных данных: если запрос контроля остатков отсечет часть записей из-за RLS, система может разрешить списание товара, которого фактически нет, или продублировать уникальные данные.
  2. Падение производительности: каждый запрос с RLS транслируется платформой в СУБД с дополнительными подзапросами проверки прав. Для исключения замедления работы обязательно проверяйте наличие индексов по всем полям, задействованным в условиях ограничений доступа.
← На главную