При разработке отчетов на базе системы компоновки данных (СКД) разработчики периодически сталкиваются с ситуацией: в конфигураторе создан запрос, настроены поля и группировки, однако при открытии файла в режиме «1С:Предприятие» (например, в «Управление торговлей 11») окно формы либо оказывается совершенно пустым, либо форма не отображается вовсе. Разберем по шагам, почему возникает эта проблема, как устроена генерация форм в платформе 1С и как правильно исправить ошибку.
Проанализируем типовую ситуацию. Разработчик создает файл, помещает туда схему компоновки данных, но ошибочно выбирает тип метаданных Внешняя обработка (файл с расширением .epf) вместо Внешний отчет (файл с расширением .erf).
Рассмотрим подробнее ключевые различия в поведении платформы:
ОсновнаяСхемаКомпоновкиДанных. У обработки такого реквизита нет, схема там может храниться только как один из произвольных макетов конфигурации..epf на .erf через проводник Windows не преобразует внутреннюю структуру объекта метаданных. Платформа читает внутренний заголовок файла и по-прежнему считает его обработкой.Самый простой и правильный путь — перенести разработанную схему в правильный тип объекта метаданных. Разберем процесс по шагам:
.erf).При таком подходе создавать форму вручную не обязательно: при открытии отчета в режиме «1С:Предприятие» платформа автоматически подставит интерфейс по умолчанию со всеми отборами и кнопками формирования.
Если внешний отчет подключается через справочник «Дополнительные отчеты и обработки» в типовых решениях (УТ, ERP, КА), добавим в модуль объекта экспортную функцию описания:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Назначение.Добавить("");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Мой внешний отчет";
Команда.Идентификатор = "ОсновнаяКоманда";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Бывают ситуации, когда логика задачи требует использовать именно внешнюю обработку (например, при сложной обработке данных перед формированием или при встраивании отчета во вспомогательную утилиту). В этом случае форму и вывод схемы компоновки данных необходимо реализовать программно.
Разберем, как вывести результат схемы компоновки данных в табличный документ на форме внешней обработки:
ТабличныйДокумент с типом ТабличныйДокумент и перетащим его в элементы формы.СформироватьОтчет и создадим для нее обработчик на клиенте и на сервере.
&НаСервере
Процедура СформироватьОтчетНаСервере()
// Очищаем табличный документ перед формированием
ТабличныйДокумент.Очистить();
// Получаем схему компоновки из макетов обработки
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
СхемаКомпоновкиДанных = ОбработкаОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Загружаем настройки по умолчанию
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновкиДанных,
Настройки,
,
,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
);
// Выполняем компоновку данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Выводим результат в поле табличного документа на форме
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
&НаКлиенте
Процедура СформироватьОтчет(Команда)
СформироватьОтчетНаСервере();
КонецПроцедуры
Таким образом, если цель разработки — получить стандартный отчет с привычным интерфейсом платформы без лишнего кода, следует всегда использовать объект метаданных Внешний отчет.