Разработка и Конфигурация · 13 мин
Как свернуть таблицу значений по колонке в 1С
Разбираем метод Свернуть() таблицы значений в 1С: синтаксис, группировка по колонкам, суммирование, примеры кода и типичные ошибки при сворачивании данных.
Таблица значений в 1С часто содержит детальные строки: например, продажи по каждому документу, остатки по каждой партии или движения по каждому регистратору. Для отчётов и обработок такая детализация бывает избыточной — нужны итоги по контрагенту, номенклатуре или складу. Задача решается методом Свернуть(), который группирует строки по указанным колонкам и суммирует числовые показатели.
Метод встроен в платформу и работает на любом релизе 1С:Предприятие 8, как в обычных, так и в управляемых формах, на клиенте и на сервере. Он изменяет таблицу «на месте», поэтому важно понимать, что происходит с исходными данными, и уметь проверять результат.
Ниже разобраны синтаксис метода, практические примеры кода, отличия от альтернативных способов группировки (запрос с СГРУППИРОВАТЬ ПО), типичные ошибки и способы проверки корректности сворачивания.
Синтаксис метода Свернуть()
Метод вызывается у объекта типа «ТаблицаЗначений» и принимает два необязательных параметра:
Таблица.Свернуть(КолонкиГруппировки, КолонкиСуммирования);
КолонкиГруппировки — строка с именами колонок через запятую, по которым объединяются строки. Строки с одинаковым сочетанием значений в этих колонках схлопываются в одну. КолонкиСуммирования — строка с именами числовых колонок, значения которых суммируются внутри каждой группы. Если второй параметр не указан, метод просто удаляет дубли строк по колонкам группировки.
Важные особенности поведения метода:
- метод изменяет саму таблицу, а не возвращает новую — возвращаемого значения у него нет;
- колонки, не входящие ни в группировку, ни в суммирование, удаляются из таблицы после сворачивания;
- суммировать можно только колонки с числовым типом, иначе получите ошибку или некорректный результат;
- порядок строк в результате не гарантирует исходную сортировку — при необходимости отсортируйте таблицу после сворачивания.
Простой пример: свернуть по одной колонке
Типовая задача: есть таблица продаж с колонками «Контрагент», «Документ», «Сумма». Нужно получить итог продаж по каждому контрагенту без детализации до документов.
// Исходная таблица: Контрагент, Документ, Сумма
// Сворачиваем по контрагенту, суммируя суммы
ТаблицаПродаж.Свернуть("Контрагент", "Сумма");
// После вызова в таблице останутся только две колонки:
// Контрагент и Сумма (с итогом по каждому контрагенту)
После выполнения колонка «Документ» исчезнет — она не участвовала ни в группировке, ни в суммировании. Если она нужна для дальнейшей логики, сохраните её заранее в отдельную структуру или работайте с копией таблицы.
Чтобы получить только уникальные значения без суммирования (аналог «РАЗЛИЧНЫЕ» в запросе), вызовите метод с одним параметром:
// Оставить только уникальные сочетания Склад + Номенклатура
ТаблицаОстатков.Свернуть("Склад, Номенклатура");
- 1Определите, по каким колонкам нужно группировать строки
- 2Определите, какие числовые колонки должны суммироваться
- 3При необходимости сохраните копию исходной таблицы через Скопировать()
- 4Вызовите Свернуть(КолонкиГруппировки, КолонкиСуммирования)
- 5Проверьте результат: количество строк, итоги по суммируемым колонкам
- 6Отсортируйте таблицу методом Сортировать(), если важен порядок строк
Сворачивание по нескольким колонкам
Группировка по нескольким измерениям выполняется перечислением колонок через запятую в первом параметре. Например, нужны итоги продаж в разрезе «Склад + Номенклатура» с суммированием количества и суммы:
ТаблицаДанных.Свернуть("Склад, Номенклатура", "Количество, Сумма");
Строки объединятся только при полном совпадении значений во всех колонках группировки. Две строки с одинаковой номенклатурой, но разными складами останутся отдельными строками результата.
Обратите внимание на нюанс с пробелами: имена колонок в строке параметров отделяются запятыми, пробелы после запятой платформа обрабатывает корректно, но лишние пробелы внутри имени колонки приведут к ошибке «Колонка не найдена». Имена должны точно совпадать с именами, заданными при создании колонок.
Сохранение исходной таблицы
Так как метод разрушает исходную структуру, перед сворачиванием часто делают копию:
ТаблицаИтогов = ТаблицаДетально.Скопировать();
ТаблицаИтогов.Свернуть("Контрагент", "Сумма");
// ТаблицаДетально осталась нетронутой
Метод Скопировать() создаёт полную независимую копию данных. Для больших таблиц учитывайте расход памяти: копия дублирует все строки.
Сворачивание таблицы частей запроса и альтернативы
Метод Свернуть() — не единственный способ агрегации. Если данные извлекаются из базы запросом, группировку эффективнее выполнить на уровне запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Контрагент КАК Контрагент,
| СУММА(Продажи.СуммаОборот) КАК Сумма
|ИЗ
| РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи
|СГРУППИРОВАТЬ ПО
| Продажи.Контрагент";
Группировка в запросе выполняется на сервере СУБД и не требует перекачки детальных строк в память приложения. Для больших объёмов это принципиально быстрее, чем выгрузить миллион строк в таблицу значений и потом сворачивать её кодом.
Способы агрегации данных в 1С
Подходит, когда таблица уже сформирована в коде, данные получены не запросом (загружены из файла, рассчитаны программно) или нужна промежуточная обработка строк. Ограничение: только суммирование, нет других агрегатных функций.
Оптимально при выборке из базы: быстрее, поддерживает СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ. Ограничение: работает только с данными, доступными в запросе.
Для интерактивной аналитики и отчётов, где пользователь сам меняет группировки. Избыточно для разовой программной агрегации в коде.
Типичные ошибки при сворачивании
Большинство проблем со сворачиванием связано с непониманием того, как метод обрабатывает колонки и типы данных. Разберём частые сценарии.
Потеря нужных колонок. Разработчик сворачивает таблицу и обнаруживает, что колонка «СтавкаНДС» исчезла. Это штатное поведение: всё, что не указано в параметрах, удаляется. Если колонка нужна и её значение одинаково внутри группы — включите её в перечень колонок группировки.
Попытка суммировать нечисловую колонку. Если колонка суммирования имеет составной тип или содержит строки, результат будет непредсказуемым. Убедитесь, что колонка объявлена с типом «Число» через Новый ОписаниеТипов("Число") при создании таблицы.
Ожидание сортировки. После сворачивания строки часто оказываются в произвольном порядке. Если результат выводится пользователю или упорядоченность важна для дальнейшего алгоритма, добавьте вызов Таблица.Сортировать("Контрагент").
Проверка результата сворачивания
После сворачивания полезно убедиться, что итоги сошлись. Контрольный приём — сравнить сумму по колонке до и после сворачивания: общий итог не должен измениться.
ИтогДо = ТаблицаДанных.Итог("Сумма");
ТаблицаИтогов = ТаблицаДанных.Скопировать();
ТаблицаИтогов.Свернуть("Контрагент", "Сумма");
ИтогПосле = ТаблицаИтогов.Итог("Сумма");
Если ИтогДо <> ИтогПосле Тогда
// Контроль не пройден: ищите причину расхождения
Сообщить("Итоги не совпадают: " + ИтогДо + " / " + ИтогПосле);
КонецЕсли;
Дополнительные контрольные точки: количество строк результата должно равняться числу уникальных сочетаний колонок группировки; в свёрнутой таблице не должно остаться колонок, которые вы не указывали в параметрах.
Как проверить результат сворачивания
Итог до и после сворачивания совпадает
Итоги расходятся — проверяйте типы колонок и состав группировки
Остались только колонки группировки и суммирования
Пропала нужная колонка — её не было в параметрах метода
Равно числу уникальных сочетаний значений группировки
Строк больше — возможно, значения отличаются незначимо (пробелы, регистр ссылок разных видов)
Практические сценарии применения
Загрузка данных из файла. При импорте из Excel или CSV строки часто дублируются по контрагенту или номенклатуре. После загрузки в таблицу значений сворачивание даёт компактный перечень для дальнейшего поиска и сопоставления со справочниками.
Подготовка данных для печатной формы. Когда макет требует итоговую строку по группе (например, акт сверки с итогами по договору), удобно сделать свёрнутую копию таблицы для шапки и детальную — для табличной части.
Агрегация перед записью в регистр. Если обработка формирует движения, сворачивание избавляет от множества мелких одинаковых строк и уменьшает объём записываемых данных, что ускоряет проведение.
Если после сворачивания получилось больше строк, чем ожидалось, проверьте значения группировочных колонок на скрытые различия: лишние пробелы в строках, разные представления пустых ссылок, неразрывные пробелы из импортированных файлов. Перед сворачиванием строки имеет смысл обработать функцией СокрЛП().
Ограничения метода и когда он не подходит
Метод Свернуть() умеет только суммировать. Если нужны другие агрегаты — среднее, максимум, количество различных значений — придётся либо группировать запросом, либо обходить таблицу в цикле с собственной логикой накопления.
Второе ограничение — производительность на очень больших таблицах. Сворачивание выполняется в памяти приложения, и на таблицах в сотни тысяч строк операция может занять заметное время. В таких случаях переносите агрегацию на уровень запроса или временных таблиц.
Наконец, метод не работает с деревом значений — для иерархических структур агрегацию выполняют рекурсивным обходом или формируют данные запросом с итогами.
Как выбрать способ группировки
Часто задаваемые вопросы
Что происходит с колонками, не указанными в параметрах Свернуть()?
Они удаляются из таблицы вместе со своими данными. Если значение такой колонки нужно в результате, включите её либо в колонки группировки (когда значение одинаково внутри группы), либо в колонки суммирования (если это число, которое имеет смысл складывать). Третьего варианта метод не предоставляет.
Можно ли свернуть таблицу без суммирования, только убрав дубли?
Да. Вызовите метод с одним параметром: Таблица.Свернуть("Колонка1, Колонка2"). В результате останутся только уникальные сочетания значений указанных колонок — аналог конструкции РАЗЛИЧНЫЕ в запросе.
Почему после сворачивания пропала сортировка строк?
Метод Свернуть() не гарантирует сохранение исходного порядка строк — платформа перестраивает данные для группировки. Если порядок важен, после сворачивания вызовите метод Сортировать() с нужными колонками и направлением, например: Таблица.Сортировать("Контрагент Возр").
Как свернуть таблицу значений, привязанную к форме, не сломав отображение?
Напрямую — никак, метод изменит данные на форме. Правильный подход: получить копию через Скопировать(), свернуть копию и использовать её для расчётов. Если результат нужно показать пользователю, выведите его в отдельный реквизит формы или табличный документ.
Что быстрее: Свернуть() или группировка в запросе?
Если данные находятся в базе, группировка запросом почти всегда быстрее: агрегация выполняется на сервере СУБД, и в приложение передаются только итоговые строки. Свернуть() оправдан, когда таблица уже существует в коде — например, построена программно или загружена из внешнего файла — и повторный запрос к базе не требуется.
Почему возникает ошибка «Колонка не найдена» при вызове Свернуть()?
Имя колонки в параметрах не совпадает с именем, заданным при её создании. Проверьте опечатки, лишние пробелы и регистр независимость: имена колонок в 1С регистронезависимы, но чувствительны к пробелам и символам. Убедиться в точных именах поможет обход коллекции Таблица.Колонки с выводом свойства Имя.
Что важно запомнить
Метод Свернуть(КолонкиГруппировки, КолонкиСуммирования) группирует строки таблицы значений и суммирует числовые колонки, изменяя таблицу на месте и удаляя неуказанные колонки. Работайте с копией, проверяйте итоги до и после, а для данных из базы предпочитайте группировку в запросе.