Как создавать сложные отчеты на СКД в 1С: продвинутые приемы, связи и тонкости настройки

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

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

1. Архитектура запросов: когда использовать соединения, а когда объединения

Один из главных секретов производительности и корректности сложных отчетов заключается в правильном выборе метода компоновки данных еще на этапе написания запроса:

  1. Левое соединение (LEFT JOIN) в тексте запроса: рекомендуется использовать только для сильно связанных данных, где отношение строго фиксировано или является связью «многие-к-одному» (например, Номенклатура + Цены + Курсы валют). Если соединять таблицы со связью «один-ко-многим», происходит размножение строк, что приводит к искажению общих итогов по ресурсам.
  2. Объединение (UNION ALL) в запросе: оптимальный подход для работы со слабо связанными данными или разными финансовыми потоками (например, Остатки + Продажи + Закупки). Каждая таблица выбирает свои показатели, а пустые поля заполняются нулями или значениями по умолчанию. СКД автоматически сгруппирует данные по общим измерениям и корректно посчитает итоги без риска дублирования.

2. Связи наборов данных в СКД и тонкости расчета общих итогов

Использование вкладки «Связи наборов данных» позволяет выполнять соединения источников на уровне платформы. Это особенно эффективно, когда требуется связать данные по датам документов или связать объектные данные с независимыми виртуальными таблицами.

Рассмотрим специфику и ограничения работы со связями наборов данных:

  1. Связи по периодам и датам: в окне связи наборов данных можно передавать параметры из источника в набор-приемник, что дает возможность точечно выбирать срезы последних или остатки на конкретный момент времени для каждой строки.
  2. Проблема расчета общих итогов при левом соединении: если левое соединение выполнено внутри текста запроса СУБД, при установке пользователем отборов по вложенным группировкам или ресурсам общий итог может рассчитаться некорректно. Использование связей наборов данных СКД позволяет изолировать расчет итогов для каждого источника.
  3. Передача параметров: в выражении источника и приемника при настройке связей можно использовать функции языка выражений СКД (например, ЕСТЬNULL или преобразования типов).

3. Расширенные возможности языка выражений СКД

Язык выражений СКД позволяет выполнять сложные вычисления непосредственно при формировании отчета, избавив запрос от громоздких подзапросов.

Нарастающие итоги и динамика:

Для вычисления нарастающего итога без изменения запроса используется функция ВычислитьВыражение:

ВычислитьВыражение("Сумма(СуммаОборот)", , , "Первая", "Текущая")

Для получения значения из предыдущей строки (например, при расчете прироста или отклонения) применяется следующая конструкция:

ВычислитьВыражение("Сумма(СуммаОборот)", , , "Предыдущая", "Предыдущая")

Агрегация по вложенным группировкам:

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

Максимум(ВычислитьВыражениеСГруппировкойМассив("Сумма(СуммаОборот)", "Номенклатура"))

4. Управление отображением полей и сквозная нумерация группировок

Частая задача при верстке отчетов для экономистов — выводить определенные поля или их нумерацию строго на верхнем уровне группировки, скрывая их в детальных записях.

  1. Настройка вывода ресурсов по уровням: На вкладке «Ресурсы» в колонке Рассчитывать по... можно строго указать группировки, в которых будет вычисляться и выводиться показатель. Если убрать галочку с уровня детальных записей, поле скроется в деталях, но отобразится в итогах.
  2. Нумерация группировок верхнего уровня: Системное поле СистемноеПоле.НомерПоПорядкуВГруппировке следует добавлять не в общие выбранные поля отчета, а непосредственно в список выбранных полей конкретной группировки верхнего уровня.
  3. Сквозной номер через выражения: Если требуется сквозной номер без сброса по иерархии, можно настроить вычисляемое поле-ресурс с выражением:
    ВычислитьВыражение("Авто", , "ОбщийИтог", "ПерваяЗапись", "ТекущаяЗапись")
  4. Условное оформление по уровням: Для скрытия текста ячеек на детальном уровне в условиях оформляемого поля применяется системное поле СистемноеПоле.Уровень.

5. Использование пользовательских макетов и программная пост-обработка (BSL)

Когда встроенных механизмов оформления не хватает, применяют встроенные макеты компоновки или программный вывод.

Собственные макеты СКД:

На вкладке «Макеты» можно переопределить макет поля, группировки или подвала. В параметрах макета с помощью функции СтрШаблон можно объединять значения нескольких полей в одну ячейку. Чтобы стандартные стили оформления платформы не искажали пользовательский макет, в настройках группировки параметр Макет оформления рекомендуется установить в значение Без оформления.

Программная обработка готового отчета:

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


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

КонецПроцедуры

Проанализировав данные подходы, мы видим, что мастерство разработки сложных отчетов на СКД строится на комбинировании возможностей языка запросов, правильном использовании языков выражений компоновки и грамотной настройке связей наборов данных.

← На главную