Как свернуть таблицу значений в 1С и сохранить исходник
Сначала получите копию исходной ТЗ методом Скопировать(), затем вызовите у копии Свернуть("Товар,Склад", "Количество,Сумма"). Первый список задаёт группировки, второй — суммируемые показатели. Свернуть — процедура, не функция: она меняет таблицу на месте и не возвращает новую.
Колонки вне обоих списков удаляются. Поэтому исходник храните отдельно, а в группировку включайте только признаки нужного разреза: лишняя партия не даст объединить строки одного товара на складе.
Подготовка: небольшая таблица значений для двух примеров
В Консоли кода вставьте prepare и одну или обе свёртки в один серверный фрагмент. Подготовку выполняйте один раз. Исходная — локальная ТаблицаЗначений, не табличная часть и не данные формы; реквизиты формы не нужны.
Если переносите фрагменты в модуль управляемой формы, разместите их внутри серверной процедуры с директивой &НаСервереБезКонтекста. Самостоятельные строки вне процедуры в модуль формы не вставляют. На тонком и веб-клиенте создавать ТЗ нельзя.
Исходная = Новый ТаблицаЗначений;
ТипСтроки = Новый ОписаниеТипов("Строка");
ТипЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 0));
Исходная.Колонки.Добавить("Товар", ТипСтроки);
Исходная.Колонки.Добавить("Склад", ТипСтроки);
Исходная.Колонки.Добавить("Количество", ТипЧисла);
Исходная.Колонки.Добавить("Сумма", ТипЧисла);
Исходная.Колонки.Добавить("Партия", ТипСтроки);
Строка = Исходная.Добавить();
Строка.Товар = "Кабель";
Строка.Склад = "Север";
Строка.Количество = 2;
Строка.Сумма = 120;
Строка.Партия = "А";
Строка = Исходная.Добавить();
Строка.Товар = "Кабель";
Строка.Склад = "Север";
Строка.Количество = 3;
Строка.Сумма = 180;
Строка.Партия = "Б";
Строка = Исходная.Добавить();
Строка.Товар = "Кабель";
Строка.Склад = "Юг";
Строка.Количество = 4;
Строка.Сумма = 240;
Строка.Партия = "В";
Строка = Исходная.Добавить();
Строка.Товар = "Крепеж";
Строка.Склад = "Север";
Строка.Количество = 6;
Строка.Сумма = 90;
Строка.Партия = "Г";
Исходник содержит четыре строки и пять колонок. Первые две строки различаются партией, но совпадают по товару и складу. Сумма задана как стоимость строки, а не как цена единицы: складывать её имеет смысл. Все количества и суммы в этом примере — целые числа.
Свернуть таблицу значений в 1С по товару и складу
Блок by-warehouse выполняется после prepare в том же серверном фрагменте. Копирование без аргументов сохраняет все строки и колонки; свёртка меняет только ПоСкладам.
ПоСкладам = Исходная.Скопировать();
ПоСкладам.Свернуть("Товар,Склад", "Количество,Сумма");
Для Каждого Итог Из ПоСкладам Цикл
Сообщить(Итог.Товар + " | " + Итог.Склад
+ " | " + Итог.Количество + " | " + Итог.Сумма);
КонецЦикла;
Ожидаемый результат — три строки с четырьмя колонками. Сообщения должны содержать следующий набор строк; порядок здесь не является условием проверки:
Кабель | Север | 5 | 300— 2 + 3 и 120 + 180.Кабель | Юг | 4 | 240— отдельная группа другого склада.Крепеж | Север | 6 | 90— отдельная группа другого товара.
Колонка Партия исчезает из ПоСкладам. В Исходная остаются все четыре строки и исходные пять колонок. Контрольные суммы не меняются: количество 15, сумма 630.
Что включать в группировки и почему исчезают колонки
Группа определяется сочетанием всех колонок первого списка. С Партия строки А и Б останутся раздельными; без Склад кабель с двух складов объединится.
Остальные колонки удаляются, а не сохраняются «из первой строки». Включайте признак в группировку, только если он должен разделять группы. Для последней даты или актуальной цены нужен отдельный алгоритм: Свернуть не выбирает последнее значение.
Перед адаптацией дайте агенту Консоли кода обезличенные строки и ожидаемые итоги: попросите проверить группировки и смысл суммируемых показателей.
Другой разрез: суммы по товару без склада
Блок by-item использует тот же prepare. Предыдущая свёртка ему не нужна: копия снова берётся из Исходная, а не из уже сокращённой таблицы.
ПоТоварам = Исходная.Скопировать();
ПоТоварам.Свернуть("Товар", "Количество,Сумма");
Для Каждого Итог Из ПоТоварам Цикл
Сообщить(Итог.Товар + " | " + Итог.Количество + " | " + Итог.Сумма);
КонецЦикла;
Ожидаемый набор сообщений: Кабель | 9 | 540 и Крепеж | 6 | 90. Для кабеля сложены 2 + 3 + 4 и 120 + 180 + 240. В ПоТоварам две строки, три колонки — Товар, Количество, Сумма; Склад и Партия удалены. Исходник снова не изменён.
Почему суммы зависят от типов колонок
В подготовке суммируемые колонки явно числовые. Для колонки без ограничения типов Свернуть складывает только значения типа Число: строка с текстом числа не равна числовому значению. В составной колонке, где есть Число, значения остальных типов также игнорируются. При единственном установленном типе платформа пытается преобразовать значения к числу. Если в составной колонке нет типа Число, результат суммирования — 0; при присвоении он преобразуется к значению по умолчанию типа колонки.
Не рассчитывайте на неявное преобразование данных из файла. До свёртки проверьте типы и точность показателей; количество, цена и сумма — разные величины. Цену единицы обычно нельзя складывать так же, как стоимость строк. Оба списка имён должны ссылаться на существующие колонки и не пересекаться.
Как проверить агрегацию без записи в базу
Сравните набор групп и их показатели с результатами выше, затем проверьте сохранность исходника. Уменьшение числа строк само по себе не доказывает правильность: при забытом складе итоговая сумма совпадёт, но нужный разрез потеряется. Проверяйте одновременно состав колонок, ключ каждой группы и суммы.
Эти примеры не читают документы и не записывают данные: вся работа идёт с таблицами в памяти. Приведённые числа — расчётный ожидаемый результат, а не журнал живого запуска на платформе 1С.
Для проверки в Консоли кода передайте подготовительный блок и выбранную свёртку одним серверным фрагментом. Агенту не требуется доступ к текущей форме. Если ваши данные находятся в реквизите формы, сначала получите из них ТЗ в серверном контексте самой формы; автономная Консоль не читает её локальные переменные.
Частые ошибки при свёртке ТЗ
- Ждать результат функции. Не присваивайте результат вызова Свернуть переменной. Копию возвращает Скопировать, а свёртка меняет эту копию.
- Свернуть исходник вместо копии. Потеряются детали и колонки, которые нужны для другого отчёта. Простое присваивание второй переменной не создаёт копию ТЗ.
- Добавить все колонки в группировку. Уникальная партия сохранит детализацию и не даст объединить строки. Выберите требуемый разрез.
- Забыть важный признак. Без склада товар с разных складов станет одной группой; это правильно только для общего итога по товару.
- Пересечь списки колонок. Одна колонка не может быть одновременно группировкой и суммируемым показателем.
- Складывать цену или текстовые числа. Проверьте смысл показателя, тип данных и допустимую точность до вызова.
- Вставить код в клиентский обработчик. Работа с ТаблицаЗначений здесь серверная; данные управляемой формы — другой объект.
Ошибку при записи регистра разбирает статья о дублировании ключевых значений; здесь агрегируются строки в памяти.
Частые вопросы
Свернуть возвращает новую таблицу значений?
Нет. Свернуть — процедура, меняющая таблицу на месте. Чтобы сохранить исходные данные, сначала вызовите Скопировать(), затем сверните полученную копию.
Куда исчезают колонки после свёртки?
Колонки, не указанные ни в группировках, ни в суммировании, удаляются. Включение колонки в группировку сохраняет её, но также меняет разрез агрегации.
Как суммировать несколько колонок одновременно?
Передайте их имена через запятую во втором параметре, например Количество,Сумма. Эти колонки не должны входить в первый список; до свёртки проверьте их типы и смысл показателей.
ИИ Консоль кода 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка