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

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

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

Принципы работы группировок в запросах

На уровне языка запросов сворачивание списка достигается использованием оператора СГРУППИРОВАТЬ ПО. Этот оператор указывает системе, по каким полям необходимо объединить строки результата. Все поля, не попавшие в список группировки, должны быть обязательно обработаны агрегатными функциями, такими как СУММА, МИНИМУМ, МАКСИМУМ или СРЕДНЕЕ.

Рассмотрим базовый пример. Если у вас есть таблица продаж, где один и тот же товар продан несколько раз в разные дни, и вы хотите получить общую сумму продаж по каждому товару, вам нужно сгруппировать данные по номенклатуре. При этом количество продаж и сумма будут просуммированы. Синтаксически это выглядит следующим образом:

ВЫБРАТЬ

Продажи.Номенклатура,

СУММА(Продажи.Количество) КАК КоличествоИтого,

СУММА(Продажи.Сумма) КАК СуммаИтого

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Продажи

СГРУППИРОВАТЬ ПО

Продажи.Номенклатура

Важно понимать, что тип данных в результирующем списке может измениться. Например, если вы используете функцию МИНИМУМ для даты, тип останется датой, но значение станет самым ранним в группе. Агрегатные функции игнорируют значения NULL, что иногда может привести к неожиданным результатам, если не контролировать заполненность полей в исходных данных.

💡

Используйте оператор «ЕСТЬ NULL» в условиях отбора перед группировкой, чтобы исключить пустые значения, которые могут исказить результаты расчетов среднего или минимума.

При формировании сложных запросов с несколькими уровнями вложенности порядок группировки имеет значение. Сначала выполняется фильтрация данных в блоке ГДЕ, затем происходит объединение таблиц, и только после этого применяется СГРУППИРОВАТЬ ПО. Нарушение этой логической последовательности в уме разработчика часто приводит к ошибкам синтаксиса.

Настройка сворачивания в Системе Компоновки Данных

В современных конфигурациях, таких как 1С:Бухгалтерия или 1С:Управление торговлей, основная работа с отчетами ведется через СКД. Здесь процесс сворачивания визуализирован и не требует написания кода вручную. Пользователь настраивает структуру отчета, определяя, какие поля становятся измерениями, а какие — ресурсами.

Измерения — это поля, по которым происходит группировка (аналог СГРУППИРОВАТЬ ПО). Ресурсы — это числовые поля, которые автоматически сворачиваются с помощью функций агрегации. Чтобы настроить отчет, перейдите в редактор макета и откройте вкладку «Настройки». В дереве настроек вы увидите список полей, доступных для добавления.

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

  • 📊 Сумма — складывает все значения в группе, используется для итоговых оборотов.
  • 📉 Среднее — вычисляет среднее арифметическое, полезно для анализа цен или курсов.
  • 🔢 Количество — подсчитывает число записей в группе, игнорируя значения полей.
  • 📅 Мин/Макс — находит крайние значения дат или номеров документов.

Одной из мощных возможностей СКД является возможность создания нескольких уровней группировки. Вы можете сначала сгруппировать данные по контрагентам, а внутри каждого контрагента — по номенклатурным группам. Это создает иерархическую структуру отчета, которую можно разворачивать и сворачивать прямо в форме вывода.

📊 Какой инструмент вы используете для группировки чаще?
Конструктор запросов
СКД (отчеты)
Табличный документ вручную
Внешние обработки

Использование агрегатных функций и вычисляемых полей

Часто стандартных функций недостаточно для решения специфических бизнес-задач. В таких случаях приходится создавать вычисляемые поля, которые затем участвуют в сворачивании. Например, может потребоваться рассчитать маржу как разницу между суммой продажи и себестоимостью, а затем просуммировать эту маржу по менеджерам.

В запросе это реализуется через вложенные запросы или использование оператора ВЫРАЗИТЬ для приведения типов перед суммированием. В СКД вычисляемые поля создаются в одноименной вкладке настроек. Важно следить за тем, чтобы выражение возвращало тип данных, поддерживающий агрегацию.

⚠️ Внимание! При использовании вычисляемых полей в ресурсах убедитесь, что формула не содержит ссылок на другие ресурсы с функциями агрегации внутри агрегации (например, СУММА(СУММА(...))), так как это вызовет ошибку выполнения отчета.

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

Функция Входной тип Результирующий тип Особенности
СУММА Число, Количество Число Игнорирует NULL
СРЕДНЕЕ Число, Дата, Время Соответствует входному Может дать дробное число
МИНИМУМ Любой сравниваемый Соответствует входному Работает со строками (лексикографически)
РАЗНОСТЬ Дата, Время Число (секунды/дни) Требует два поля для сравнения

Особое внимание следует уделить функции ЕСТЬ. Она возвращает булево значение (Истина/Ложь) в зависимости от того, заполнено ли поле хотя бы в одной строке группы. Это полезно для формирования флагов наличия определенных характеристик у группы товаров.

Нюансы работы с типом «Строка»

При сворачивании строковых полей через МИНИМУМ или МАКСИМУМ сравнение идет посимвольно. Строка "А100" может оказаться меньше, чем "А20", так как символ "1" меньше символа "2".

Обработка пустых значений и дублей

Проблема дублирования строк в сводных отчетах часто связана с неправильным выбором полей для группировки. Если вы добавили в измерения поле с уникальным идентификатором (например, Ссылка на документ или УникальныйИдентификатор), сворачивание не произойдет, так как каждая строка будет считаться уникальной группой.

Чтобы избежать этого, необходимо анализировать структуру данных. Часто дубли возникают из-за того, что в выборку попали регистры с разными видами движений или разные таблицы частей документов. Использование оператора РАЗЛИЧНЫЕ перед полями выборки может помочь на этапе формирования исходного набора данных, но не заменит группировку.

Пустые значения (NULL) в полях группировки обрабатываются как отдельная группа. В визуальных отчетах это может выглядеть как пустая строка в начале или конце списка. Для очистки отчета от таких строк рекомендуется использовать отборы в настройках СКД с условием «Поле НЕ РАВНО ПустаяСсылка» или аналогичным для других типов.

  • 🔍 Проверьте, не попали ли в измерения ссылки на документы вместо видов движений.
  • ⚙️ Используйте отбор по периоду, чтобы исключить «вечные» записи с некорректными датами.
  • 🧹 Применяйте функцию ЕСТЬ для контроля заполнения обязательных полей в группе.

В некоторых случаях требуется явное приведение типов перед группировкой. Например, если поле хранит число в виде строки, суммирование не сработает корректно. Используйте функцию ЧИСЛО() в выражении вычисляемого поля перед добавлением его в ресурсы.

Оптимизация производительности при свертке больших объемов

Сворачивание больших списков значений — ресурсоемкая операция. Если в выборку попадает миллион строк детальных записей, а затем они группируются в сотню итоговых строк, нагрузка на сервер 1С и СУБД может быть критической. Оптимизация начинается с правильного использования индексов.

Поля, участвующие в СГРУППИРОВАТЬ ПО и в условиях соединения (ЛЕВОЕ СОЕДИНЕНИЕ), должны быть индексированы. В конфигураторе проверьте настройки индексов для используемых таблиц и регистров. Отсутствие индекса по полю группировки приведет к полному сканированию таблицы (Full Table Scan), что резко замедлит формирование отчета.

💡

Главный принцип оптимизации: фильтруйте данные как можно раньше. Используйте отборы в первом же запросе, чтобы уменьшить количество строк, подлежащих последующей группировке.

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

⚠️ Внимание! Интерфейс и возможности конструктора могут отличаться в разных версиях платформы 1С (8.2, 8.3, 8.3.20+). Всегда сверяйте доступные функции в справке по вашей конкретной версии платформы, так как синтаксис некоторых агрегатных функций мог быть расширен в новых релизах.

Для очень больших отчетов рассмотрите использование итогов регистров. Если данные уже агрегированы на уровне записи в регистре накопления (например, остатки товаров), то запрос к таблице итогов (РегистрНакопления.ОстаткиТоваров.Остатки) будет работать мгновенно, так как сворачивание уже выполнено при проведении документов.

Типичные ошибки и способы их устранения

Наиболее частая ошибка новичков — попытка свернуть список, добавив в измерения лишние поля. Например, при группировке по номенклатуре случайно добавляют «Единицу измерения». Если у товара есть разные единицы (шт и кг), он не свернется в одну строку, а разобьется на две. Решение: убрать лишнее поле из группировки и привести все количества к базовой единице перед суммированием.

Другая распространенная проблема — несовместимость типов при объединении результатов. Если вы используете ОБЪЕДИНИТЬ ВСЕ перед группировкой, убедитесь, что типы полей в разных частях запроса совпадают. Явное приведение типов через ВЫРАЗИТЬ... КАК спасет от ошибок выполнения.

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

☑️ Диагностика проблем со сверткой

Выполнено: 0 / 4

Помните, что система 1С позволяет гибко управлять представлением данных. Если стандартные средства сворачивания не дают нужного формата, всегда можно использовать программную обработку в модуле объекта или внешнюю обработку для пост-процессинга данных, хотя это и менее производительный путь.

Можно ли свернуть список значений без использования запроса?

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

Почему в отчете СКД не сворачиваются строки, хотя настройки верны?

Чаще всего причина в том, что в структуру отчета добавлено поле с уникальным значением (например, UUID документа или точное время до миллисекунд). Проверьте дерево настроек и уберите поля, которые делают каждую строку уникальной, из группы «Строки».

Как свернуть данные по периоду (например, по месяцам)?

Используйте функцию НАЧАЛОПЕРИОДА или КОНЕЦПЕРИОДА в выражении поля группировки. Например, НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) приведет все даты месяца к первому числу, что позволит сгруппировать продажи по месяцам.

В чем разница между «Обычной группировкой» и «Итоги» в СКД?

Обычная группировка создает новый уровень иерархии в отчете (вложенные строки). Настройка «Итоги» добавляет общую сводную строку в конце или начале отчета, суммируя все данные без создания дополнительной вложенной структуры измерений.

Можно ли использовать пользовательские функции в агрегации?

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