Как использовать реквизит из расширения в запросе внешнего отчета СКД?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

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

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

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

Способ 1. Программная подмена текста запроса

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

1. В Конструкторе запроса набора данных создаем поле-пустышку. Например:

0 КАК Оприходование

2. В модуле объекта внешнего отчета находим или создаем предопределенную процедуру ПриКомпоновкеРезультата. Нам нужно перехватить процесс компоновки и заменить текст запроса в схеме.

Разберем пример кода для такой подмены:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Получаем текст запроса из основного набора данных
    ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос;
    
    // Формируем реальное выражение, которое использует поле из расширения
    РеальноеПоле = "ВЫБОР 
                   |    КОГДА ЗаказНаПроизводство2_2Продукция.Отменено = ИСТИНА 
                   |    ТОГДА ЗаказНаПроизводство2_2Продукция.Расш1_БезСпецификации 
                   |    ИНАЧЕ 0 
                   |КОНЕЦ КАК Оприходование";
    
    // Выполняем замену заглушки на реальный код
    НовыйТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК Оприходование", РеальноеПоле);
    
    // Устанавливаем измененный запрос обратно в схему
    СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = НовыйТекстЗапроса;

КонецПроцедуры

Важный момент: если вы используете поле в ресурсах, убедитесь, что имя поля в запросе после замены совпадает с именем поля, которое вы настроили на вкладке «Ресурсы» и «Настройки» СКД.

Способ 2. Использование Консоли системы компоновки данных

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

  1. Запускаем базу в режиме 1С:Предприятие. В этом режиме все расширения активны, и платформа «видит» итоговую структуру объектов.
  2. Открываем обработку «Консоль системы компоновки данных» (ее можно найти на ИТС или в составе инструментов разработчика).
  3. В консоли создаем новый отчет и открываем Конструктор запроса. Здесь поле из расширения будет доступно в списке полей таблиц.
  4. Полностью настраиваем отчет: выбираем поля, создаем ресурсы, настраиваем параметры и варианты.
  5. Сохраняем готовую схему компоновки в файл .xml.
  6. Возвращаемся в Конфигуратор, открываем наш внешний отчет и загружаем схему из файла.

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

Способ 3. Создание временной конфигурации для разработки

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

  1. Создаем копию рабочей базы.
  2. В копии снимаем конфигурацию с поддержки (или разрешаем изменения).
  3. Вручную добавляем реквизит в основной объект конфигурации с точно таким же именем и типом, как в расширении.
  4. Разрабатываем отчет в этой копии. Конструктор будет видеть поле, так как оно теперь является частью основной конфигурации.
  5. Сохраняем отчет и запускаем его в рабочей базе, где это поле добавлено через расширение. Имена совпадут, и 1С успешно выполнит запрос.

Особенности работы с временными таблицами

Выясним еще одну важную деталь, упомянутую опытными разработчиками. Если вы выбираете поле из расширения во временную таблицу (ВТ), обязательно проверьте следующие моменты:

Проверка прав доступа

Иногда поле не отображается в отчете даже при правильном запросе. Посмотрим на ситуацию с точки зрения безопасности: при добавлении реквизита в расширение, права на него часто не назначаются автоматически для всех ролей. Проверьте, что в расширении создана роль, дающая право на Чтение и Просмотр этого реквизита, и эта роль назначена пользователям, либо в расширении включен флаг «Использовать основные роли для всех пользователей».

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

← На главную