Почему конструктор запросов СКД не видит реквизиты из расширения во внешнем отчете и как это исправить?

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

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

Выясним причину проблемы

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

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

Рассмотрим подробнее четыре способа, как обойти это ограничение и успешно создать отчет.

Способ 1. Разработка отчета внутри расширения

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

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

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

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

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

Рассмотрим алгоритм действий:

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

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

Способ 3. Метод «реквизитов-заглушек» (Временный перенос)

Этот способ часто используют опытные разработчики для быстрой отладки сложных отчетов, когда нужно многократно менять запрос в конструкторе. Суть заключается в обмане конфигуратора.

Разберем по шагам:

  1. В основной конфигурации создадим реквизиты с точно такими же именами, как в расширении (например, в справочнике МестаХранения). Тип данных можно поставить самый простой, например, Строка(10).
  2. Теперь конструктор запроса во внешнем отчете видит эти имена и позволяет комфортно работать с визуальным редактором.
  3. Настроим отчет, проверим связи и группировки.
  4. После завершения разработки удалим временные реквизиты из основной конфигурации (или просто не будем сохранять изменения в БД, если работаем в копии).
  5. В режиме предприятия отчет будет обращаться по именам полей. Платформа сначала поищет их в основной базе, не найдет, и обратится к слою расширения, где эти поля реально существуют с нужными типами.

Внимание: Будьте осторожны при использовании этого метода в рабочей базе. Лучше выполнять такие манипуляции в копии для разработки, чтобы случайно не заблокировать работу пользователей обновлением конфигурации БД.

Способ 4. Программная модификация текста запроса

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

Проанализируем пример кода в модуле объекта отчета, в событии ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем схему из макета
    СхемаКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // Находим нужный набор данных (обычно это НаборДанных1)
    НаборДанных = СхемаКД.НаборыДанных.Найти("НаборДанных1");
    
    Если НаборДанных <> Неопределено Тогда
        // Заменяем текст запроса на тот, который содержит реквизиты расширения
        // Конфигуратор его не пропустил бы, но платформа в режиме предприятия выполнит
        НаборДанных.Запрос = 
            "ВЫБРАТЬ
            |   МестаХранения.Ссылка КАК Ссылка,
            |   МестаХранения.ДополнительныйРеквизитИзРасширения КАК СпецПоле
            |ИЗ
            |   Справочник.МестаХранения КАК МестаХранения";
    КонецЕсли;

    // Далее стандартный вывод отчета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Нюансы работы с виртуальными таблицами

Особое внимание стоит уделить регистрам накопления и сведений, добавленным через расширения. Существует известная особенность платформы (особенно ярко выраженная в версиях ниже 8.3.15): виртуальные таблицы (такие как Остатки или Обороты) для регистров из расширений могут быть недоступны во внешних отчетах.

Если вы столкнулись с тем, что поле КоличествоОстаток не обнаруживается, хотя сам регистр в расширении есть, попробуйте следующие шаги:

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

← На главную