Разработка отчетов в системе компоновки данных (СКД) часто наталкивается на серьезное препятствие, когда данные (справочники, документы или их реквизиты) находятся не в основной конфигурации, а в расширении. Главная проблема заключается в том, что Конфигуратор «не видит» метаданные расширений при редактировании внешнего отчета или схемы компоновки. Если мы попытаемся выбрать поле из расширения в конструкторе запроса, система выдаст ошибку, что поле не найдено, а сам конструктор может заблокировать сохранение запроса.
В этой статье мы подробно разберем несколько эффективных стратегий, которые позволяют обойти это ограничение и создать полноценный отчет, работающий с данными расширений.
Прежде чем переходить к решениям, проанализируем ситуацию. Контекст Конфигуратора при работе с внешним отчетом ограничен составом метаданных основной конфигурации (увидеть полную структуру объектов поможет Информер по метаданным). Расширения же подключаются динамически в режиме «Предприятие». Поэтому для Конфигуратора объектов из расширения просто не существует (для глубокого анализа зависимостей можно использовать Analyzer 1C). Рассмотрим способы решения этой задачи — от самых простых до продвинутых программных методов.
Это самый логичный способ, если вы планируете использовать отчет постоянно в рамках конкретной информационной базы. Разберем его по шагам:
Сохранить как внешний отчет...), а затем удалить его из расширения.Важный нюанс: Если вы решите доработать отчет позже, Конфигуратор снова перестанет видеть поля расширения во внешнем файле. Вам придется либо править XML, либо временно возвращать отчет в расширение.
Этот метод считается наиболее гибким и «профессиональным». Его суть заключается в том, что в схеме СКД мы создаем «заглушку» (фиктивное поле), а в момент выполнения отчета заменяем ее на реальное имя реквизита из расширения. Рассмотрим подробнее реализацию в модуле отчета.
В процедуре ПриКомпоновкеРезультата мы перехватываем управление и модифицируем текст запроса (в сложных случаях удобно применять Процессор схемы запроса):
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем схему компоновки
СхемаКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Находим нужный набор данных (обычно это первый набор-запрос)
НаборДанных = СхемаКД.НаборыДанных[0];
// Заменяем фиктивное поле "ВЫРАЗИТЬ('' '' КАК СТРОКА(10)) КАК МоеПоле"
// на реальное обращение к реквизиту расширения
НовыйТекстЗапроса = СтрЗаменить(НаборДанных.Запрос,
"ВЫРАЗИТЬ("""" КАК СТРОКА(100)) КАК НовыйРеквизит",
"ЗаказКлиента.НовыйРеквизитИзРасширения КАК НовыйРеквизит");
НаборДанных.Запрос = НовыйТекстЗапроса;
// Далее можно позволить системе выполнить стандартную обработку с измененной схемой
// Либо выполнить компоновку полностью программно (например, через СКДБилдер), если нужны сложные настройки
КонецПроцедуры
Почему это удобно? Конструктор запроса не ругается, так как видит стандартную функцию ВЫРАЗИТЬ, которая создает типизированную колонку. А в режиме «Предприятие» платформа успешно выполняет запрос к реальному полю.
Посмотрим на ситуацию иначе. Если нам нужно просто вывести значение реквизита расширения в отчет, мы можем не трогать основной запрос. Выясним, как это сделать через механизм вычисляемых полей:
Документ.ЗаказКлиента).ВажноеСвойство).СсылкаНаОбъект.ИмяРеквизитаИзРасширения.Несмотря на то, что Конфигуратор может подчеркнуть это выражение красным, платформа в режиме «Предприятие» обратится к метаданным через механизм обращения «через точку», который работает динамически. Это один из самых простых способов добавления простых реквизитов в отчет.
Проанализируем сценарий, когда отчет сложный и писать код для замены строк не хочется. Мы можем использовать специальный инструмент — Консоль системы компоновки данных — для этого подойдет инструментарий разработчика с консолью СКД.
Загрузить из файла.Предупреждение: После загрузки такой схемы не открывайте конструктор запроса в Конфигураторе. Если вы его откроете и нажмете «ОК», конструктор попытается проверить метаданные, не найдет их и удалит «ошибочные» с его точки зрения поля.
Разберем ситуацию, когда нужно внести небольшое правление в существующий отчет. Мы можем выгрузить отчет в файлы (Действия -> Выгрузить в файлы), найти XML-файл схемы и вручную прописать путь к данным.
Например, вместо:
<field xsi:type="DataSetFieldField"><dataPath>Поле1</dataPath>...
Мы пишем реальное имя из расширения. После этого выполняем обратную операцию Загрузить из файлов. Этот метод позволяет избежать ограничений визуального интерфейса 1С.
Если расширение добавляет множество однотипных свойств, рассмотрим использование механизма Характеристик в СКД. Мы можем описать источник характеристик (например, через запрос к таблице расширения) на соответствующей вкладке в СКД. Это позволит пользователям в режиме «Предприятие» самостоятельно выбирать новые поля в настройках отчета, даже если они не были жестко прописаны в основном наборе данных.
Проанализировав все способы, можно дать следующие советы:
СтрЗаменить в тексте запроса.Использование данных из расширений требует от разработчика определенной осторожности. Помните, что при отключении расширения отчет, использующий его данные, перестанет работать или будет выдавать ошибку. Поэтому всегда полезно добавлять в код проверки или использовать конструкции ЕСТЬNULL в запросах, чтобы отчет сохранял работоспособность даже в нештатных ситуациях.