Как создать отчет в расширении 1С 8.3, если конструктор запросов не видит нужные данные?

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

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

Почему конструктор запросов в расширении выдает ошибки

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

Решение 1: Использование внешней схемы компоновки данных (СКД)

Этот метод считается наиболее «чистым», так как он не требует массового заимствования объектов в расширение. Рассмотрим его по шагам:

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

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

Решение 2: Ручное редактирование текста запроса

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

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


ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК Количество,
    ПродажиОбороты.Регистратор.Склад КАК Склад
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты КАК ПродажиОбороты

Если в расширение не добавлен регистратор и его реквизит Склад, конструктор выдаст ошибку. Но если мы просто сохраним этот текст в СКД, платформа отработает его корректно при запуске отчета пользователем.

Решение 3: Использование внешних наборов данных (Объектная СКД)

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

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

  1. В СКД создаем набор данных типа «Объект», называем его, например, ТаблицаДанных.
  2. Описываем поля, которые мы хотим видеть в отчете (имя и тип).
  3. В модуле объекта отчета в расширении создаем обработчик события ПриКомпоновкеРезультата.

Пример кода в модуле объекта:


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

Этот метод гарантирует, что вам не придется «тащить» в расширение лишние объекты конфигурации, сохраняя его легкость и упрощая будущие обновления ERP.

Интеграция отчета в интерфейс ERP 2 и БСП

Мало просто создать отчет в расширении, его нужно правильно зарегистрировать, чтобы пользователи ERP могли найти его в соответствующих разделах (например, в «Отчетах по продажам»). В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) для этого используется Модуль менеджера отчета.

Рассмотрим подробнее: в расширении для созданного отчета нужно создать модуль менеджера и добавить туда процедуру для интеграции с панелью отчетов:


Процедура НастроитьВариантыОтчета(Настройки, ОписаниеОтчета, Изменения) Экспорт
    
    // Описываем, в каких разделах интерфейса будет виден отчет
    Настройка = Настройки.Варианты.Добавить();
    Настройка.Отчет = "ИмяВашегоОтчета"; 
    Настройка.Размещение.Вставить("Продажи", "ОтчетыПоПродажам");
    Настройка.Описание = НСтр("ru = 'Важное описание назначения отчета'");
    
КонецПроцедуры

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

Выводы и рекомендации

Подведем итоги нашего анализа. Для создания отчета в расширении ERP 2 с минимальным ущербом для системы лучше всего следовать таким правилам:

  1. Не заимствуйте объекты целиком. Если вы решили пойти по пути добавления объектов в расширение для работы конструктора, добавляйте только сам объект и те реквизиты, которые критичны для связей.
  2. Используйте XML-перенос. Разработка схемы в отдельном внешнем отчете с последующей загрузкой XML в расширение — самый быстрый и надежный способ сохранить структуру запроса.
  3. Помните о модуле менеджера. Без регистрации через НастроитьВариантыОтчета ваш отчет останется «невидимкой» для пользователей типового интерфейса ERP.
  4. Внешние наборы данных — ваш лучший друг в сложных случаях, когда запрос должен обращаться к десяткам таблиц, которые не хочется заимствовать в расширение.

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

← На главную