Программное формирование отчёта на СКД

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

 

Зачем программировать СКД?

Какие случаи требуют программного формирования отчёта СКД? Это такие случаи как:

  • Специфические свойства табличного документа при формировании или выводе на печать;
  • Необходимость формирования отчёта на основе внешних данных;
  • Особое управление входными параметрами данных отчёта;
  • Необходимость по-особому развёртывать/свёртывать группы строк/столбцов отчёта;
  • Динамическое изменение параметров формирования отчёта и/или структуры вывода группировок по отчёту в зависимости от входных параметров.

 

Как создать программируемый отчёт СКД?

Для того, чтобы создать программируемый отчёт СКД необходимо:

1. Создать сам отчёт (внешний или внутренний) в системе 1С.

2. В отчёте создать Схему Компоновки Данных.


 

3. Создать форму отчёта с использованием Системы Компоновки Данных.


 

4. Назначить свой обработчик для кнопки «Сформировать».


 

5. В модуле формы отчёта прописать необходимый код.


 

Какой нужно написать код 1С?

В модуле формы отчёта я рекомендую написать следующий код:

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

 

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

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


Процедура
ДополнитьПараметрыКомпоновки(МакетКомпоновки)
  ДобавитьПараметрКомпоновки(МакетКомпоновки, «НачалоПериода», Дата(‘00010101’));
  ДобавитьПараметрКомпоновки(МакетКомпоновки, «КонецПериода», Дата(‘00010101’));
КонецПроцедуры


Процедура
ДобавитьПараметрКомпоновки(МакетКомпоновки, Имя, Значение)
Если
МакетКомпоновки.ЗначенияПараметров.Найти(Имя) = Неопределено Тогда
    ПараметрКомпоновки = МакетКомпоновки.ЗначенияПараметров.Добавить();
    ПараметрКомпоновки.Имя = Имя;
    ПараметрКомпоновки.Значение = Значение;
КонецЕсли;
КонецПроцедуры

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