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