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