При внедрении системы разграничения прав на уровне записей (Record Level Security, или RLS) разработчики часто сталкиваются с неприятным эффектом: пользователи, имеющие доступ к конкретному документу, внезапно теряют возможность выводить его на печать. Система выдает критическую ошибку «Недостаточно прав на исполнение операции над базой данных», хотя сам объект в интерфейсе виден и доступен для редактирования. Давайте подробно разберем, почему это происходит в конфигурациях вроде 1С:Архив и как правильно настроить систему, чтобы печатные формы работали корректно.
Проанализируем механику работы платформы 1С. Когда в роли пользователя включены шаблоны ограничений (например, по организации или подразделению), любой программный запрос к базе данных начинает автоматически модифицироваться платформой. Если код формирования печатной формы пытается прочитать данные, которые не проходят через «сито» RLS, выполнение кода прерывается фатальной ошибкой.
Рассмотрим типовые ситуации, когда это происходит:
Макет.Прежде чем вносить изменения в код «научным тыком», нам необходимо точно определить, на какой именно объект не хватает прав. Для этого проанализируем Журнал регистрации. При возникновении ошибки доступа платформа всегда фиксирует событие с уровнем «Ошибка» и категорией «Доступ.Отказ».
Разберем алгоритм поиска:
Администрирование — Обслуживание — Журнал регистрации).Доступ.Отказ.РегистрСведений.СведенияОбОрганизациях или Справочник.ФизическиеЛица), которая послужила причиной блокировки.Наиболее распространенный способ решения проблемы — использование предиката РАЗРЕШЕННЫЕ в текстах запросов печатных форм. Это ключевое слово дает платформе команду: «Выбери только те записи, на которые у пользователя есть права, и не выдавай ошибку, если часть данных недоступна».
Посмотрим на пример стандартного запроса, который вызовет ошибку при включенном RLS:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка,
| РеализацияТоваровУслуг.Организация.Логотип КАК Логотип
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Ссылка = &Ссылка";
Если у пользователя нет прав на чтение справочника организаций (например, из-за настроек RLS), этот код упадет. Исправим его, добавив РАЗРЕШЕННЫЕ:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| РеализацияТоваровУслуг.Ссылка,
| РеализацияТоваровУслуг.Организация.Логотип КАК Логотип
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Ссылка = &Ссылка";
Теперь система просто вернет пустой логотип, если доступа к нему нет, но печатная форма сформируется и откроется.
В некоторых случаях использование РАЗРЕШЕННЫЕ недостаточно. Например, если в печатной форме обязательно должны быть реквизиты организации, которые скрыты от пользователя в обычном интерфейсе (например, юридический адрес или ИНН). В такой ситуации нам поможет временный переход в привилегированный режим, который полностью отключает проверку RLS для текущего фрагмента кода.
Рассмотрим, как это реализовать в общем модуле печати:
// Устанавливаем привилегированный режим, чтобы RLS не блокировал чтение данных
УстановитьПривилегированныйРежим(Истина);
// Формируем запрос и получаем данные для макета
ДанныеДляПечати = ПолучитьДанныеДляПечатнойФормы(МассивОбъектов);
// Возвращаем режим в исходное состояние
УстановитьПривилегированныйРежим(Ложь);
Важное замечание: Привилегированный режим следует использовать осторожно и только на сервере. Это гарантирует, что бизнес-логика формирования документа не будет нарушена интерфейсными ограничениями прав доступа.
Конфигурация 1С:Архив построена на базе Библиотеки стандартных подсистем (БСП). Механизмы печати в БСП часто используют универсальные функции получения реквизитов. Если вы используете функции типа ОбщегоНазначения.ЗначенияРеквизитовОбъекта(), помните, что внутри они могут не использовать РАЗРЕШЕННЫЕ.
Проанализируем ситуацию: если ваша печатная форма перестала работать после наложения шаблона ограничения на сам документ, проверьте общий модуль, где происходит сбор данных. Возможно, стоит заменить вызов стандартных функций БСП на собственные запросы с префиксом РАЗРЕШЕННЫЕ или обернуть вызов в УстановитьПривилегированныйРежим(Истина).
Для исправления «прикола» с исчезающими или блокируемыми макетами при включенном RLS, мы рекомендуем придерживаться следующего плана действий:
РАЗРЕШЕННЫЕ: во всех запросах, которые собирают данные для формирования коллекции печатных форм.СформироватьКоллекциюПечатныхФорм лучше переносить в модули с установленным флагом «Привилегированный»).Макет, используемых в документе.Следуя этим правилам, вы обеспечите стабильную работу системы 1С:Архив и корректное формирование отчетности даже при самых строгих настройках безопасности.