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

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

Как свернуть табличную часть в 1С

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

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

В платформе 1С:Предприятие для этого есть встроенный метод Свернуть() у таблицы значений и табличной части, а в типовых конфигурациях (УТ, ERP, Розница, Бухгалтерия) — готовые команды «Свернуть» или «Свернуть товары» в меню «Ещё» табличной части. Ниже разобраны оба пути: работа пользователя без программирования и программная свертка через встроенный язык.

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

Что такое свертка табличной части и когда она нужна

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

Типичные ситуации, когда свертка необходима:

  • товар отсканирован сканером штрихкодов несколько раз, и в чеке или реализации образовались дубли;
  • данные загружены из внешнего файла (Excel, обмен с ТСД), где одна позиция встречается в нескольких строках;
  • перед печатью документа нужно показать товар одной строкой, а не десятью;
  • табличная часть собирается запросом или обработкой, и результат требуется сгруппировать.

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

Свертка в типовых конфигурациях без программирования

В большинстве типовых решений (Управление торговлей, ERP, Комплексная автоматизация, Розница) свертка доступна пользователю прямо в форме документа. Команда называется «Свернуть» или «Свернуть товары» и находится в меню «Ещё» командной панели табличной части либо в контекстном меню по правой кнопке мыши.

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

Порядок действий в типовой конфигурации
  1. 1
    Откройте документ и перейдите на вкладку с табличной частью (например, «Товары»).
  2. 2
    Сохраните документ или запомните его состояние — свертка необратима в рамках открытой формы.
  3. 3
    Нажмите «Ещё» над табличной частью и найдите команду «Свернуть» или «Свернуть товары».
  4. 4
    Проверьте результат: количество строк уменьшилось, итоги по количеству и сумме в подвале не изменились.
  5. 5
    Если итоги исказились — закройте документ без сохранения и повторите с корректными данными.

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

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

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

bsl
// Свертка табличной части документа
ДокументОбъект.Товары.Свернуть("Номенклатура, Цена", "Количество, Сумма");

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

// Свертка без суммирования — просто удаление дублей
ТаблицаТоваров.Свернуть("Номенклатура, Характеристика");

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

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

bsl
&НаСервере
Процедура СвернутьТоварыНаСервере()
    ТЗ = Объект.Товары.Выгрузить();
    ТЗ.Свернуть("Номенклатура, Цена", "Количество, Сумма");
    Объект.Товары.Загрузить(ТЗ);
КонецПроцедуры

Выбор колонок группировки и суммирования

Корректность свертки полностью определяется правильным выбором колонок. Общее правило: в группировку включают все колонки, по которым строки должны считаться «одинаковыми», а в суммирование — только те числовые колонки, которые логично складывать.

КолонкаРоль при сверткеПочему
НоменклатураГруппировкаОсновной признак одинаковости строки
Характеристика, СерияГруппировкаРазные серии нельзя смешивать — нарушится партионный учет
ЦенаГруппировкаИначе сумма строк станет недостижимой при выбранной цене
Ставка НДСГруппировкаСтроки с разными ставкам сворачивать нельзя
Количество, Сумма, СуммаНДССуммированиеИменно эти показатели должны складываться
Склад, ПодразделениеЗависит от задачиЕсли учет ведется по складам — группировка обязательна

Практический критерий: если после свертки пересчет строки по формуле «Сумма = Количество × Цена» дает неверный результат, значит, цену нужно было включить в группировку. Если же цены различаются, а строку все равно нужно одну — сначала рассчитайте среднюю цену вручную и запишите её в результат после свертки.

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

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

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество,
| СУММА(Товары.Сумма) КАК Сумма
|ПОМЕСТИТЬ ВТ
|ИЗ &ТаблицаТоваров КАК Товары
|;
|ВЫБРАТЬ Номенклатура, Количество, Сумма ИЗ ВТ
|СГРУППИРОВАТЬ ПО Номенклатура";
Запрос.УстановитьПараметр("ТаблицаТоваров", ТаблицаТоваров);
Результат = Запрос.Выполнить().Выгрузить();

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

Сравнение вариантов

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

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

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

Подходит для больших объемов и когда нужна фильтрация. Не меняет исходные данные, но требует больше кода.

Команда «Свернуть» в форме

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

Типичные ошибки и их последствия

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

Вторая распространенная ошибка — попытка вызвать Свернуть() у данных формы в управляемом приложении. Возникает ошибка «Метод объекта не обнаружен», потому что у «ДанныеФормыКоллекция» этого метода нет. Решение — выгрузка в таблицу значений, как показано выше.

Типичные ошибки
01
Свертка без колонки «Цена» в группировке — сумма строки перестает соответствовать количеству и цене.
02
Вызов Свернуть() у Объект.Товары в управляемой форме без Выгрузить() — ошибка «Метод не обнаружен».
03
Свертка строк с разными сериями и сроками годности — потеря данных партионного учета.
04
Свертка перед проведением без контроля итогов — расхождение с первичными документами контрагента.
05
Забытая колонка «СтавкаНДС» в группировке — неверная сумма НДС по документу.
Контрольные точки

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

Итог по колонке «Количество» до и после свертки
Норма

Значения совпадают

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

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

Итог по колонке «Сумма»
Норма

Совпадает с исходным

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

Сумма изменилась — ошибка в наборе колонок

Пересчет строки: Количество × Цена
Норма

Равно сумме строки

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

Не равно — цену нужно было включить в группировку

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

Уменьшилось или осталось прежним

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

Строк стало больше — так быть не должно

Ограничения и безопасные границы

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

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

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

Итог

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

Свертка объединяет строки с одинаковыми значениями колонок группировки и суммирует числовые поля. В типовых конфигурациях используйте команду «Ещё → Свернуть», программно — метод Свернуть() с обязательным включением цены, ставки НДС и серий в группировку. После свертки всегда сверяйте итоги документа с исходными.

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

Как свернуть табличную часть, не теряя разные цены?

Включите колонку «Цена» в список колонок группировки: Товары.Свернуть("Номенклатура, Цена", "Количество, Сумма"). Тогда объединятся только строки с одинаковой ценой, а позиции с разными ценами останутся отдельными строками.

Почему возникает ошибка «Метод объекта не обнаружен: Свернуть»?

Метод вызывается у данных управляемой формы, а не у таблицы значений. Используйте конструкцию: ТЗ = Объект.Товары.Выгрузить(); ТЗ.Свернуть(...); Объект.Товары.Загрузить(ТЗ) — в серверной процедуре формы.

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

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

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

Группировка в отчете (СКД, консоль отчетов) — только визуальное представление, исходные данные не меняются. Свертка физически удаляет дублирующиеся строки из табличной части документа и изменяет сохраняемые данные.

Как свернуть таблицу значений по всем колонкам, удалив только полные дубли?

Передайте в первый параметр все колонки таблицы, а второй параметр оставьте пустым: ТЗ.Свернуть("Колонка1, Колонка2, Колонка3"). Строки, полностью совпадающие по всем указанным колонкам, будут объединены в одну без суммирования.

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

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