Система компоновки данных (СКД) является мощнейшим инструментом в руках разработчика 1С, однако опытные специалисты регулярно сталкиваются с её архитектурными и интерфейсными ограничениями. В данной статье мы проанализируем накопленный опыт сообщества, разберем список наиболее востребованных «хотелок» и рассмотрим практические способы решения текущих проблем при разработке сложных отчетов.
Одной из главных проблем является сложность управления использованием полей, группировок и отборов «на лету». Рассмотрим ситуацию, когда нам нужно включать или выключать определенную группировку в зависимости от значения параметра. На текущий момент это требует написания сложного кода в модуле объекта отчета. Мы же стремимся к тому, чтобы управлять флажком Использование через выражения СКД или булевы параметры.
Пока эта возможность не реализована на уровне платформы, проанализируем стандартный подход через событие ПриКомпоновкеРезультата. Выясним причину, по которой разработчики часто выбирают установку СтандартнаяОбработка = Ложь: это позволяет полностью контролировать настройки компоновщика перед выводом. Однако для простых случаев мы можем программно изменять настройки, не отменяя стандартный вывод, обращаясь к КомпоновщикНастроек.Настройки.
Разберем проблему «десятиэтажных» формул. В текущей реализации СКД нельзя использовать одно вычисляемое поле внутри другого. Это приводит к дублированию кода выражений, что затрудняет поддержку отчета. Рассмотрим пример: если у нас есть поле Цена и поле Количество, а мы хотим вычислить Сумму, а затем на основе Суммы рассчитать НДС, нам приходится в выражении НДС заново прописывать всю формулу суммы.
Для решения этой задачи в актуальных версиях платформы (начиная с 8.3.20) рекомендуется использовать функции в языке запросов. Рассмотрим, как это работает: вы можете описать логику расчета в тексте запроса через оператор ФУНКЦИЯ, а затем вызывать её в нужных местах. Если же ваша версия платформы ниже, единственным выходом остается использование функций общих модулей, передавая в них все необходимые поля как параметры:
// Пример вызова в выражении СКД
ОбщегоНазначения.РассчитатьНалог(ВычисляемоеПолеСумма, ПроцентСтавки)
Проанализируем ситуацию, когда данные для отчета подготавливаются в коде и передаются в СКД через внешние наборы данных или менеджер временных таблиц. Рассмотрим по шагам, как передать МенеджерВременныхТаблиц в процессор компоновки, не переписывая весь механизм вывода отчета вручную. Начиная с версии 8.3.17, это стало проще, но всё еще требует понимания структуры инициализации.
Разберем пример кода для передачи внешних данных:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Подготовка внешнего набора данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаОстатков", ПолучитьТаблицуДанных());
// Инициализация компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Важно помнить, что при использовании менеджера временных таблиц, его нужно передавать вторым параметром в метод Инициализировать процессора компоновки. Это позволяет СКД «видеть» таблицы, созданные в запросе ранее.
Выясним причину, по которой стандартный метод Выгрузить() не всегда подходит для сложных структур. Если отчет представляет собой кросс-таблицу (с группировками в строках и колонках), выгрузка в ТаблицаЗначений превращает её в плоский список. Но иногда нам нужно получить именно результирующую матрицу для дальнейшей обработки.
Рассмотрим алгоритм решения этой задачи:
ТабличныйДокумент.ТаблицаЗначений, где колонки соответствуют динамическим колонкам отчета.Хотя этот метод кажется трудозатратным, он является наиболее надежным способом получения «развернутых» данных кросс-таблицы без использования сложных математических алгоритмов сведения.
Посмотрим на процесс разработки со стороны удобства. Одной из насущных потребностей является возможность видеть итоговый запрос, который СКД генерирует с учетом всех пользовательских отборов. В современных реалиях для этого рекомендуется использовать специализированные консоли СКД (например, из состава инструментов разработчика или расширения с GitHub).
Также проанализируем проблему расшифровки. Получение значений полей в событии ОбработкаРасшифровки часто превращается в квест по поиску нужного идентификатора в структуре ДанныеРасшифровки. Мы рекомендуем использовать механизмы БСП, которые унифицируют этот процесс, предоставляя удобные функции для извлечения значений группировок без ручного разбора макета.
Разберем пожелания к визуальной части: гистограммы в ячейках, спарклайны и цветовые шкалы. В то время как Excel предоставляет это «из коробки», в 1С разработчики вынуждены использовать условное оформление. Выясним, как сделать отчет более наглядным сегодня:
Подводя итог, можно сказать, что СКД продолжает развиваться. Многие функции, которые раньше требовали «костылей» (как, например, функции в запросах), теперь становятся частью платформы. Мы надеемся, что в будущих версиях 1С (8.4 или 9.0) многие из перечисленных доработок станут штатными инструментами, делая разработку отчетов еще более быстрой и приятной.