Как исправить синтаксическую ошибку при выполнении КомпоновщикМакета.Выполнить() в 1С?

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

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

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

Анализ исходной ситуации и программного кода

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


Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

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

Почему возникает синтаксическая ошибка при компоновке макета?

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

Основными причинами синтаксического сбоя являются:

  1. Пустые или некорректные параметры макета. Если на вкладке «Макеты» для ячейки установлен тип заполнения Параметр или Шаблон, но в свойствах этой ячейки поле имени параметра осталось пустым, платформа попытается распарсить пустое выражение. Это гарантированно вызовет синтаксическую ошибку.
  2. Опечатки в выражениях параметров макета. В нижней части вкладки «Макеты» находится таблица соответствия параметров. Ошибки в формулах (например, пропущенная закрывающая скобка, опечатки в именах функций, смешение русской и английской раскладок в системных именах) приводят к падению компоновщика.
  3. Несуществующие поля в выражениях параметров. Если в выражении параметра макета указано поле (например, СуммаОборот), которое впоследствии было удалено из набора данных или переименовано, компоновщик не сможет сопоставить типы данных.
  4. Использование некорректных шаблонов. При использовании типа заполнения Шаблон текст внутри квадратных скобок (например, [Параметр1]) должен строго соответствовать имени параметра, определенного в таблице параметров этого макета. Любая лишняя скобка или пробел вызовет ошибку.
  5. Несоответствие настроек компоновки и структуры данных. Если в настройках отчета (в отборах, группировках или выбранных полях) указано поле, которое отсутствует в схеме или в переданной таблице значений, это также может послужить причиной сбоя компиляции макета.

Пошаговая инструкция по локализации и исправлению ошибки

Поскольку платформа не сообщает, в какой именно строке или ячейке макета произошла ошибка, нам придется использовать аналитические методы поиска проблемы.

Шаг 1. Переназначение параметров макета (Быстрое решение)

Как показывает практика, чаще всего сбой происходит из-за скрытых ошибок привязки параметров в кастомных макетах оформления. Для исправления выполним следующие действия:

  1. Откроем отчет в конфигураторе и перейдем на вкладку «Макеты».
  2. Выделим поочередно каждую ячейку, у которой в свойствах «Заполнение» указано значение Параметр или Шаблон.
  3. Проверим имя параметра ячейки. Если оно очищено — зададим его заново или переключим тип заполнения в значение Текст.
  4. Перейдем к таблице параметров макета (в нижней части конструктора). Полностью очистим выражения для параметров и пропишем их заново вручную. Особое внимание уделим правильности написания имен полей компоновки.

Шаг 2. Анализ схемы через выгрузку в XML

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

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


Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\temp\schemeskd.xml");
ЗаписатьXML(ЗаписьXML, Схема);
ЗаписьXML.Закрыть();

После выгрузки откроем файл schemeskd.xml в текстовом редакторе (например, Notepad++ или VS Code) и выполним контекстный поиск по следующим маркерам:

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

Шаг 3. Метод исключения (деструктивный анализ)

В особо сложных случаях, когда макетов много и XML-анализ затруднен, применим метод поэтапного удаления элементов:

  1. Создадим резервную копию файла отчета (.erf).
  2. Откроем копию в конфигураторе и удалим половину пользовательских макетов на вкладке «Макеты».
  3. Запустим отчет. Если ошибка исчезла, значит, проблемный макет находился среди удаленных. Если ошибка осталась — проблема в оставшейся части макетов.
  4. Повторяем процедуру деления пополам (метод дихотомии) до тех пор, пока не локализуем конкретный макет и конкретную строку, вызывающую сбой компоновщика макета.

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

← На главную