Почему СКД выдает ошибку при использовании общих модулей в привилегированном режиме?

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

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

Анализ ситуации

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

Решение проблемы: настройка параметров инициализации

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

Рассмотрим, как должен выглядеть исправленный код процедуры ПриКомпоновкеРезультата:


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

Важные рекомендации и меры предосторожности

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

  1. Безопасность: Разрешение внешних функций — это расширение прав исполнения кода. Убедитесь, что вызываемые функции из Общих модулей не содержат уязвимостей, так как они будут выполнены в привилегированном режиме.
  2. Доступность модулей: Убедитесь, что общий модуль, к которому вы обращаетесь, помечен флагами Сервер или Вызов сервера. В противном случае платформа не сможет найти функцию при исполнении на сервере.
  3. Контекст исполнения: Если отчет должен быть доступен пользователям, не обладающим административными правами, внимательно проверяйте, не нарушает ли привилегированный режим логику обработки данных.
  4. Альтернативы: Если проблема заключается только в доступе к данным (например, пользователь не видит записи из-за RLS), возможно, стоит пересмотреть архитектуру, добавив проверку доступа или используя привилегированные функции только для получения узкого набора данных, а не для всей логики отчета целиком.

Таким образом, для исправления ошибки достаточно просто передать значение Истина в качестве четвертого аргумента метода Инициализировать объекта ПроцессорКомпоновкиДанных. Это позволит системе «увидеть» и выполнить код, прописанный в ваших вычисляемых полях, даже при включенном привилегированном режиме.

← На главную