Разработка отчетов на системе компоновки данных (СКД), которые должны использовать объекты из расширений конфигурации, часто превращается в проблему для разработчика. Основная сложность заключается в том, что Конфигуратор в режиме дизайна внешнего отчета или даже отчета внутри расширения часто «не видит» метаданные, добавленные или заимствованные в расширении. В результате конструктор запросов выдает ошибки, а визуальная настройка полей становится невозможной.
В этой статье мы подробно рассмотрим проверенные способы обхода этих ограничений, разберем причины возникновения ошибок и научимся сохранять сложные настройки отчета, такие как ресурсы и группировки, даже если платформа пытается их «сбросить».
Прежде чем перейти к решениям, проанализируем ситуацию. Когда мы создаем внешний отчет (файл .erf), он существует автономно. Конфигуратор, открывая его, ориентируется на основную конфигурацию базы. Объекты расширения (новые справочники, документы или добавленные реквизиты) в этот момент для конструктора запросов являются «несуществующими», так как они не входят в состав основной конфигурации. Аналогичная проблема часто возникает и с виртуальными таблицами (например, Хозрасчетный.ОборотыДтКт), если в расширение не были добавлены все измерения и типы данных, участвующие в работе этой таблицы.
Это самый популярный и наглядный метод, который позволяет использовать визуальный конструктор, но не в Конфигураторе, а непосредственно в режиме 1С:Предприятие. Рассмотрим этот процесс по шагам:
Важный нюанс: при таком импорте часто «затираются» настройки ресурсов в колонке «Рассчитывать по...». Если это произошло, настройки придется восстановить вручную или воспользоваться четвертым способом, описанным ниже.
Если нам нужно сохранить возможность редактирования настроек в Конфигураторе, но запрос к объектам расширения блокирует работу, мы можем прибегнуть к «хитрости» с фиктивным запросом. Разберем, как это реализовать:
В схеме СКД напишем «фиктивный» запрос к объектам основной конфигурации, который будет возвращать поля с теми же именами и типами, которые мы ожидаем получить из расширения. Например, если нам нужен Справочник.Расш_НовыйСправочник, мы можем временно выбрать данные из Справочник.Номенклатура, переименовав поля с помощью псевдонимов КАК.
Затем в модуле отчета перехватим процесс компоновки и подставим реальный текст запроса. Используем для этого событие ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем схему из макета
СхемаКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Устанавливаем реальный текст запроса, который видит объекты расширения
ТекстЗапроса =
"ВЫБРАТЬ
| Т.Ссылка КАК Ссылка,
| Т.Расш_НовыйРеквизит КАК НовыйРеквизит
|ИЗ
| Справочник.Номенклатура КАК Т";
СхемаКД.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
// Далее выполняем стандартную инициализацию компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Этот метод позволяет гибко управлять запросом в коде, где объекты расширения всегда доступны для обращения по именам.
Для сложной разработки, когда требуется постоянное использование визуального конструктора, можно применить метод дублирования метаданных. Мы создаем копию информационной базы и в основной конфигурации этой копии создаем объекты с такими же именами, как в нашем расширении. В этой среде мы спокойно разрабатываем отчет, настраиваем все связи и оформления. После завершения работы мы просто переносим файл отчета в рабочую базу. Поскольку имена метаданных (например, Справочник.Расш_Склад) совпадают, отчет в рабочей базе «подцепит» объекты из расширения.
Если вы столкнулись с проблемой потери настроек ресурсов при импорте XML (как упоминалось в способе 1), существует способ «хирургического» вмешательства. Выясним причину: при загрузке XML во внешний отчет Конфигуратор пытается валидировать схему и удаляет то, что не может проверить. Чтобы этого избежать, мы можем вставить схему напрямую в расширение, минуя механизм импорта внешнего файла.
Reports\ИмяОтчета\Templates\ОсновнаяСхемаКомпоновкиДанных\Ext\Template.xml.Преимущество этого метода: платформа принимает файлы «как есть», не пытаясь принудительно очистить ресурсы, которые ей кажутся некорректными из-за отсутствия метаданных в основном контексте.
Если ваш отчет использует виртуальные таблицы регистров (Обороты, Остатки), и вы получаете ошибку «Таблица не найдена», проанализируем состав расширения. Для корректной работы виртуальных таблиц в расширении должны присутствовать:
СправочникСсылка.Склады, этот справочник также должен быть в расширении.Использование этих методик позволит вам создавать полноценные, сложные отчеты на базе расширений, сохраняя все преимущества системы компоновки данных.