Какие доработки необходимы для СКД и как решать текущие ограничения системы

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

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

1. Программное и параметрическое управление настройками компоновки

Одной из главных проблем является сложность управления использованием полей, группировок и отборов «на лету». Рассмотрим ситуацию, когда нам нужно включать или выключать определенную группировку в зависимости от значения параметра. На текущий момент это требует написания сложного кода в модуле объекта отчета. Мы же стремимся к тому, чтобы управлять флажком Использование через выражения СКД или булевы параметры.

Пока эта возможность не реализована на уровне платформы, проанализируем стандартный подход через событие ПриКомпоновкеРезультата. Выясним причину, по которой разработчики часто выбирают установку СтандартнаяОбработка = Ложь: это позволяет полностью контролировать настройки компоновщика перед выводом. Однако для простых случаев мы можем программно изменять настройки, не отменяя стандартный вывод, обращаясь к КомпоновщикНастроек.Настройки.

2. Рекурсивные вычисляемые поля и сложные формулы

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

Для решения этой задачи в актуальных версиях платформы (начиная с 8.3.20) рекомендуется использовать функции в языке запросов. Рассмотрим, как это работает: вы можете описать логику расчета в тексте запроса через оператор ФУНКЦИЯ, а затем вызывать её в нужных местах. Если же ваша версия платформы ниже, единственным выходом остается использование функций общих модулей, передавая в них все необходимые поля как параметры:


// Пример вызова в выражении СКД
ОбщегоНазначения.РассчитатьНалог(ВычисляемоеПолеСумма, ПроцентСтавки)

3. Работа с внешними наборами данных и временными таблицами

Проанализируем ситуацию, когда данные для отчета подготавливаются в коде и передаются в СКД через внешние наборы данных или менеджер временных таблиц. Рассмотрим по шагам, как передать МенеджерВременныхТаблиц в процессор компоновки, не переписывая весь механизм вывода отчета вручную. Начиная с версии 8.3.17, это стало проще, но всё еще требует понимания структуры инициализации.

Разберем пример кода для передачи внешних данных:


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

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

4. Выгрузка кросс-таблиц в таблицу значений

Выясним причину, по которой стандартный метод Выгрузить() не всегда подходит для сложных структур. Если отчет представляет собой кросс-таблицу (с группировками в строках и колонках), выгрузка в ТаблицаЗначений превращает её в плоский список. Но иногда нам нужно получить именно результирующую матрицу для дальнейшей обработки.

Рассмотрим алгоритм решения этой задачи:

  1. Выводим результат компоновки в скрытый или временный ТабличныйДокумент.
  2. Проходим циклом по областям табличного документа, считывая заголовки колонок и строк.
  3. Программно формируем новую ТаблицаЗначений, где колонки соответствуют динамическим колонкам отчета.

Хотя этот метод кажется трудозатратным, он является наиболее надежным способом получения «развернутых» данных кросс-таблицы без использования сложных математических алгоритмов сведения.

5. Улучшение UX редактора и отладка запросов

Посмотрим на процесс разработки со стороны удобства. Одной из насущных потребностей является возможность видеть итоговый запрос, который СКД генерирует с учетом всех пользовательских отборов. В современных реалиях для этого рекомендуется использовать специализированные консоли СКД (например, из состава инструментов разработчика или расширения с GitHub).

Также проанализируем проблему расшифровки. Получение значений полей в событии ОбработкаРасшифровки часто превращается в квест по поиску нужного идентификатора в структуре ДанныеРасшифровки. Мы рекомендуем использовать механизмы БСП, которые унифицируют этот процесс, предоставляя удобные функции для извлечения значений группировок без ручного разбора макета.

6. Новые горизонты визуализации

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

Подводя итог, можно сказать, что СКД продолжает развиваться. Многие функции, которые раньше требовали «костылей» (как, например, функции в запросах), теперь становятся частью платформы. Мы надеемся, что в будущих версиях 1С (8.4 или 9.0) многие из перечисленных доработок станут штатными инструментами, делая разработку отчетов еще более быстрой и приятной.

← На главную