Как разработать отчет СКД, если нужно использовать данные из расширения конфигурации?

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

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

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

Причина возникновения проблемы

Прежде чем переходить к решениям, проанализируем ситуацию. Контекст Конфигуратора при работе с внешним отчетом ограничен составом метаданных основной конфигурации (увидеть полную структуру объектов поможет Информер по метаданным). Расширения же подключаются динамически в режиме «Предприятие». Поэтому для Конфигуратора объектов из расширения просто не существует (для глубокого анализа зависимостей можно использовать Analyzer 1C). Рассмотрим способы решения этой задачи — от самых простых до продвинутых программных методов.

Метод 1: Разработка внутри расширения (Нативный путь)

Это самый логичный способ, если вы планируете использовать отчет постоянно в рамках конкретной информационной базы. Разберем его по шагам:

  1. Создадим новый отчет непосредственно внутри того расширения, где добавлены ваши новые реквизиты.
  2. Заимствуем в расширение все необходимые объекты основной конфигурации, которые будут участвовать в запросе.
  3. Теперь конструктор СКД будет видеть и основные поля, и поля расширения. Мы можем спокойно настраивать связи, отборы и ресурсы.
  4. Если нам все же нужен именно внешний отчет (например, для передачи клиенту), мы можем сохранить созданный отчет как внешний файл (Сохранить как внешний отчет...), а затем удалить его из расширения.

Важный нюанс: Если вы решите доработать отчет позже, Конфигуратор снова перестанет видеть поля расширения во внешнем файле. Вам придется либо править XML, либо временно возвращать отчет в расширение.

Метод 2: Программная подмена текста запроса

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

В процедуре ПриКомпоновкеРезультата мы перехватываем управление и модифицируем текст запроса (в сложных случаях удобно применять Процессор схемы запроса):


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Получаем схему компоновки
    СхемаКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // Находим нужный набор данных (обычно это первый набор-запрос)
    НаборДанных = СхемаКД.НаборыДанных[0];
    
    // Заменяем фиктивное поле "ВЫРАЗИТЬ('' '' КАК СТРОКА(10)) КАК МоеПоле" 
    // на реальное обращение к реквизиту расширения
    НовыйТекстЗапроса = СтрЗаменить(НаборДанных.Запрос, 
        "ВЫРАЗИТЬ("""" КАК СТРОКА(100)) КАК НовыйРеквизит", 
        "ЗаказКлиента.НовыйРеквизитИзРасширения КАК НовыйРеквизит");
    
    НаборДанных.Запрос = НовыйТекстЗапроса;
    
    // Далее можно позволить системе выполнить стандартную обработку с измененной схемой
    // Либо выполнить компоновку полностью программно (например, через СКДБилдер), если нужны сложные настройки
КонецПроцедуры

Почему это удобно? Конструктор запроса не ругается, так как видит стандартную функцию ВЫРАЗИТЬ, которая создает типизированную колонку. А в режиме «Предприятие» платформа успешно выполняет запрос к реальному полю.

Метод 3: Использование «Вычисляемых полей»

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

  1. В запросе СКД выбираем только ссылку на объект (например, Документ.ЗаказКлиента).
  2. Переходим на закладку Вычисляемые поля.
  3. Добавляем новое поле. В колонке «Путь к данным» пишем имя (например, ВажноеСвойство).
  4. В колонке «Выражение» пишем обращение через точку от ссылки: СсылкаНаОбъект.ИмяРеквизитаИзРасширения.

Несмотря на то, что Конфигуратор может подчеркнуть это выражение красным, платформа в режиме «Предприятие» обратится к метаданным через механизм обращения «через точку», который работает динамически. Это один из самых простых способов добавления простых реквизитов в отчет.

Метод 4: Использование Консоли СКД в режиме «Предприятие»

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

  1. Запускаем базу в режиме «Предприятие».
  2. Открываем консоль СКД. Поскольку мы находимся в запущенном сеансе, консоль «видит» все расширения.
  3. Создаем запрос, выбираем поля расширения, настраиваем оформление.
  4. Сохраняем готовую схему в XML-файл.
  5. В Конфигураторе открываем наш внешний отчет, заходим в основную схему и нажимаем Загрузить из файла.

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

Метод 5: Прямое редактирование XML (для продвинутых)

Разберем ситуацию, когда нужно внести небольшое правление в существующий отчет. Мы можем выгрузить отчет в файлы (Действия -> Выгрузить в файлы), найти XML-файл схемы и вручную прописать путь к данным.

Например, вместо:

<field xsi:type="DataSetFieldField"><dataPath>Поле1</dataPath>...

Мы пишем реальное имя из расширения. После этого выполняем обратную операцию Загрузить из файлов. Этот метод позволяет избежать ограничений визуального интерфейса 1С.

Метод «Характеристик» как альтернатива

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

Рекомендации по выбору метода

Проанализировав все способы, можно дать следующие советы:

Использование данных из расширений требует от разработчика определенной осторожности. Помните, что при отключении расширения отчет, использующий его данные, перестанет работать или будет выдавать ошибку. Поэтому всегда полезно добавлять в код проверки или использовать конструкции ЕСТЬNULL в запросах, чтобы отчет сохранял работоспособность даже в нештатных ситуациях.

← На главную