При разработке внешних отчетов или переносе старых отчетов из конфигураций предыдущих поколений (например, из 1С:ЗУП 2.5 или 1С:УПП 1.3 в 1С:ЗУП 3.1 / 1С:ERP) разработчики нередко сталкиваются с ситуацией: в отчете не планировалось использовать схему компоновки данных (СКД), однако при его открытии платформа формирует типовой интерфейс СКД и выдает системную ошибку «Не установлена схема компоновки данных».
Разберем причины такого поведения платформы «1С:Предприятие 8.3», выясним, почему отчет не открывает привычный интерфейс, и рассмотрим способы реализации внешних отчетов с собственной формой и произвольным макетом печати.
Проанализируем механику работы управляемого приложения 1С:
Отчет или ВнешнийОтчет явно не создана и не назначена основная управляемая форма, платформа генерирует стандартную форму на лету.ОсновнаяСхемаКомпоновкиДанных. Если схема не создана и поле пустое, платформа не может инициализировать компоновщик настроек и выводит исключение «Не установлена схема компоновки данных».Таким образом, корень проблемы заключается в отсутствии назначенной управляемой формы в свойствах внешнего отчета.
Если для решения задачи требуется полностью произвольный интерфейс и вывод информации в свой табличный документ без использования механизмов компоновки, разберем по шагам, как настроить такой отчет:
Период, Организация, Подразделение), элемент типа Поле табличного документа (например, с именем Результат) и команду Сформировать.Посмотрим на пример базовой серверной процедуры формирования:
&НаСервере
Процедура СформироватьОтчетНаСервере()
// Получаем объект отчета и макет
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
Макет = ОтчетОбъект.ПолучитьМакет("ОсновнойМакет");
ТабДок = Элементы.Результат;
ТабДок.Очистить();
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Выполняем произвольный запрос и обход данных
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Сотрудник,
| Сотрудники.Код КАК Код
|ИЗ
| Справочник.Сотрудники КАК Сотрудники";
Выборка = Запрос.Выполнить().Выбрать();
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Пока Выборка.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
КонецПроцедуры
Если требуется сохранить стандартную командную панель отчета и типовой механизм выбора настроек, но результат необходимо сформировать вручную по собственному макету, рассмотрим переопределение события компоновки.
В этом случае создается минимальная пустая СКД (где можно объявить только параметры, без наборов данных), а в модуле объекта отчета переопределяется стандартная обработка:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отключаем стандартный вывод через СКД
СтандартнаяОбработка = Ложь;
// Очищаем результирующий табличный документ
ДокументРезультат.Очистить();
// Получаем макет и выводим произвольные данные
Макет = ЭтотОбъект.ПолучитьМакет("ПроизвольныйМакет");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ДокументРезультат.Вывести(ОбластьЗаголовок);
// Дополнительный алгоритм заполнения документа...
КонецПроцедуры
Если алгоритм сбора данных слишком сложен для одного запроса (требуются расчеты в коде 1С, чтение внешних файлов или вызовы API), но итоговый отчет должен обладать всеми возможностями СКД (пользовательские группировки, фильтры, условное оформление), лучшим решением будет использование набора данных типа Объект.
Разберем схему работы:
Объект и задаем ему имя, например, ТаблицаДанных. Описываем поля набора.ПриКомпоновкеРезультата программно рассчитываем таблицу значений с аналогичной структурой колонок.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Формируем таблицу значений с данными
ТаблицаДляОтчета = Новый ТаблицаЗначений;
ТаблицаДляОтчета.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
ТаблицаДляОтчета.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
// ... Заполнение таблицы произвольным кодом ...
// Передаем таблицу в СКД
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаДанных", ТаблицаДляОтчета);
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
При подключении внешнего отчета через подсистему «Дополнительные отчеты и обработки» обратим внимание на следующие особенности:
СведенияОВнешнейОбработке() должна возвращать структуру, где свойство Вид имеет значение ДополнительныйОтчет, а команда вызова имеет тип ОткрытиеФормы.СохраняемыеДанные реквизитов формы и событие табличного документа ОбработкаРасшифровки).