При программном выводе отчетов с использованием Системы компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда код падает на этапе компоновки макета. Метод Выполнить() объекта КомпоновщикМакетаКомпоновкиДанных возвращает крайне неинформативную ошибку: «Ошибка компоновки макета. Ошибка в выражении. Причина: Синтаксическая ошибка».
Сложность заключается в том, что конфигуратор 1С не выявляет эту ошибку при синтаксическом контроле или сохранении схемы. В этой статье мы подробно разберем, почему возникает этот сбой, как локализовать его причину с помощью XML и как быстро исправить неисправность.
Рассмотрим типичный сценарий формирования отчета, при котором возникает данная проблема. В коде используется схема СКД, настройки по умолчанию, данные расшифровки и внешний набор данных (таблица значений):
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Ошибка возникает на следующей строке:
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("НаборДМС", ТЗ_ДМС);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
При запуске этого кода платформа аварийно завершает работу на этапе вызова метода Выполнить(). Очевидно, что проблема кроется внутри самой схемы СКД (СхемаКомпоновкиДанных) или в переданных настройках (НастройкиКомпоновкиДанных).
Когда мы вызываем метод КомпоновщикМакета.Выполнить(), платформа производит компиляцию схемы и настроек в единый исполняемый макет компоновки. Если в схеме задействованы собственные макеты оформления (вкладка «Макеты» в конструкторе СКД), парсер платформы начинает разбирать все связанные с ними выражения.
Основными причинами синтаксического сбоя являются:
Параметр или Шаблон, но в свойствах этой ячейки поле имени параметра осталось пустым, платформа попытается распарсить пустое выражение. Это гарантированно вызовет синтаксическую ошибку.СуммаОборот), которое впоследствии было удалено из набора данных или переименовано, компоновщик не сможет сопоставить типы данных.Шаблон текст внутри квадратных скобок (например, [Параметр1]) должен строго соответствовать имени параметра, определенного в таблице параметров этого макета. Любая лишняя скобка или пробел вызовет ошибку.Поскольку платформа не сообщает, в какой именно строке или ячейке макета произошла ошибка, нам придется использовать аналитические методы поиска проблемы.
Как показывает практика, чаще всего сбой происходит из-за скрытых ошибок привязки параметров в кастомных макетах оформления. Для исправления выполним следующие действия:
Параметр или Шаблон.Текст.Если визуальный осмотр макетов не принес результатов, мы можем выгрузить схему компоновки в XML-файл. Это позволит быстро найти пустые теги выражений с помощью любого текстового редактора.
Для выгрузки схемы воспользуемся простым фрагментом кода, выполнив его, например, во внешней обработке:
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\temp\schemeskd.xml");
ЗаписатьXML(ЗаписьXML, Схема);
ЗаписьXML.Закрыть();
После выгрузки откроем файл schemeskd.xml в текстовом редакторе (например, Notepad++ или VS Code) и выполним контекстный поиск по следующим маркерам:
<expression/> или <expression></expression> внутри узлов <template>.<parameter/>.<template> на предмет синтаксически некорректных формул.Обнаружение пустого тега выражения в макете однозначно укажет на проблемную ячейку, которую необходимо исправить в конфигураторе.
В особо сложных случаях, когда макетов много и XML-анализ затруднен, применим метод поэтапного удаления элементов:
.erf).Использование этих простых, но эффективных подходов позволит вам сэкономить массу времени и быстро вернуть работоспособность вашим отчетам на СКД.