К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как свернуть таблицу значений по колонке в 1С

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

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

Метод встроен в платформу и работает на любом релизе 1С:Предприятие 8, как в обычных, так и в управляемых формах, на клиенте и на сервере. Он изменяет таблицу «на месте», поэтому важно понимать, что происходит с исходными данными, и уметь проверять результат.

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

Синтаксис метода Свернуть()

Метод вызывается у объекта типа «ТаблицаЗначений» и принимает два необязательных параметра:

Таблица.Свернуть(КолонкиГруппировки, КолонкиСуммирования);

КолонкиГруппировки — строка с именами колонок через запятую, по которым объединяются строки. Строки с одинаковым сочетанием значений в этих колонках схлопываются в одну. КолонкиСуммирования — строка с именами числовых колонок, значения которых суммируются внутри каждой группы. Если второй параметр не указан, метод просто удаляет дубли строк по колонкам группировки.

Важные особенности поведения метода:

  • метод изменяет саму таблицу, а не возвращает новую — возвращаемого значения у него нет;
  • колонки, не входящие ни в группировку, ни в суммирование, удаляются из таблицы после сворачивания;
  • суммировать можно только колонки с числовым типом, иначе получите ошибку или некорректный результат;
  • порядок строк в результате не гарантирует исходную сортировку — при необходимости отсортируйте таблицу после сворачивания.

Простой пример: свернуть по одной колонке

Типовая задача: есть таблица продаж с колонками «Контрагент», «Документ», «Сумма». Нужно получить итог продаж по каждому контрагенту без детализации до документов.

// Исходная таблица: Контрагент, Документ, Сумма

// Сворачиваем по контрагенту, суммируя суммы

ТаблицаПродаж.Свернуть("Контрагент", "Сумма");

// После вызова в таблице останутся только две колонки:

// Контрагент и Сумма (с итогом по каждому контрагенту)

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

Чтобы получить только уникальные значения без суммирования (аналог «РАЗЛИЧНЫЕ» в запросе), вызовите метод с одним параметром:

// Оставить только уникальные сочетания Склад + Номенклатура

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

Порядок действий при сворачивании
  1. 1
    Определите, по каким колонкам нужно группировать строки
  2. 2
    Определите, какие числовые колонки должны суммироваться
  3. 3
    При необходимости сохраните копию исходной таблицы через Скопировать()
  4. 4
    Вызовите Свернуть(КолонкиГруппировки, КолонкиСуммирования)
  5. 5
    Проверьте результат: количество строк, итоги по суммируемым колонкам
  6. 6
    Отсортируйте таблицу методом Сортировать(), если важен порядок строк

Сворачивание по нескольким колонкам

Группировка по нескольким измерениям выполняется перечислением колонок через запятую в первом параметре. Например, нужны итоги продаж в разрезе «Склад + Номенклатура» с суммированием количества и суммы:

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

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

Обратите внимание на нюанс с пробелами: имена колонок в строке параметров отделяются запятыми, пробелы после запятой платформа обрабатывает корректно, но лишние пробелы внутри имени колонки приведут к ошибке «Колонка не найдена». Имена должны точно совпадать с именами, заданными при создании колонок.

Сохранение исходной таблицы

Так как метод разрушает исходную структуру, перед сворачиванием часто делают копию:

ТаблицаИтогов = ТаблицаДетально.Скопировать();

ТаблицаИтогов.Свернуть("Контрагент", "Сумма");

// ТаблицаДетально осталась нетронутой

Метод Скопировать() создаёт полную независимую копию данных. Для больших таблиц учитывайте расход памяти: копия дублирует все строки.

Сворачивание таблицы частей запроса и альтернативы

Метод Свернуть() — не единственный способ агрегации. Если данные извлекаются из базы запросом, группировку эффективнее выполнить на уровне запроса:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Продажи.Контрагент КАК Контрагент,

| СУММА(Продажи.СуммаОборот) КАК Сумма

|ИЗ

| РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи

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

| Продажи.Контрагент";

Группировка в запросе выполняется на сервере СУБД и не требует перекачки детальных строк в память приложения. Для больших объёмов это принципиально быстрее, чем выгрузить миллион строк в таблицу значений и потом сворачивать её кодом.

Способы агрегации данных в 1С

Метод Свернуть()

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

СГРУППИРОВАТЬ ПО в запросе

Оптимально при выборке из базы: быстрее, поддерживает СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ. Ограничение: работает только с данными, доступными в запросе.

Сводная таблица / СКД

Для интерактивной аналитики и отчётов, где пользователь сам меняет группировки. Избыточно для разовой программной агрегации в коде.

Типичные ошибки при сворачивании

Большинство проблем со сворачиванием связано с непониманием того, как метод обрабатывает колонки и типы данных. Разберём частые сценарии.

Потеря нужных колонок. Разработчик сворачивает таблицу и обнаруживает, что колонка «СтавкаНДС» исчезла. Это штатное поведение: всё, что не указано в параметрах, удаляется. Если колонка нужна и её значение одинаково внутри группы — включите её в перечень колонок группировки.

Попытка суммировать нечисловую колонку. Если колонка суммирования имеет составной тип или содержит строки, результат будет непредсказуемым. Убедитесь, что колонка объявлена с типом «Число» через Новый ОписаниеТипов("Число") при создании таблицы.

Ожидание сортировки. После сворачивания строки часто оказываются в произвольном порядке. Если результат выводится пользователю или упорядоченность важна для дальнейшего алгоритма, добавьте вызов Таблица.Сортировать("Контрагент").

Типичные ошибки
01
Сворачивание исходной таблицы без копии — детальные данные теряются и не восстанавливаются
02
Опечатка в имени колонки — ошибка «Колонка не найдена» прерывает выполнение кода
03
Суммирование колонки с составным типом — некорректные итоги без явного сообщения об ошибке
04
Использование значения, возвращаемого методом — Свернуть() ничего не возвращает, присваивание результата даст Неопределено
05
Сворачивание таблицы значений, привязанной к реквизиту формы, — неожиданное изменение данных на экране пользователя

Проверка результата сворачивания

После сворачивания полезно убедиться, что итоги сошлись. Контрольный приём — сравнить сумму по колонке до и после сворачивания: общий итог не должен измениться.

ИтогДо = ТаблицаДанных.Итог("Сумма");

ТаблицаИтогов = ТаблицаДанных.Скопировать();

ТаблицаИтогов.Свернуть("Контрагент", "Сумма");

ИтогПосле = ТаблицаИтогов.Итог("Сумма");

Если ИтогДо <> ИтогПосле Тогда

// Контроль не пройден: ищите причину расхождения

Сообщить("Итоги не совпадают: " + ИтогДо + " / " + ИтогПосле);

КонецЕсли;

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

Контрольные точки

Как проверить результат сворачивания

Общий итог по суммируемой колонке
Норма

Итог до и после сворачивания совпадает

Тревожный признак

Итоги расходятся — проверяйте типы колонок и состав группировки

Состав колонок результата
Норма

Остались только колонки группировки и суммирования

Тревожный признак

Пропала нужная колонка — её не было в параметрах метода

Количество строк
Норма

Равно числу уникальных сочетаний значений группировки

Тревожный признак

Строк больше — возможно, значения отличаются незначимо (пробелы, регистр ссылок разных видов)

Практические сценарии применения

Загрузка данных из файла. При импорте из Excel или CSV строки часто дублируются по контрагенту или номенклатуре. После загрузки в таблицу значений сворачивание даёт компактный перечень для дальнейшего поиска и сопоставления со справочниками.

Подготовка данных для печатной формы. Когда макет требует итоговую строку по группе (например, акт сверки с итогами по договору), удобно сделать свёрнутую копию таблицы для шапки и детальную — для табличной части.

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

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

Ограничения метода и когда он не подходит

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

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

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

Маршрут решения

Как выбрать способ группировки

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

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

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

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

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

Да. Вызовите метод с одним параметром: Таблица.Свернуть("Колонка1, Колонка2"). В результате останутся только уникальные сочетания значений указанных колонок — аналог конструкции РАЗЛИЧНЫЕ в запросе.

Почему после сворачивания пропала сортировка строк?

Метод Свернуть() не гарантирует сохранение исходного порядка строк — платформа перестраивает данные для группировки. Если порядок важен, после сворачивания вызовите метод Сортировать() с нужными колонками и направлением, например: Таблица.Сортировать("Контрагент Возр").

Как свернуть таблицу значений, привязанную к форме, не сломав отображение?

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

Что быстрее: Свернуть() или группировка в запросе?

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

Почему возникает ошибка «Колонка не найдена» при вызове Свернуть()?

Имя колонки в параметрах не совпадает с именем, заданным при её создании. Проверьте опечатки, лишние пробелы и регистр независимость: имена колонок в 1С регистронезависимы, но чувствительны к пробелам и символам. Убедиться в точных именах поможет обход коллекции Таблица.Колонки с выводом свойства Имя.

Итог

Что важно запомнить

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