Программирование в 1С

Как свернуть таблицу значений в 1С и сохранить исходник

Коротко

Сначала получите копию исходной ТЗ методом Скопировать(), затем вызовите у копии Свернуть("Товар,Склад", "Количество,Сумма"). Первый список задаёт группировки, второй — суммируемые показатели. Свернуть — процедура, не функция: она меняет таблицу на месте и не возвращает новую.

Колонки вне обоих списков удаляются. Поэтому исходник храните отдельно, а в группировку включайте только признаки нужного разреза: лишняя партия не даст объединить строки одного товара на складе.

Подготовка: небольшая таблица значений для двух примеров

В Консоли кода вставьте prepare и одну или обе свёртки в один серверный фрагмент. Подготовку выполняйте один раз. Исходная — локальная ТаблицаЗначений, не табличная часть и не данные формы; реквизиты формы не нужны.

Если переносите фрагменты в модуль управляемой формы, разместите их внутри серверной процедуры с директивой &НаСервереБезКонтекста. Самостоятельные строки вне процедуры в модуль формы не вставляют. На тонком и веб-клиенте создавать ТЗ нельзя.

Исходная = Новый ТаблицаЗначений;
ТипСтроки = Новый ОписаниеТипов("Строка");
ТипЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 0));
Исходная.Колонки.Добавить("Товар", ТипСтроки);
Исходная.Колонки.Добавить("Склад", ТипСтроки);
Исходная.Колонки.Добавить("Количество", ТипЧисла);
Исходная.Колонки.Добавить("Сумма", ТипЧисла);
Исходная.Колонки.Добавить("Партия", ТипСтроки);

Строка = Исходная.Добавить();
Строка.Товар = "Кабель";
Строка.Склад = "Север";
Строка.Количество = 2;
Строка.Сумма = 120;
Строка.Партия = "А";

Строка = Исходная.Добавить();
Строка.Товар = "Кабель";
Строка.Склад = "Север";
Строка.Количество = 3;
Строка.Сумма = 180;
Строка.Партия = "Б";

Строка = Исходная.Добавить();
Строка.Товар = "Кабель";
Строка.Склад = "Юг";
Строка.Количество = 4;
Строка.Сумма = 240;
Строка.Партия = "В";

Строка = Исходная.Добавить();
Строка.Товар = "Крепеж";
Строка.Склад = "Север";
Строка.Количество = 6;
Строка.Сумма = 90;
Строка.Партия = "Г";
ТаблицаЗначений.Добавить()
→ СтрокаТаблицыЗначений
Колонки.ДобавитьИмя, Тип, Заголовок, Ширина — все параметры необязательны; здесь заданы имя и ОписаниеТипов.
ЧислаКоличество и Сумма: 12 разрядов, 0 дробных. Для денежных сумм с копейками задайте соответствующую точность до загрузки данных.

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

Свернуть таблицу значений в 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С

Лайт

Бесплатно
≈ 0,1 млн токенов на 2 дн.

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф