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

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

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

Суть метода Свернуть и его параметры

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

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

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

💡

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

Базовый синтаксис и простые примеры

Рассмотрим простейший сценарий, когда у нас есть таблица с продажами, где строки дублируются по номенклатуре, но разбиты по разным документам реализации. Наша задача — получить общий объем продаж по каждому товару. Для этого мы передадим имя колонки "Номенклатура" в качестве первого аргумента.

ТЗ.Свернуть("Номенклатура");

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

Более сложный пример подразумевает группировку по нескольким измерениям. Например, нам нужно узнать продажи не просто по товару, а по товару в разрезе склада. В таком случае параметры метода разделяются запятой.

ТЗ.Свернуть("Номенклатура, Склад", "Количество, Сумма");

Здесь мы явно указываем, какие поля нужно суммировать. Это хорошая практика программирования в , так как она делает код самодокументируемым. Вы сразу видите, какие данные агрегируются, а какие служат ключами для группировки.

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

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

Управление итогами и детализация данных

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

Для добавления общего итога в конец таблицы используется конструкция, где после описания полей группировки указывается блок итогов. Например, если мы хотим сгруппировать данные по контрагентам и получить общую сумму в конце, код будет выглядеть следующим образом:

ТЗ.Свернуть("Контрагент", "СуммаДО, СуммаПО");

Но для получения именно итоговой строки "Всего" необходимо использовать расширенный синтаксис. Если в строке параметров указать ИТОГИ без полей группировки в этом блоке, система добавит строку с суммами по всем числовым колонкам. Это особенно полезно при формировании печатных форм, где требуется видеть "подвал" документа.

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

Также существует возможность получения итогов по каждому полю группировки отдельно. Это создает иерархическую структуру данных, напоминающую дерево. Такой подход часто используется в отчетах типа "Анализ продаж", где пользователь может сворачивать и разворачивать группы прямо в интерфейсе.

📊 Какой метод агрегации вы используете чаще?
Свернуть()
Группировка в запросе
Цикл с поиском
Консоль запросов

Работа с нечисловыми полями при свертке

Частая проблема возникает, когда в таблице присутствуют поля, которые не являются числовыми и не входят в поля группировки. Например, колонка "Комментарий" или "Ответственный". При стандартной свертке такие поля могут быть утеряны или заполнены произвольным значением из первой строки группы.

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

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

Тем не менее, для чисто программной обработки внутри метод Свернуть остается самым быстрым решением. Главное — четко понимать, какие данные являются измерениями, а какие — ресурсами.

Нюанс работы с датой

Если вы группируете по дате, убедитесь, что время обнулено. Иначе строки с одной датой, но разным временем (10:00 и 11:00) не свернутся в одну группу. Используйте функцию НачалоДня() перед записью в таблицу.

Сравнение со сверткой через запрос

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

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

Ниже приведена сравнительная таблица, помогающая выбрать правильный инструмент для вашей задачи:

Критерий Метод ТаблицаЗначений.Свернуть() Оператор ЗАПРОС ... ГРУППИРОВКА
Источник данных Только память (объект 1С) База данных или временная таблица
Производительность Высокая для малых/средних наборов Высокая для больших объемов (работа на сервере БД)
Гибкость итогов Удобное получение общих итогов Требует использования UNION или РАЗРЕШЕННЫЕ
Сложность кода Одна строка кода Требует написания текста запроса

Использование ТаблицаЗначений.Свернуть() оправдано в случаях пост-обработки данных, полученных из разных источников, когда сведение их в единый запрос затруднено или невозможно.

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

При работе со сверткой разработчики часто допускают ряд ошибок, которые приводят к некорректным отчетам. Самая распространенная из них — попытка свернуть таблицу, в которой есть поля с типом ХранилищеЗначения или сложные объекты. Такие поля не поддерживают операцию суммирования, и выполнение кода прервется ошибкой.

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

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

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

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

💡

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

Часто задаваемые вопросы (FAQ)

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

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

Что произойдет, если не указать второй параметр (поля итогов) в методе Свернуть?

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

Как получить только итоговую строку без детальных записей?

Метод Свернуть всегда возвращает детали вместе с итогами. Чтобы получить только общую сумму, проще использовать агрегатную функцию в запросе или пройти циклом по таблице после свертки, если она содержит всего одну итоговую строку.

Можно ли использовать свертку для объединения строк с текстовыми комментариями?

Нет, стандартный метод Свернуть предназначен для арифметического суммирования. Для объединения текста (конкатенации) необходимо использовать запрос с функцией или писать ручной цикл по таблице значений.