Как вести разработку внешнего отчета, если необходимые реквизиты находятся в расширении конфигурации?

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

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

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

Суть проблемы: контекст выполнения

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

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

Давайте рассмотрим проверенные методы обхода этого ограничения.

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

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

Шаги реализации:

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

Теперь самое важное — перенос в Конфигуратор:

  1. Открываем наш внешний отчет в Конфигураторе.
  2. Открываем макет Основной Схемы Компоновки Данных.
  3. Нажимаем кнопку "Загрузить схему из файла" и выбираем наш XML, сохраненный из консоли.

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

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

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

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

1. В макете СКД в Конфигураторе напишите запрос, который выбирает данные без учета полей расширения. Это позволит вам настроить структуру отчета, группировки и условное оформление, используя доступные поля.

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

Рассмотрим пример кода:


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

Этот метод хорош тем, что отчет всегда корректно открывается в Конфигураторе (так как в схеме лежит "чистый" запрос), но в режиме Предприятия работает с полным набором данных.

Метод 3: Разработка внутри расширения с последующим экспортом

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

Давайте проанализируем этот подход:

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

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

Метод 4: Использование внешнего набора данных (Объект)

В обсуждении темы также был затронут вариант использования временных таблиц. В терминологии СКД это реализуется через Внешний набор данных (тип источника данных "Объект").

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

Разберем реализацию:

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

// Пример получения данных кодом
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка,
    |	Номенклатура.Расш1_МойРеквизит
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура";
    
ТЗ = Запрос.Выполнить().Выгрузить();

// Передаем таблицу в СКД
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаДанных", ТЗ);

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

Преимущества: Полный контроль над данными, возможность отладки запроса в консоли, отсутствие ошибок в Конфигураторе.

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

Использование современных IDE (1C:EDT)

Стоит также упомянуть среду разработки 1C:EDT (Enterprise Development Tools). В отличие от классического Конфигуратора, EDT работает с проектной моделью.

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

Резюме

Мы рассмотрели основные способы разработки внешних отчетов при наличии данных в расширениях. Наиболее быстрым и часто используемым является Метод 1 (использование Консоли СКД в режиме Предприятия с последующей загрузкой XML схемы). Он не требует написания лишнего кода и позволяет сразу видеть реальные данные.

Если же отчет планируется тиражировать или передавать другим разработчикам, рекомендуется использовать Метод 2 (программная подмена запроса), чтобы избежать случайной порчи схемы при открытии конструктора в Конфигураторе.

← На главную