Как получить данные руководителя во внешнем отчете 1С без выдачи кадровых прав пользователю

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

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

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

Почему не работает привилегированный режим во внешнем отчете

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

  1. Включенный безопасный режим (Safe Mode). По умолчанию внешние отчеты и обработки, открываемые из файлов или через справочник дополнительных обработок, запускаются платформой в безопасном режиме. В этом режиме вызов метода УстановитьПривилегированныйРежим(Истина) блокируется или игнорируется платформой в целях безопасности информационной базы.
  2. Клиентский контекст выполнения. Метод УстановитьПривилегированныйРежим() может выполняться только на стороне сервера или во внешнем соединении. В коде клиентских модулей (включая форму отчета в толстом клиенте) он не оказывает никакого влияния на проверку прав.
  3. Особенности СКД и разыменование полей. Если отчет строится на Системе компоновки данных, платформа перед компоновкой проверяет доступность полей схемы для текущего интерактивного пользователя. Если у пользователя нет прав на справочник ФизическиеЛица, то при обращении к реквизитам через точку (например, ОтветственныеЛица.ФизическоеЛицо.Наименование) компоновщик настроек удалит эти поля или вернет пустые значения еще до выполнения запроса.

Способ 1. Получение данных через привилегированный общий модуль конфигурации

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

Если требуется нестандартная логика, создадим собственную экспортную функцию в общем модуле с установленным флагом «Привилегированный»:


Функция ПолучитьФИОРуководителяПодразделения(Подразделение, ДатаСреза) Экспорт

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

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

Эту функцию можно вызывать как в коде формирования печатной формы, так и в выражениях полей схемы компоновки данных (во вкладке «Вычисляемые поля» или в пользовательских полях СКД).

Способ 2. Отключение безопасного режима для внешнего отчета

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

  1. При подключении в базу: В карточке подключаемого отчета (в справочнике «Внешние обработки и отчеты») снимем флаг «Безопасный режим».
  2. При программном открытии внешнего отчета: В метод создания объекта передадим параметр БезопасныйРежим = Ложь:

ВнешнийОтчетОбъект = ВнешниеОтчеты.Создать(ПутьКФайлу, Ложь);

После снятия безопасного режима вызов привилегированного режима на сервере начнет корректно отключать проверку прав и RLS.

Способ 3. Программная компоновка отчета в привилегированном режиме

Разберем, как правильно переопределить формирование отчета в модуле объекта внешнего отчета, чтобы СКД выполнялась с полными правами:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    УстановитьПривилегированныйРежим(Истина);
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    УстановитьПривилегированныйРежим(Ложь);

КонецПроцедуры

Способ 4. Использование набора данных «Объект»

Если СКД удаляет недоступные поля на этапе инициализации настроек, применим универсальный подход с набором данных типа «Объект»:

  1. В схеме компоновки данных создадим Набор данных — Объект, указав в нем строковое поле РуководительФИО (вместо прямой ссылки на справочник ФизическиеЛица).
  2. В модуле отчета запросом в привилегированном режиме заполним ТаблицуЗначений, где поле ответственного лица сразу преобразуется в строку (представление).
  3. Передадим сформированную таблицу во внешние наборы данных процессора компоновки. Таким образом, платформа не будет проверять права на ссылочный объект, а отчет получит готовые строковые данные.
← На главную