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