Почему во внешнем отчете 1С 8.3 возникает ошибка «Не установлена схема компоновки данных» и как сделать отчет без СКД?

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

При разработке внешних отчетов или переносе старых отчетов из конфигураций предыдущих поколений (например, из 1С:ЗУП 2.5 или 1С:УПП 1.3 в 1С:ЗУП 3.1 / 1С:ERP) разработчики нередко сталкиваются с ситуацией: в отчете не планировалось использовать схему компоновки данных (СКД), однако при его открытии платформа формирует типовой интерфейс СКД и выдает системную ошибку «Не установлена схема компоновки данных».

Разберем причины такого поведения платформы «1С:Предприятие 8.3», выясним, почему отчет не открывает привычный интерфейс, и рассмотрим способы реализации внешних отчетов с собственной формой и произвольным макетом печати.

Почему возникает ошибка при открытии отчета

Проанализируем механику работы управляемого приложения 1С:

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

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

Способ 1. Создание собственной управляемой формы (полностью ручной вывод без СКД)

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

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

Посмотрим на пример базовой серверной процедуры формирования:


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

Способ 2. Переопределение события «ПриКомпоновкеРезультата» в модуле объекта

Если требуется сохранить стандартную командную панель отчета и типовой механизм выбора настроек, но результат необходимо сформировать вручную по собственному макету, рассмотрим переопределение события компоновки.

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


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

Способ 3. Выгрузка данных в СКД через внешний набор данных

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

Разберем схему работы:

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

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

Важные нюансы регистрации отчета в типовых конфигурациях (БСП)

При подключении внешнего отчета через подсистему «Дополнительные отчеты и обработки» обратим внимание на следующие особенности:

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