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