Почему при включении RLS перестают работать печатные формы и как это исправить?

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

При внедрении системы разграничения прав на уровне записей (Record Level Security, или RLS) разработчики часто сталкиваются с неприятным эффектом: пользователи, имеющие доступ к конкретному документу, внезапно теряют возможность выводить его на печать. Система выдает критическую ошибку «Недостаточно прав на исполнение операции над базой данных», хотя сам объект в интерфейсе виден и доступен для редактирования. Давайте подробно разберем, почему это происходит в конфигурациях вроде 1С:Архив и как правильно настроить систему, чтобы печатные формы работали корректно.

Выясняем причину: почему RLS блокирует макеты и печать

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

Рассмотрим типовые ситуации, когда это происходит:

  1. Связанные данные: Печатная форма часто подтягивает информацию не только из самого документа, но и из связанных справочников: ответственные лица, логотипы организаций, банковские счета или контактная информация. Если на эти справочники наложен RLS, к которому у пользователя нет доступа, запрос упадет.
  2. Отсутствие специальных инструкций в коде: По умолчанию любой запрос считается «строгим». Если он натыкается на хотя бы одну запрещенную запись, он прекращает работу.
  3. Ограничения на макеты: Иногда права ограничиваются не только на данные, но и на сам объект метаданных Макет.

Шаг 1. Точная диагностика через Журнал регистрации

Прежде чем вносить изменения в код «научным тыком», нам необходимо точно определить, на какой именно объект не хватает прав. Для этого проанализируем Журнал регистрации. При возникновении ошибки доступа платформа всегда фиксирует событие с уровнем «Ошибка» и категорией «Доступ.Отказ».

Разберем алгоритм поиска:

  1. Воспроизведем ошибку под пользователем.
  2. Перейдем в Журнал регистрации (Раздел Администрирование — Обслуживание — Журнал регистрации).
  3. Установим фильтр по событию Доступ.Отказ.
  4. В поле «Данные» мы увидим конкретную таблицу (например, РегистрСведений.СведенияОбОрганизациях или Справочник.ФизическиеЛица), которая послужила причиной блокировки.

Шаг 2. Использование ключевого слова РАЗРЕШЕННЫЕ

Наиболее распространенный способ решения проблемы — использование предиката РАЗРЕШЕННЫЕ в текстах запросов печатных форм. Это ключевое слово дает платформе команду: «Выбери только те записи, на которые у пользователя есть права, и не выдавай ошибку, если часть данных недоступна».

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   РеализацияТоваровУслуг.Ссылка,
    |   РеализацияТоваровУслуг.Организация.Логотип КАК Логотип
    |ИЗ
    |   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |   РеализацияТоваровУслуг.Ссылка = &Ссылка";

Если у пользователя нет прав на чтение справочника организаций (например, из-за настроек RLS), этот код упадет. Исправим его, добавив РАЗРЕШЕННЫЕ:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |   РеализацияТоваровУслуг.Ссылка,
    |   РеализацияТоваровУслуг.Организация.Логотип КАК Логотип
    |ИЗ
    |   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |   РеализацияТоваровУслуг.Ссылка = &Ссылка";

Теперь система просто вернет пустой логотип, если доступа к нему нет, но печатная форма сформируется и откроется.

Шаг 3. Использование привилегированного режима

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

Рассмотрим, как это реализовать в общем модуле печати:


// Устанавливаем привилегированный режим, чтобы RLS не блокировал чтение данных
УстановитьПривилегированныйРежим(Истина);

// Формируем запрос и получаем данные для макета
ДанныеДляПечати = ПолучитьДанныеДляПечатнойФормы(МассивОбъектов);

// Возвращаем режим в исходное состояние
УстановитьПривилегированныйРежим(Ложь);

Важное замечание: Привилегированный режим следует использовать осторожно и только на сервере. Это гарантирует, что бизнес-логика формирования документа не будет нарушена интерфейсными ограничениями прав доступа.

Шаг 4. Особенности работы с БСП в «1С:Архив»

Конфигурация 1С:Архив построена на базе Библиотеки стандартных подсистем (БСП). Механизмы печати в БСП часто используют универсальные функции получения реквизитов. Если вы используете функции типа ОбщегоНазначения.ЗначенияРеквизитовОбъекта(), помните, что внутри они могут не использовать РАЗРЕШЕННЫЕ.

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

Резюме и рекомендации

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

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

← На главную