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

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

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

Суть проблемы: значение против выражения

Рассмотрим типичную ситуацию: в схеме компоновки данных объявлен параметр &Коэффициент. Если пользователь вручную вводит в него число (например, 10), отчет формируется без ошибок. Однако, как только возникает необходимость вычислять этот коэффициент динамически (например, через функцию общего модуля или через арифметическое выражение с другими параметрами), система выдает ошибку синтаксиса.

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

Процесс программного вывода отчета

Для понимания причины ошибки проанализируем стандартную цепочку вызовов при программном выводе отчета. Обычно код выглядит следующим образом:

  1. Получение настроек из компоновщика (пользовательские настройки).
  2. Создание макета компоновки с помощью КомпоновщикМакетаКомпоновкиДанных.
  3. Инициализация ПроцессораКомпоновкиДанных.
  4. Вывод результата через ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.

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

Разбор функции инициализации процессора компоновки

Посмотрим на метод Инициализировать() объекта ПроцессорКомпоновкиДанных. Он принимает четыре параметра:


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

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

Как исправить ошибку в коде

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


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

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

    // ... код вывода в табличный документ ...
КонецПроцедуры

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


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

Дополнительные причины синтаксических ошибок в СКД

Хотя флаг ИспользоватьВнешниеФункции является наиболее частой причиной, проанализируем и другие нюансы, которые могут вызвать сообщение о синтаксической ошибке в выражении параметра:

  1. Неверное обращение к параметрам: Помните, что в поле «Выражение» на закладке «Параметры» СКД обращение к другим параметрам идет по имени без символа амперсанда &, если только вы не пишете текст запроса. Например, если вы хотите, чтобы Параметр2 был в два раза больше Параметр1, в колонке выражения для Параметр2 следует написать Параметр1 * 2.
  2. Типизация данных: Если выражение параметра предполагает арифметику, убедитесь, что у всех участвующих параметров жестко задан тип (например, Число). Если тип не задан, и в параметр попадет Неопределено, система выдаст ошибку вычисления.
  3. Порядок параметров: СКД вычисляет параметры сверху вниз. Если в выражении Параметра1 используется значение Параметра2, то Параметр2 должен располагаться в списке выше, иначе на момент расчета первого параметра второй еще не будет инициализирован.
  4. Экспортные функции: Если вы используете функцию общего модуля, проверьте следующие условия:
    • Функция помечена ключевым словом Экспорт.
    • Общий модуль имеет флаги Сервер, Внешнее соединение.
    • В выражении указано полное имя: ИмяОбщегоМодуля.ИмяФункции(Аргументы).

Рекомендации по отладке выражений СКД

Для того чтобы быстро локализовать проблему, рекомендуем воспользоваться следующей методикой:

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

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

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

← На главную