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

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

Как свернуть одинаковые строки в 1С

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

Задача свернуть одинаковые строки возникает в 1С постоянно: товары дублируются в табличной части документа, отчёт выводит несколько строк по одному контрагенту, а обработка загрузки из Excel привозит повторы. «Свернуть» означает объединить строки с одинаковыми значениями ключевых колонок в одну строку, а числовые показатели по ним — просуммировать.

В платформе 1С:Предприятие 8 есть несколько штатных способов решить эту задачу, и выбор зависит от того, где находятся данные: в таблице значений в коде, в базе данных (тогда работает запрос), в отчёте на СКД или в табличном документе. У каждого способа свои ограничения по производительности и по тому, какие колонки можно группировать, а какие — суммировать.

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

Что значит «свернуть строки» и когда это нужно

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

Типичные ситуации: подготовка данных к печати, загрузка прайсов и выгрузок из Excel, где поставщик дублирует позиции; консолидация данных перед записью в регистр; формирование компактного отчёта без детализации. Важно понимать: сворачиваются только строки, у которых совпадают все колонки группировки. Если различается хотя бы одна — строки останутся разными.

Отдельный случай — когда строки «почти одинаковые»: отличается регистр букв, лишние пробелы или разные представления одной ссылки. Перед свёрткой такие значения нужно нормализовать (СокрЛП, единый регистр), иначе группировка не сработает.

Способ 1. Метод Свернуть для таблицы значений

Основной инструмент в коде — метод Свернуть(КолонкиГруппировки, КолонкиСуммирования) объекта «ТаблицаЗначений». Первый параметр — строка с именами колонок через запятую, по которым идёт группировка. Второй — колонки, значения которых нужно просуммировать. Все остальные колонки после свёртки удаляются из таблицы.

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

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

// Остались 4 колонки, строки сгруппированы по товару и складу

Если второй параметр не указать, метод просто удалит дубли строк по колонкам группировки — аналог «выбрать различные». Если нужно свернуть копию таблицы, не трогая исходную, сначала сделайте Копия = ТЗ.Скопировать(); и сворачивайте копию.

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

bsl
ТЗ = Документ.Товары.Выгрузить();
ТЗ.Свернуть("Номенклатура", "Количество, Сумма");
Для Каждого Строка Из ТЗ Цикл
    Сообщить(Строка(Строка.Номенклатура) + " — " + Строка.Количество);
КонецЦикла;

Способ 2. Группировка в запросе

Если данные ещё не выбраны из базы, правильнее сворачивать их на стороне запроса — это быстрее и не гоняет лишние строки в память. Используется конструкция СГРУППИРОВАТЬ ПО с агрегатными функциями СУММА, КОЛИЧЕСТВО, МАКСИМУМ.

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

СУММА(Товары.Количество) КАК Количество,

СУММА(Товары.Сумма) КАК Сумма

ИЗ

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

ГДЕ

Товары.Ссылка = &Ссылка

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

Товары.Номенклатура

Запрос особенно выигрывает на больших объёмах: свёртка миллиона строк в таблице значений может занять заметное время и память, тогда как СУБД выполнит группировку оптимально. Плюс в запросе доступны КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...) и фильтрация групп через ИМЕЮЩИЕ, чего метод Свернуть не умеет.

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

Сравнение способов свёртки

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

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

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

Для данных в базе, больших объёмов, сложной агрегации. Не работает с таблицами вне БД без помещения во временную таблицу.

Группировка в СКД

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

Сводная таблица (Excel)

Для интерактивного анализа выгрузки в Excel. Только просмотр, результат не возвращается в 1С автоматически.

Способ 3. Свёртка в отчёте на СКД

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

Если в отчёте видны дубли, чаще всего причина в лишнем поле детализации: например, в группировку или в выбранные поля попал «Период», «Регистратор» или «Характеристика», из-за чего строки разваливаются. Уберите лишнее поле из группировки — и строки свернутся.

Для детальных записей (группировка «Детальные записи» без полей) СКД выводит строки как есть. Чтобы убрать дубли на этом уровне, добавьте нужную группировку выше или используйте автополе группировки. Также проверьте связи наборов данных: соединение «один ко многим» без необходимости — частый источник задвоения строк в отчёте.

Способ 4. Сводная таблица и дубликаты в табличном документе

Когда данные уже выгружены в табличный документ или Excel, свёртку можно сделать интерактивно через сводную таблицу: в Excel это «Вставка → Сводная таблица», где поле номенклатуры кладётся в «Строки», а количество и сумма — в «Значения». Это удобно для разового анализа, но результат не возвращается в 1С.

В типовых конфигурациях также встречаются обработки «Групповая обработка справочников и документов» и консоли, позволяющие найти дубли. Для поиска дублей в справочниках (например, контрагентов или номенклатуры) в БСП-based конфигурациях есть штатная обработка «Поиск и удаление дублей» — она не сворачивает строки, а заменяет дублирующиеся элементы одним и удаляет лишние.

Не путайте эти задачи: свёртка строк таблицы — операция над данными выборки, а устранение дублей элементов справочника — операция над объектами базы с переносом ссылок. Вторая требует резервной копии и осторожности.

Пошаговый порядок свёртки табличной части документа

Частая прикладная задача — свернуть товары в документе перед печатью или перезаписью. Безопасная последовательность такая: выгрузить табличную часть в таблицу значений, свернуть её, проверить итоги и только потом загрузить обратно.

Порядок действий
  1. 1
    Выгрузите табличную часть: ТЗ = Объект.Товары.Выгрузить();
  2. 2
    Сохраните контрольные итоги: сумму количества и суммы до свёртки.
  3. 3
    Выполните ТЗ.Свернуть("Номенклатура", "Количество, Сумма");
  4. 4
    Сравните итоги после свёртки с контрольными — они обязаны совпасть.
  5. 5
    Очистите табличную часть и загрузите свёрнутую таблицу: Объект.Товары.Загрузить(ТЗ);
  6. 6
    Запишите документ и проверьте проведение и печатную форму.

Обратите внимание: при свёртке теряются несуммируемые колонки — ставка НДС, цена, серия, содержание. Если цена у дублирующихся строк разная, после свёртки по сумме и количеству средняя цена станет расчётной, а исходные цены пропадут. Либо включайте цену в колонки группировки, либо пересчитывайте её после свёртки как Сумма / Количество.

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

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

Типичные ошибки
01
Свёртка исходной таблицы вместо копии — данные теряются для дальнейшей логики. Используйте Скопировать() перед Свернуть.
02
Несуммируемая колонка не включена ни в группировку, ни в суммирование — она молча удаляется вместе с данными.
03
Разный регистр или лишние пробелы в ключевых значениях — строки не группируются. Примените СокрЛП и ВРег/НРег перед свёрткой.
04
Попытка суммировать нечисловую колонку — ошибка или неверный результат. Проверьте тип колонки.
05
Свёртка без контроля итогов — расхождение сумм обнаруживается только у пользователя. Всегда сравнивайте итоги до и после.
06
Ожидание, что Свернуть сохранит порядок строк — порядок после свёртки не гарантирован, добавьте сортировку.

Отдельно стоит ошибка с сортировкой: метод Свернуть не обещает сохранить исходный порядок строк. Если порядок важен (например, для печатной формы), после свёртки выполните ТЗ.Сортировать("Номенклатура") явно.

Как проверить результат свёртки

Главный контроль — совпадение итогов. Сумма по каждой суммируемой колонке до свёртки должна равняться сумме после. Если итоги сошлись, а количество строк уменьшилось — свёртка выполнена корректно.

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

Как проверить результат

Итог по суммируемым колонкам
Норма

Сумма до и после свёртки совпадает

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

Итог изменился — потеряны или задублированы строки

Число строк
Норма

Строк стало меньше или столько же, дублей по ключам нет

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

Остались строки с одинаковыми ключевыми колонками

Состав колонок
Норма

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

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

Нужная колонка исчезла — её не включили в параметры

Порядок строк
Норма

Таблица отсортирована явно после свёртки

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

Порядок произвольный, печатная форма «прыгает»

Для программной проверки дублей после свёртки можно повторно свернуть таблицу по тем же ключам без суммирования и сравнить число строк: если оно не изменилось, дублей нет. Альтернатива — запрос к временной таблице с ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1.

Итог

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

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

Частые вопросы

Как свернуть строки, но оставить несуммируемую колонку?

Включите её в список колонок группировки — тогда строки будут объединяться только при совпадении и этой колонки тоже. Если значения в ней разные, а оставить нужно одно (например, максимальную дату), метод Свернуть не подойдёт: используйте запрос с МАКСИМУМ() или ручной обход таблицы с соответствием.

Почему после Свернуть строки с одинаковым товаром остались разными?

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

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

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

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

На больших объёмах из базы данных запрос с группировкой заметно эффективнее — агрегация выполняется на стороне СУБД. Метод Свернуть оправдан для небольших таблиц (сотни–тысячи строк) и для данных, которых нет в базе: загрузок из файлов, программно собранных таблиц.

Как найти дубли строк, не удаляя их?

Скопируйте таблицу, сверните копию по ключевым колонкам без суммирования и сравните количество строк с исходной: разница — число лишних дублей. Чтобы увидеть сами дубли, используйте запрос с СГРУППИРОВАТЬ ПО и ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1.

Опасно ли сворачивать строки в проведённом документе?

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