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