Почему при открытии схемы компоновки данных (СКД) в 1С не появляется форма?

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

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

Анализ проблемы: разница между отчетом и обработкой

Проанализируем типовую ситуацию. Разработчик создает файл, помещает туда схему компоновки данных, но ошибочно выбирает тип метаданных Внешняя обработка (файл с расширением .epf) вместо Внешний отчет (файл с расширением .erf).

Рассмотрим подробнее ключевые различия в поведении платформы:

  1. Наличие свойства «Основная схема компоновки данных»: у объекта метаданных «Отчет» и «Внешний отчет» в корне свойств есть системное поле ОсновнаяСхемаКомпоновкиДанных. У обработки такого реквизита нет, схема там может храниться только как один из произвольных макетов конфигурации.
  2. Механизм автогенерации форм: когда в управляемом приложении запускается внешний отчет без собственной формы, платформа автоматически подставляет стандартную общую форму отчета (в типовых конфигурациях на БСП — специализированную общую форму отчетов). В этой форме по умолчанию присутствуют командная панель, кнопка «Сформировать», панель пользовательских настроек и табличный документ. Для внешней обработки автоматическая генерация интерфейса СКД не предусмотрена: если формы нет, платформа открывает пустой диалог без элементов управления.
  3. Смена расширения не решает проблему: простое переименование сохраненного файла с .epf на .erf через проводник Windows не преобразует внутреннюю структуру объекта метаданных. Платформа читает внутренний заголовок файла и по-прежнему считает его обработкой.

Решение 1. Правильное создание внешнего отчета

Самый простой и правильный путь — перенести разработанную схему в правильный тип объекта метаданных. Разберем процесс по шагам:

  1. В конфигураторе откроем исходную обработку и перейдем на вкладку Макеты.
  2. Выделим макет со схемой компоновки данных, откроем его и нажмем кнопку Сохранить схему в файл (выгрузка в формат XML).
  3. В главном меню выберем Файл → Новый....
  4. В появившемся диалоге выберем пункт Внешний отчет (не обработку!).
  5. В окне свойств нового отчета найдем поле Основная схема компоновки данных и нажмем кнопку Открыть.
  6. В открывшемся конструкторе выберем Загрузить схему из файла и укажем сохраненный ранее XML-файл.
  7. Сохраним отчет через меню Файл → Сохранить (будет создан файл с расширением .erf).

При таком подходе создавать форму вручную не обязательно: при открытии отчета в режиме «1С:Предприятие» платформа автоматически подставит интерфейс по умолчанию со всеми отборами и кнопками формирования.

Если внешний отчет подключается через справочник «Дополнительные отчеты и обработки» в типовых решениях (УТ, ERP, КА), добавим в модуль объекта экспортную функцию описания:


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

Решение 2. Программный вывод СКД, если требуется именно обработка

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

Разберем, как вывести результат схемы компоновки данных в табличный документ на форме внешней обработки:

  1. В ветке метаданных обработки создадим новую управляемую форму.
  2. Добавим на форму реквизит ТабличныйДокумент с типом ТабличныйДокумент и перетащим его в элементы формы.
  3. Добавим команду формы СформироватьОтчет и создадим для нее обработчик на клиенте и на сервере.
  4. В модуле формы напишем программный код вывода схемы компоновки данных:

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

&НаКлиенте
Процедура СформироватьОтчет(Команда)
    СформироватьОтчетНаСервере();
КонецПроцедуры

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

← На главную