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