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

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

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

Причина 1: Приоритет собственного макета над настройками набора данных

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

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

Разберем по шагам правильную настройку:

  1. Перейдем на закладку Макеты в схеме компоновки данных.
  2. Выделим область макета или ячейку, в которой должно отображаться вычисляемое значение.
  3. В свойствах ячейки укажем тип заполнения Параметр и зададим имя параметра (например, ПараметрЗначение).
  4. В нижней таблице Параметры макета найдем созданный параметр и в колонке Выражение пропишем вызов нужной функции.

Посмотрим на пример вызова функции в выражении параметра макета:

ОбщиеМеханизмы.ОбработатьЗначение(ПолеКомпоновки)

Причина 2: Свойства и флаги компиляции общего модуля

Компоновка данных и расчет выражений отчета выполняются в контексте сервера. Если отчет формируется на платформе 1С:Предприятие 8.3 в управляемом приложении (в том числе в фоновом задании), вызываемый общий модуль должен быть доступен на сервере.

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

  1. В дереве метаданных откроем свойства используемого общего модуля.
  2. Убедимся, что установлен флаг Сервер.
  3. Если модуль не является глобальным, флаг Глобальный устанавливать не нужно, но при вызове функции в выражении СКД обязательно следует указывать имя модуля через точку: ИмяМодуля.ИмяФункции(Параметр).
  4. Проверим, что вызываемая функция объявлена с ключевым словом Экспорт.

Причина 3: Оптимизация и «ленивые вычисления» в СКД

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

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

Причина 4: Программное формирование отчета и параметр инициализации

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

Посмотрим на программный код правильной инициализации:


ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
// Четвертый параметр РазрешитьИспользованиеВнешнихФункций должен быть установлен в Истина
ПроцессорКомпоновкиДанных.Инициализировать(
    МакетКомпоновки, 
    ВнешниеНаборыДанных, 
    ДанныеРасшифровки, 
    Истина
);

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

Альтернативный вариант: Обработка условий средствами СКД

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

Вызов функций общего модуля на каждую строку отчета приводит к накладным расходам и замедляет формирование отчета на больших объемах данных. Вместо функции можно использовать встроенную конструкцию ВЫБОР КОГДА на закладке Вычисляемые поля или в Выражении представления:


ВЫБОР
    КОГДА ПолеОтчета = 0 ТОГДА ""
    ИНАЧЕ ПолеОтчета
КОНЕЦ

Такой подход рассчитывается оптимизированным внутренним движком СКД и не требует дополнительных обращений к контексту выполнения модулей.

← На главную