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

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

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

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

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

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

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

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

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

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

Базовый способ: метод Свернуть таблицы значений

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

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

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

&НаСервере

Процедура СвернутьТоварыНаСервере()

ТаблицаТоваров = Объект.Товары.Выгрузить();

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

Объект.Товары.Загрузить(ТаблицаТоваров);

КонецПроцедуры

Обратите внимание: если табличная часть принадлежит объекту (документу), а не реквизиту формы, методы Выгрузить() и Загрузить() доступны у самой табличной части объекта, и преобразование РеквизитФормыВЗначение не требуется.

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

Свертка реквизита формы типа «Таблица значений»

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

Последовательность такая: выгрузить реквизит формы в таблицу значений методом РеквизитФормыВЗначение, свернуть, затем загрузить обратно через ЗначениеВРеквизитФормы. Оба метода доступны только в серверном контексте формы.

&НаСервере

Процедура СвернутьТаблицуФормы()

ТЗ = РеквизитФормыВЗначение("ТоварыКОтгрузке");

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

ЗначениеВРеквизитФормы(ТЗ, "ТоварыКОтгрузке");

КонецПроцедуры

Если процедура вызывается с клиента (например, по кнопке), создайте клиентскую обёртку, которая вызывает серверную процедуру. Директива &НаСервереБезКонтекста здесь не подойдёт: методы РеквизитФормыВЗначение и ЗначениеВРеквизитФормы требуют контекста формы.

Порядок действий
  1. 1
    Определите, где лежат данные: табличная часть объекта или реквизит формы
  2. 2
    Выгрузите данные в таблицу значений (Выгрузить() или РеквизитФормыВЗначение)
  3. 3
    Составьте список колонок группировки — все нечисловые колонки, которые нужно сохранить
  4. 4
    Укажите суммируемые колонки вторым параметром метода Свернуть
  5. 5
    Загрузите результат обратно (Загрузить() или ЗначениеВРеквизитФормы)
  6. 6
    Проверьте итоговые суммы до и после свертки — они должны совпасть

Альтернатива: свертка запросом

Когда таблица большая или свертку нужно совместить с отбором и соединением с другими данными, удобнее использовать запрос с группировкой. Запрос позволяет за один проход отфильтровать строки, сгруппировать их и вычислить суммы, а также применить агрегатные функции МАКСИМУМ, МИНИМУМ, КОЛИЧЕСТВО для несуммируемых колонок.

Таблицу значений можно передать в запрос как параметр и поместить во временную таблицу:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

| ТЗ.Количество КАК Количество,

| ТЗ.Сумма КАК Сумма

|ПОМЕСТИТЬ ВТ_Товары

|ИЗ &ТЗ КАК ТЗ

|;

|ВЫБРАТЬ

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

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

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

|ИЗ ВТ_Товары КАК Товары

|СГРУППИРОВАТЬ ПО Товары.Номенклатура";

Запрос.УстановитьПараметр("ТЗ", Объект.Товары.Выгрузить());

Результат = Запрос.Выполнить().Выгрузить();

Объект.Товары.Загрузить(Результат);

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

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

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

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

Свертка запросом

Подходит при больших объёмах, отборах и соединениях. Гибче (МАКСИМУМ, КОЛИЧЕСТВО, HAVING), но кода больше.

Ручной цикл с соответствием

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

Типичные ошибки при свертке и как их избежать

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

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

Третья ошибка — свертка колонок, которые суммировать нельзя: цены, ставки, проценты скидок. Сумма цен бессмысленна и ломает последующие расчёты. Цену после свертки по количеству и сумме обычно пересчитывают как Сумма / Количество (с проверкой деления на ноль).

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

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

Проверка результата и безопасная отладка

После свертки обязательно сверьте контрольные итоги: сумма по каждой суммируемой колонке до и после операции должна совпадать. Проще всего вычислить итог методом Итог("Сумма") у исходной и итоговой таблицы и сравнить значения. Расхождение означает ошибку в логике.

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

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

Когда свертку делать нельзя: ограничения и риски

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

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

Часто задаваемые вопросы

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

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

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

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

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

Метод Свернуть умеет только суммировать. Для МАКСИМУМ, МИНИМУМ или КОЛИЧЕСТВО используйте запрос с группировкой и соответствующими агрегатными функциями, либо ручной обход таблицы с хранением промежуточных значений в соответствии.

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

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

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

Да, если документ уже существует в базе. Свертка меняет только данные в памяти формы; чтобы изменения сохранились, объект нужно записать. Если форма просто закрывается без записи, результат свертки будет потерян.

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

Нет, динамический список — это результат запроса к базе данных, он доступен только для чтения. Чтобы показать сгруппированные данные, измените текст запроса динамического списка, добавив группировку и агрегатные функции, либо замените динамический список на реквизит типа «ТаблицаЗначений».

Итог

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

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