Как сформировать отчет на СКД по текущим данным табличной части документа?

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

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

Метод 1. Использование внешнего набора данных (Набор данных - объект)

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

Шаг 1. Настройка схемы СКД

В схеме компоновки данных вместо привычного НаборДанныхЗапрос необходимо создать НаборДанныхОбъект. В поле Имя объекта содержащего данные следует вписать идентификатор, например, ТаблицаДанныхТЧ. Важно заранее вручную описать все поля (имя и тип), которые вы планируете передавать из табличной части, иначе СКД не сможет построить группировки и итоги.

Шаг 2. Программный вызов отчета из формы

Разберем пример кода, который выгружает данные табличной части в таблицу значений и передает её в процессор компоновки:


// В модуле формы документа
&НаКлиенте
Процедура СформироватьОтчетПоТЧ(Команда)
    ДанныеТЧ = ЭтаФорма.Объект.Товары.Выгрузить();
    ПараметрыОтчета = Новый Структура("ВнешниеНаборыДанных", Новый Структура("ТаблицаДанныхТЧ", ДанныеТЧ));
    ОткрытьФорму("Отчет.МойОтчетПоТЧ.Форма", ПараметрыОтчета);
КонецПроцедуры

Шаг 3. Обработка в модуле отчета

В форме отчета или в его модуле необходимо перехватить переданные данные и инициализировать компоновку:


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

Метод 2. Менеджер временных таблиц (Advanced Query)

Если вам нужно не просто вывести строки ТЧ, а соединить их с другими данными из базы (например, получить остатки или цены), лучше использовать МенеджерВременныхТаблиц. Рассмотрим, как это работает.

Проанализируем алгоритм:

  1. Выгружаем данные формы в таблицу значений.
  2. Создаем запрос и помещаем эту таблицу во временную таблицу (ВТ).
  3. Передаем менеджер этого запроса в процессор компоновки данных.

В самой схеме СКД вы пишите обычный НаборДанныхЗапрос, обращаясь к таблице ВТ_ДанныеТЧ, как если бы она существовала в базе. Это позволяет использовать всю мощь языка запросов 1С.


Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ВТ_ДанныеТЧ ИЗ &ТЗ КАК ТЗ";
Запрос.УстановитьПараметр("ТЗ", ТаблицаДанныхДокумента);
Запрос.Выполнить();

// При инициализации процессора компоновки передаем менеджер
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Ложь, , Запрос.МенеджерВременныхТаблиц);

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

Метод 3. Интеграция через БСП (Библиотека стандартных подсистем)

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

Выясним преимущества этого способа:

Для реализации в модуле менеджера объекта необходимо прописать процедуру ДобавитьКомандыПечати и в обработчике указать тип вывода ОтчетСКД. Если данные не записаны, БСП позволяет передать текущее состояние объекта в структуру параметров печати.

Метод 4. Программная передача ссылки как параметра

Если требование работать с "несохраненными" данными не является критичным, и отчет должен просто открываться по текущему документу, рассмотрим самый простой вариант — передачу ссылки.

В схеме СКД создаем параметр СсылкаНаДокумент и устанавливаем его в настройках отбора. При вызове отчета из формы документа используем следующий код:


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

Подведем итог: для оперативного анализа данных "на лету" лучше всего подходит Метод 1 с внешним набором данных. Если требуется сложная аналитика с привлечением данных из регистров — выбирайте Метод 2. Для типовых решений и поддержки стандарта конфигурации наиболее правильным будет использование Метода 3 через механизмы БСП.

← На главную