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

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

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

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

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

Анализ кода и причины возникновения ошибки

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

УправлениеОтчетами.ПолучитьНомерГДизГТД(НомерГТД)

Если запустить отчет стандартно — всё работает. Но стоит нам переопределить процесс формирования в модуле объекта отчета, как выполнение прерывается ошибкой:


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

Текст ошибки: Синтаксическая ошибка "УправлениеОтчетами.ПолучитьНомерГДизГТД". Проблема заключается в том, что по умолчанию процессор компоновки данных работает в изолированном режиме, где доступ к внешним функциям ограничен в целях безопасности.

Решение: правильное использование метода Инициализировать

Чтобы исправить ситуацию, необходимо заглянуть в синтаксис-помощник и изучить параметры метода Инициализировать объекта ПроцессорКомпоновкиДанных. Его сигнатура выглядит так:


Инициализировать(<Макет>, <ВнешниеНаборыДанных>, <ДанныеРасшифровки>, <ВозможностьИспользованияВнешнихФункций>, ...)

Ключевым является четвертый параметр — ВозможностьИспользованияВнешнихФункций. Если он не задан, платформа устанавливает его в Ложь. Это предотвращает выполнение кода при использовании схем из сомнительных источников. Для корректной работы вашего отчета параметр нужно явно установить в Истина:


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

// Разрешаем использование внешних функций (4-й параметр)
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Истина); 

После этой правки СКД успешно распознает вызов общего модуля, и "Синтаксическая ошибка" исчезнет.

Проверка настроек общего модуля

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

  1. Доступность на сервере: Так как компоновка выполняется на стороне сервера, у общего модуля должны стоять флаги Сервер или Вызов сервера.
  2. Экспортный метод: Функция должна иметь ключевое слово Экспорт.
  3. Отсутствие клиентского кода: Внутри функции нельзя использовать интерактивные методы (предупреждения, вопросы), иначе отчет упадет при формировании в фоновом задании.

Оптимизация и безопасность

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

Безопасный режим

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

Влияние на производительность

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

Резюме

Для исправления ошибки при программном формировании отчета:

  1. В процедуре формирования найдите создание ПроцессорКомпоновкиДанных.
  2. Установите четвертый параметр метода Инициализировать в значение Истина.
  3. Проверьте наличие флага "Сервер" у общего модуля и ключевого слова "Экспорт" у функции.
  4. Минимизируйте количество тяжелых вычислений внутри таких функций для ускорения отчета.
← На главную