Почему внешняя печатная форма доступна только под полными правами и как это исправить?

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

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

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

Выясним причину, из-за которой возникает подобное поведение. Если при редактировании макета или модуля обработки в текст запроса был добавлен новый реквизит, таблица или справочник, платформа начинает проверять права текущего пользователя на все задействованные объекты метаданных.

Если у роли пользователя отсутствует базовое право Чтение на добавленный объект метаданных (например, дополнительный справочник или регистр сведений), платформа немедленно блокирует выполнение алгоритма с исключением Нарушение прав доступа.

Важно помнить о различиях между общими правами и ограничениями на уровне записей (RLS):

  1. Конструкция ВЫБРАТЬ РАЗРЕШЕННЫЕ спасает исключительно при активном RLS, когда ограничены конкретные строки или элементы таблиц. В таком случае запрос просто отсекает невидимые строки.
  2. Если же у пользователя нет права на саму таблицу метаданных в конфигураторе, директива РАЗРЕШЕННЫЕ не сработает — платформа все равно вызовет ошибку.
  3. Ошибка может возникать не только при прямом указании таблицы в секции ИЗ, но и при обращении через точку (разыменовании ссылочных полей), в левых соединениях или во вложенных подзапросах.

Рассмотрим подробнее варианты корректного обхода этого ограничения в зависимости от архитектуры вашей базы данных.

Способ 1. Создание точечной роли на чтение объекта

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

  1. В конфигураторе добавляем новую роль или открываем роль, назначенную пользователю.
  2. Для нужного справочника или таблицы устанавливаем флаг Чтение.
  3. Оставляем флаги Просмотр, Редактирование и Интерактивное добавление снятыми.

В таком варианте объект не появится в основном интерфейсе, командных панелях или списках выбора пользователя, однако платформа 1С позволит запросу печатной формы успешно прочитать данные.

Способ 2. Выполнение запроса в привилегированном общем модуле

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

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


Функция ПолучитьДанныеДляПечати(СсылкаНаДокумент) Экспорт

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

	Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
	
	Возврат Запрос.Выполнить().Выгрузить();

КонецФункции

Внешняя печатная форма вызывает эту процедуру без ошибок, так как код внутри привилегированного общего модуля исполняется с полным отключением проверок прав и механизма RLS.

Способ 3. Программная проверка прав перед выполнением запроса

Если доступность поля не является критичной для формирования всего документа, защитим печатную форму от аварийного завершения программной проверкой прав доступа. Посмотрим на пример кода внутри обработки:


Если ПравоДоступа("Чтение", Метаданные.Справочники.ЗакрытыйСправочник) Тогда
	// Выполняем полный запрос с присоединением справочника
	Запрос.Текст = ТекстЗапросаПолный;
Иначе
	// Выполняем упрощенный запрос без закрытых метаданных
	Запрос.Текст = ТекстЗапросаБезСправочника;
КонецЕсли;

Метод ПравоДоступа возвращает булево значение и позволяет динамически переключать текст запроса, заполняя пропущенные реквизиты пустыми строками, если у пользователя нет прав на этот справочник.

Нюансы работы с безопасным режимом внешних обработок

Проанализируем еще одну тонкость, характерную для конфигураций на обычных и управляемых формах (включая УПП). При регистрации внешних обработок в справочнике часто активируется признак БезопасныйРежим.

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

← На главную