Как сохранить внешний отчет, использующий данные расширения конфигурации?

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

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

Подход 1: Разработка схемы компоновки данных в режиме 1С:Предприятие

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

Рассмотрим по шагам, как мы можем реализовать этот подход:

  1. Создание макета СКД в режиме 1С:Предприятие. Начнем с того, что мы будем использовать специализированные инструменты, такие как Консоль отчета или Универсальный отчет (если он позволяет сохранить СКД), которые запускаются в режиме 1С:Предприятие. Это ключевой момент, поскольку именно здесь метаданные расширения будут полностью доступны.
  2. Формирование запроса и настройка СКД. В выбранном инструменте мы можем спокойно писать запросы, используя объекты из расширения. Настраиваем все необходимые элементы СКД: поля, сортировки, группировки, ресурсы, параметры и настройки отчета. Здесь мы видим все наши справочники, документы и регистры, добавленные расширением.
  3. Сохранение макета СКД в файл. После того как схема компоновки данных полностью настроена и протестирована в режиме 1С:Предприятие, мы сохраняем ее в отдельный файл. Обычно это файл в формате XML.
  4. Загрузка макета во внешний отчет в Конфигураторе. Теперь переходим в Конфигуратор, открываем наш внешний отчет и создаем в нем макет типа МакетКомпоновкиДанных. В этот макет мы загружаем сохраненный ранее XML-файл. На этом этапе мы можем получить сообщения об ошибках, указывающие на "неизвестные поля" или "несуществующие метаданные". Не обращаем на них внимания и игнорируем эти предупреждения, так как отчет все равно будет корректно работать в режиме 1С:Предприятие.
  5. Повторение процесса для внесения изменений. Если нам потребуется внести изменения в отчет, процесс повторяется. Мы снова открываем схему СКД в режиме 1С:Предприятие (например, через Консоль отчета), вносим корректировки, сохраняем новый XML-файл и загружаем его во внешний отчет.

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

Подход 2: Включение отчета в состав расширения

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

Проанализируем преимущества:

  1. Полная видимость метаданных. Если отчет является частью расширения, то все объекты этого расширения, а также объекты основной конфигурации, будут полностью доступны для использования в СКД отчета без каких-либо ограничений.
  2. Упрощение разработки. Мы сможем использовать конструктор запросов СКД в Конфигураторе без ухищрений, что значительно ускоряет и упрощает процесс разработки и отладки.
  3. Централизованное управление. Отчет становится частью функционала расширения, что облегчает его развертывание и обновление вместе с расширением.

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

Подход 3: Программное формирование данных для СКД

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

Рассмотрим, как это работает:

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

Пример программной передачи данных в СКД:


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

    // Заполняем ТаблицуДанных
    // ...

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

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

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

    Возврат Результат;
КонецФункции

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

Подход 4: Использование специального синтаксиса в запросах СКД

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

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

Пример запроса:


ВЫБРАТЬ
    Справочник.ИмяСправочникаИзРасширения.Код,
    Справочник.ИмяСправочникаИзРасширения.Наименование
ИЗ
    Справочник.ИмяСправочникаИзРасширения КАК СсылкаНаРасширение

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

Подход 5: Временные изменения основной конфигурации для разработки и отладки (менее рекомендуемый)

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

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

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

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

Общие рекомендации и важные моменты при работе с СКД и расширениями

Давайте подытожим и выделим ключевые моменты, которые помогут нам в работе:

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

Будущие улучшения платформы 1С:Предприятие

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

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

← К списку