Пара дифирамбов к компоновке данных в 1С: Предприятие 8


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

Система компоновки данных в 1С: Предприятие 8 — это механизм, который позволяет эффективно настраивать и хранить текст запроса на выборку данных отчета вместе с настройками группировки и отображения данных в табличном документе. При этом, программный интерфейс платформы позволяет обращаться к сохраненным настройкам и методам из любого программного модуля конфигурации.

Задумался об использовании механизма СКД именно в этом ключе я совершенно случайно. Необходимо было написать обработку, которая бы проводила рассылку расчетных листков сотрудникам компании для того, чтобы автоматизировать сам процесс раздачи и, соответственно, формирования протокола получения расчетного листка сотрудником. Проблема, как раз была в том, чтобы выполнить расчет, формирование и сохранение табличного документа с результатами расчетов в формат, для передачи его в качестве приложения к электронному письму. Если решать эту задачу «в лоб», то необходимо было для каждого набора параметров отчета вызывать диалог, производить заполнение реквизитов формы, отправлять на выполнение с сохранением результата в файл. Помимо того, что подобное решение подразумевает контроль открытия диалога формы отчета и потерю производительности на открытие/закрытие диалога, оно просто некрасиво. Найденное решение поражает своей изящностью:

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