Свёртка базы 1С: как уменьшить базу и перенести остатки

Дата: 08.10.2026 17:27:40
Администрирование 1С
Производительность
Документы
Регистры
Транзакции
УТ 11
Примеры кода
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Любые

Свёртка базы 1С — удаление документов за закрытые периоды с переносом остатков на дату свёртки: история уходит, остатки, цены и настройки остаются, база становится меньше и быстрее. Разберём штатную свёртку в УТ 11, КА 2 и БП 3.0, ручной порядок из практики автора (розничная сеть) и код: документы остатков по запросу к регистрам и удаление старых документов пакетами с протоколом.

Когда нужна свёртка базы 1С и чем она отличается от новой базы

Сворачивают, когда база выросла, а старые периоды закрыты: отчётность сдана, задним числом ничего не правят. Поводы — долгие бэкапы и обновления, медленные отчёты, нехватка диска.

Альтернатива — перенос остатков в новую базу 1С: пустая база, в неё переносят справочники и остатки (см. статью о выгрузке и загрузке данных XML).

ЧтоСвёртка в той же базеНовая база с остатками
Справочники, пользователи, настройкиостаютсяпереносят заново
Регистры сведенийостаются, кроме подчинённых документамтолько перенесённое
Обмены и доработкиработают, РИБ — с оговоркамиподключают заново
Битые ссылки и мусоростаютсяне переносятся
Когда выбиратьбаза исправна, нужна легчесмена конфигурации, база засорена

Как уменьшить размер базы 1С: сначала измерьте

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

Метод ПолучитьРазмерДанныхБазыДанных есть с платформы 8.3.15 и считает только доступные пользователю данные — запускайте функцию на сервере под администратором.

// Какие объекты занимают место в базе: таблица «объект - размер, МБ» по убыванию.
// ПолучитьРазмерДанныхБазыДанных есть в платформе с 8.3.15 и считает только данные,
// доступные пользователю для чтения, - запускайте на сервере под администратором.
Функция РазмерыОбъектовБазы(МинимумМБ = 50) Экспорт

	Коллекции = Новый Массив;
	Коллекции.Добавить(Метаданные.Документы);
	Коллекции.Добавить(Метаданные.РегистрыНакопления);
	Коллекции.Добавить(Метаданные.РегистрыСведений);
	Коллекции.Добавить(Метаданные.РегистрыБухгалтерии);
	Коллекции.Добавить(Метаданные.Справочники);

	Размеры = Новый ТаблицаЗначений;
	Размеры.Колонки.Добавить("Объект", Новый ОписаниеТипов("Строка"));
	Размеры.Колонки.Добавить("РазмерМБ", Новый ОписаниеТипов("Число"));

	Для Каждого Коллекция Из Коллекции Цикл
		Для Каждого МетаОбъект Из Коллекция Цикл
			Состав = Новый Массив;
			Состав.Добавить(МетаОбъект);
			// Первый параметр - пустой массив: считаем только объекты из Состав
			Байт = ПолучитьРазмерДанныхБазыДанных(Новый Массив, Состав);
			Если Байт < МинимумМБ * 1048576 Тогда
				Продолжить;
			КонецЕсли;
			НоваяСтрока = Размеры.Добавить();
			НоваяСтрока.Объект = МетаОбъект.ПолноеИмя();
			НоваяСтрока.РазмерМБ = Окр(Байт / 1048576);
		КонецЦикла;
	КонецЦикла;

	Размеры.Сортировать("РазмерМБ Убыв");
	Возврат Размеры;

КонецФункции

На платформе ниже 8.3.15 (или если метод недоступен в режиме совместимости вашей конфигурации) размеры таблиц покажет СУБД, а имена таблиц с объектами сопоставит ПолучитьСтруктуруХраненияБазыДанных().

Штатная свёртка в УТ 11, КА 2 и БП 3.0

Для свёртки базы 1С в УТ 11 и КА 2 есть обработка «Свертка информационной базы» — пошаговый помощник. В выгрузках УТ 11.4 и КА 2.5 её команда стоит в разделе «НСИ и администрирование», группа «Сервис». Не нашли команду — «Все функции → Обработки».

Помощник спрашивает дату свёртки — последний день сворачиваемого периода (для остатков на 01.01.2025 — 31.12.2024) — и режим: автоматический или контролируемый, по этапам. Этапы: документы ввода остатков; удаление движений регистров и пометка документов на удаление; проведение документов остатков. Потом — штатное удаление помеченных объектов и неиспользуемых элементов справочников, ссылки на них помощник даёт в конце.

Из встроенной справки (в УТ 11.4 и КА 2.5 она одинаковая):

  • сначала копия, первый прогон — на копии; в РИБ — только в главном узле;
  • дату запрета изменения на время свёртки ставят заведомо ранней (справка предлагает 01.01.1980), потом включают снова;
  • неподтверждённый НДС 0 %, импорт без ГТД, деньги в пути, незавершённое производство и другое не сворачиваются, а удаляются — с таким учётом свёртку не рекомендуют; зарплатные документы остаются как есть, с движениями;
  • удаляется история взаимоотношений с партнёрами — скидки после свёртки могут считаться иначе.

В БП 3.0 своя свёртка — раздел «Свертка информационной базы» в руководстве 1С по ведению учёта ред. 3.0; путь в меню сверьте со справкой релиза. В УТ 10.3 и самописных конфигурациях встроенного помощника нет — только внешние обработки.

Ручная свёртка: порядок из практики

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

  1. Копия и монопольный режим — выгрузка в .dt или бэкап СУБД, пользователей выводят (см. статью о блокировке базы).
  2. Документы остатков на день вперёд — днём, следующим за датой свёртки: установка цен, оприходование товаров, остатки по контрагентам, кассе, зарплате, дисконтным картам, нетиповым регистрам. Их только записывают.
  3. Удаление документов до этой даты, кроме тех, чьи движения — настройки. У автора это «Установка порогов накопительных скидок»: пороги лежат в подчинённом этим документам регистре сведений.
  4. Движения, задачи, последовательности. Подчинённые записи регистров платформа удаляет вместе с документом (у автора документов позже этой даты не было, и регистры накопления он очищал целиком); «сирот» без регистратора чистят отдельно (код — в статье о битых ссылках), задачи удаляют, границы последовательностей переставляют.
  5. Тестирование и исправление с проверкой ссылочной целостности и вариантом «Очищать ссылки» — уйдут ссылки на удалённые документы (подробно — в статье о ТиИ).
  6. Проведение документов остатков и сверка отчётов с копией до свёртки.

Цены переносят документом, потому что регистр «Цены номенклатуры» в УТ 10.3 и УТ 11 подчинён регистратору: удалили старые установки цен — пропали цены. С картами похоже: в УТ 10.3 продажи по картам копятся в регистре оборотов «Продажи по дисконтным картам», и если скидка считается от них, без остатков по картам накопления начнутся с нуля.

Шаг 5 можно запустить из командной строки (клиент-серверная база, логин и пароль — в переменных среды V8USER и V8PWD):

rem Тестирование и исправление после удаления: ссылки на удалённое очищаются, итоги пересчитываются.
rem Файловая база: вместо /S укажите /F "D:\Bases\trade" и добавьте -IBCompression (сжатие таблиц).
"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" DESIGNER /S "srv01\trade" /N "%V8USER%" /P "%V8PWD%" /DisableStartupDialogs /IBCheckAndRepair -LogAndRefsIntegrity -BadRefClear -RecalcTotals /Out "D:\Backup\svertka-tii.log"

Какие регистры сведений не трогать

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

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

Правило: что вводили руками и что описывает, как работать, не трогаем.

Документы остатков по запросу к регистрам

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

// Создаёт документ ввода остатков и заполняет табличные части из пакета запросов:
// результат пакета с номером N попадает в табличную часть ИменаТЧ[N],
// пустая строка в ИменаТЧ - результат пропускается (например, ПОМЕСТИТЬ во временную таблицу).
// Колонки запроса сопоставляются с реквизитами табличной части по именам.
// Документ только записывается: проводить его будем после удаления старых документов.
Функция СоздатьДокументОстатков(ИмяДокумента, ДатаДокумента, Шапка, Запрос, ИменаТЧ) Экспорт

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

	ДокументОбъект = Документы[ИмяДокумента].СоздатьДокумент();
	ДокументОбъект.Дата = ДатаДокумента;
	ЗаполнитьЗначенияСвойств(ДокументОбъект, Шапка);

	ЕстьСтроки = Ложь;
	Для Индекс = 0 По ИменаТЧ.ВГраница() Цикл
		Если ПустаяСтрока(ИменаТЧ[Индекс]) Тогда
			Продолжить;
		КонецЕсли;
		ТабличнаяЧасть = ДокументОбъект[ИменаТЧ[Индекс]];
		Выборка = Результаты[Индекс].Выбрать();
		Пока Выборка.Следующий() Цикл
			ЗаполнитьЗначенияСвойств(ТабличнаяЧасть.Добавить(), Выборка);
			ЕстьСтроки = Истина;
		КонецЦикла;
	КонецЦикла;

	Если Не ЕстьСтроки Тогда
		Возврат Неопределено; // остатков нет - пустой документ не нужен
	КонецЕсли;

	ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
	Возврат ДокументОбъект.Ссылка;

КонецФункции

Пример — УТ 10.3: встроенной свёртки в ней нет, а установка цен и оприходование товаров из заметки автора — её документы. Цены — срез последних по всем типам в одной установке цен. Товары — оприходование на каждый склад по средней себестоимости из «Партий товаров на складах», посчитанной один раз во временную таблицу; количество в регистрах 10.3 хранится в единице хранения остатков, поэтому строка получает эту единицу и её коэффициент.

// Пример для УТ 10.3, управленческий учёт: документы остатков на начало дня ДатаОстатков
// (день, следующий за датой свёртки). Возвращает массив созданных документов.
// Комиссионный товар, разрез по организациям и регламентированный учёт пример не разделяет.
Функция СоздатьДокументыОстатковУТ103(ДатаОстатков, Организация, Ответственный) Экспорт

	Созданные = Новый Массив;
	Комментарий = "Свёртка: остатки на " + Формат(ДатаОстатков, "ДЛФ=D");

	// 1. Цены: срез последних по всем типам цен - в одну установку цен
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Дата", ДатаОстатков);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Цены.ТипЦен КАК ТипЦен,
	|	Цены.Номенклатура КАК Номенклатура,
	|	Цены.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	|	Цены.Цена КАК Цена,
	|	Цены.Валюта КАК Валюта,
	|	Цены.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	|	Цены.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки,
	|	Цены.СпособРасчетаЦены КАК СпособРасчетаЦены
	|ИЗ
	|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК Цены
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	Цены.ТипЦен КАК ТипЦен
	|ИЗ
	|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК Цены";
	ИменаТЧ = Новый Массив;
	ИменаТЧ.Добавить("Товары");
	ИменаТЧ.Добавить("ТипыЦен");
	Шапка = Новый Структура("Ответственный, Комментарий", Ответственный, Комментарий);
	НовыйДокумент = СоздатьДокументОстатков("УстановкаЦенНоменклатуры", ДатаОстатков, Шапка, Запрос, ИменаТЧ);
	Если НовыйДокумент <> Неопределено Тогда
		Созданные.Добавить(НовыйДокумент);
	КонецЕсли;

	// 2. Товары: средняя себестоимость по партиям - один раз во временную таблицу,
	// затем оприходование на каждый склад
	МенеджерВТ = Новый МенеджерВременныхТаблиц;
	ЗапросСебестоимости = Новый Запрос(
	"ВЫБРАТЬ
	|	Партии.Номенклатура КАК Номенклатура,
	|	Партии.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	|	СУММА(Партии.КоличествоОстаток) КАК Количество,
	|	СУММА(Партии.СтоимостьОстаток) КАК Стоимость
	|ПОМЕСТИТЬ ВТСебестоимость
	|ИЗ
	|	РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&Дата, ) КАК Партии
	|
	|СГРУППИРОВАТЬ ПО
	|	Партии.Номенклатура,
	|	Партии.ХарактеристикаНоменклатуры");
	ЗапросСебестоимости.МенеджерВременныхТаблиц = МенеджерВТ;
	ЗапросСебестоимости.УстановитьПараметр("Дата", ДатаОстатков);
	ЗапросСебестоимости.Выполнить();

	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
	Запрос.УстановитьПараметр("Дата", ДатаОстатков);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Остатки.Номенклатура КАК Номенклатура,
	|	Остатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	|	Остатки.СерияНоменклатуры КАК СерияНоменклатуры,
	|	Остатки.Качество КАК Качество,
	|	Остатки.КоличествоОстаток КАК Количество,
	|	Остатки.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
	|	ЕСТЬNULL(Остатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент, 1) КАК Коэффициент,
	|	ВЫБОР
	|		КОГДА Себестоимость.Количество > 0
	|			ТОГДА ВЫРАЗИТЬ(Себестоимость.Стоимость / Себестоимость.Количество КАК ЧИСЛО(15, 2))
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК Цена,
	|	ВЫБОР
	|		КОГДА Себестоимость.Количество > 0
	|			ТОГДА ВЫРАЗИТЬ(Остатки.КоличествоОстаток * Себестоимость.Стоимость / Себестоимость.Количество КАК ЧИСЛО(15, 2))
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК Сумма
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТСебестоимость КАК Себестоимость
	|		ПО Остатки.Номенклатура = Себестоимость.Номенклатура
	|			И Остатки.ХарактеристикаНоменклатуры = Себестоимость.ХарактеристикаНоменклатуры
	|ГДЕ
	|	Остатки.КоличествоОстаток > 0";
	ИменаТЧ = Новый Массив;
	ИменаТЧ.Добавить("Товары");

	ЗапросСкладов = Новый Запрос(
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	Остатки.Склад КАК Склад
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК Остатки");
	ЗапросСкладов.УстановитьПараметр("Дата", ДатаОстатков);
	ВыборкаСкладов = ЗапросСкладов.Выполнить().Выбрать();
	Пока ВыборкаСкладов.Следующий() Цикл
		Запрос.УстановитьПараметр("Склад", ВыборкаСкладов.Склад);
		Шапка = Новый Структура("Организация, Склад, Ответственный, Комментарий, ОтражатьВУправленческомУчете",
			Организация, ВыборкаСкладов.Склад, Ответственный, Комментарий, Истина);
		НовыйДокумент = СоздатьДокументОстатков("ОприходованиеТоваров", ДатаОстатков, Шапка, Запрос, ИменаТЧ);
		Если НовыйДокумент <> Неопределено Тогда
			Созданные.Добавить(НовыйДокумент);
		КонецЕсли;
	КонецЦикла;

	// 3. Взаиморасчёты, касса, дисконтные карты - так же: запрос к регистру и свой документ
	Возврат Созданные;

КонецФункции

Взаиморасчёты, касса, карты, нетиповые регистры — так же (для взаиморасчётов в 10.3 есть «Ввод начальных остатков по взаиморасчетам»). Отрицательные остатки пример отбрасывает — разберитесь с ними до свёртки.

Удаление старых документов пакетами с протоколом

Чтобы удалить старые документы 1С быстро, их удаляют методом Удалить(), а не пометкой (разница — в статье о пометке удаления): поиск ссылок на сотни тысяч документов идёт долго, а ссылки на удалённое очистит ТиИ. Каждый пакет — своя транзакция (подробнее — в статье о транзакциях); откатившийся пакет повторяется поштучно, виновник попадает в протокол.

// Удаляет задачи, бизнес-процессы и документы с датой раньше Граница. Документы остатков
// датированы самой Граница и под удаление не попадают. Каждый пакет - своя транзакция.
// Исключения - соответствие полных имён, например "Документ.УстановкаПороговНакопительныхСкидок".
// Протокол дописывается в текстовый файл; в клиент-серверной базе путь - на сервере 1С.
Процедура УдалитьОбъектыДоДаты(Граница, Исключения, ИмяФайлаПротокола, РазмерПакета = 500) Экспорт

	Протокол = Новый ЗаписьТекста(ИмяФайлаПротокола, КодировкаТекста.UTF8, , Истина);
	Протокол.ЗаписатьСтроку(Формат(ТекущаяДата(), "ДЛФ=DT") + " удаление до " + Формат(Граница, "ДЛФ=DT"));

	Виды = Новый Массив;
	Виды.Добавить(Метаданные.Задачи);
	Виды.Добавить(Метаданные.БизнесПроцессы);
	Виды.Добавить(Метаданные.Документы);

	Для Каждого Коллекция Из Виды Цикл
		Для Каждого МетаОбъект Из Коллекция Цикл
			ПолноеИмя = МетаОбъект.ПолноеИмя();
			Если Исключения.Получить(ПолноеИмя) <> Неопределено Тогда
				Протокол.ЗаписатьСтроку(ПолноеИмя + ": пропущен, в исключениях");
				Продолжить;
			КонецЕсли;
			Удалено = УдалитьОбъектыВида(ПолноеИмя, Граница, РазмерПакета, Протокол);
			Если Удалено > 0 Тогда
				Протокол.ЗаписатьСтроку(ПолноеИмя + ": удалено " + Формат(Удалено, "ЧГ="));
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

	Протокол.ЗаписатьСтроку(Формат(ТекущаяДата(), "ДЛФ=DT") + " удаление закончено");
	Протокол.Закрыть();

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

// Удаляет объекты одного вида пакетами по РазмерПакета, возвращает число удалённых.
Функция УдалитьОбъектыВида(ПолноеИмя, Граница, РазмерПакета, Протокол)

	ТекстЗапроса =
	"ВЫБРАТЬ ПЕРВЫЕ #Размер
	|	Т.Ссылка КАК Ссылка
	|ИЗ
	|	#Таблица КАК Т
	|ГДЕ
	|	Т.Дата < &Граница
	|	И НЕ Т.Ссылка В (&НеУдалось)";
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#Размер", Формат(РазмерПакета, "ЧГ="));
	Запрос = Новый Запрос(СтрЗаменить(ТекстЗапроса, "#Таблица", ПолноеИмя));
	Запрос.УстановитьПараметр("Граница", Граница);

	НеУдалось = Новый Массив; // объекты с ошибкой удаления больше не выбираем
	Удалено = 0;
	Пока Истина Цикл
		Запрос.УстановитьПараметр("НеУдалось", НеУдалось);
		Пакет = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
		Если Пакет.Количество() = 0 Тогда
			Прервать;
		КонецЕсли;

		ТекстОшибки = "";
		Если УдалитьВТранзакции(Пакет, ТекстОшибки) Тогда
			Удалено = Удалено + Пакет.Количество();
			Продолжить;
		КонецЕсли;

		// Пакет откатился целиком - повторяем по одному, чтобы найти виновника
		Для Каждого Ссылка Из Пакет Цикл
			Один = Новый Массив;
			Один.Добавить(Ссылка);
			Если УдалитьВТранзакции(Один, ТекстОшибки) Тогда
				Удалено = Удалено + 1;
			Иначе
				НеУдалось.Добавить(Ссылка);
				Протокол.ЗаписатьСтроку("  ошибка: " + Строка(Ссылка) + " - " + ТекстОшибки);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

	Возврат Удалено;

КонецФункции

// Удаляет объекты массива в одной транзакции; при ошибке откатывает всё и возвращает Ложь.
Функция УдалитьВТранзакции(Ссылки, ТекстОшибки)

	НачатьТранзакцию();
	Попытка
		Для Каждого Ссылка Из Ссылки Цикл
			Объект = Ссылка.ПолучитьОбъект();
			Если Объект = Неопределено Тогда
				Продолжить; // уже удалён
			КонецЕсли;
			Объект.ОбменДанными.Загрузка = Истина; // минимум проверок при удалении
			Объект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; // не регистрировать удаление для обменов
			Объект.Удалить(); // подчинённые записи регистров платформа удалит вместе с документом
		КонецЦикла;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		Возврат Ложь;
	КонецПопытки;

	Возврат Истина;

КонецФункции

Итоги, последовательности и проведение остатков

Перед удалением итоги выключают, иначе они пересчитываются на каждом документе, — так делает и помощник УТ 11. С выключенными итогами виртуальные таблицы остатков недоступны, поэтому их включают до проведения (об итогах — в статье о регистрах накопления).

// Перед удалением: итоги выключены - удаление движений не пересчитывает их на каждом документе.
// Пока итоги выключены, виртуальные таблицы остатков и оборотов недоступны.
Процедура ВыключитьИтоги() Экспорт

	Для Каждого МетаРегистр Из Метаданные.РегистрыНакопления Цикл
		РегистрыНакопления[МетаРегистр.Имя].УстановитьИспользованиеИтогов(Ложь);
	КонецЦикла;
	Для Каждого МетаРегистр Из Метаданные.РегистрыБухгалтерии Цикл
		РегистрыБухгалтерии[МетаРегистр.Имя].УстановитьИспользованиеИтогов(Ложь);
	КонецЦикла;

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

// После удаления: включить итоги и пересчитать их по оставшимся движениям.
Процедура ВключитьИтогиИПересчитать() Экспорт

	Для Каждого МетаРегистр Из Метаданные.РегистрыНакопления Цикл
		Менеджер = РегистрыНакопления[МетаРегистр.Имя];
		Менеджер.УстановитьИспользованиеИтогов(Истина);
		Менеджер.ПересчитатьИтоги();
	КонецЦикла;
	Для Каждого МетаРегистр Из Метаданные.РегистрыБухгалтерии Цикл
		Менеджер = РегистрыБухгалтерии[МетаРегистр.Имя];
		Менеджер.УстановитьИспользованиеИтогов(Истина);
		Менеджер.ПересчитатьИтоги();
	КонецЦикла;

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

// Проводит документы остатков по порядку; ошибку пишет в протокол и идёт дальше.
Функция ПровестиДокументыОстатков(Ссылки, Протокол) Экспорт

	Ошибок = 0;
	Для Каждого Ссылка Из Ссылки Цикл
		ДокументОбъект = Ссылка.ПолучитьОбъект();
		Попытка
			ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
		Исключение
			Ошибок = Ошибок + 1;
			Протокол.ЗаписатьСтроку("  не проведён: " + Строка(Ссылка) + " - "
				+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		КонецПопытки;
	КонецЦикла;
	Возврат Ошибок;

КонецФункции

// Границы последовательностей - на начало дня остатков: всё, что с этой даты и позже,
// считается невосстановленным, и штатное восстановление последовательностей это перепроведёт.
Процедура УстановитьГраницыПоследовательностей(ДатаОстатков) Экспорт

	Для Каждого МетаПоследовательность Из Метаданные.Последовательности Цикл
		Последовательности[МетаПоследовательность.Имя].УстановитьГраницу(ДатаОстатков);
	КонецЦикла;

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

Весь порядок для УТ 10.3 — одной процедурой, на копии и на сервере:

// Свёртка УТ 10.3 целиком: на копии базы, в монопольном режиме.
// ДатаСвертки - последний день сворачиваемого периода, например 31.12.2024.
Процедура ВыполнитьСверткуУТ103(ДатаСвертки, Организация, Ответственный, ИмяФайлаПротокола) Экспорт

	ДатаОстатков = КонецДня(ДатаСвертки) + 1; // 01.01.2025 00:00:00
	УстановитьМонопольныйРежим(Истина); // есть другие сеансы - исключение, ничего не начнётся

	// 1. Документы остатков - пока старые движения на месте и итоги включены
	ДокументыОстатков = СоздатьДокументыОстатковУТ103(ДатаОстатков, Организация, Ответственный);

	// 2. Удаление всего, что раньше даты остатков, кроме документов-настроек
	Исключения = Новый Соответствие;
	Исключения.Вставить("Документ.УстановкаПороговНакопительныхСкидок", Истина);
	ВыключитьИтоги();
	УдалитьОбъектыДоДаты(ДатаОстатков, Исключения, ИмяФайлаПротокола);
	ВключитьИтогиИПересчитать();

	// 3. Проведение документов остатков и границы последовательностей
	Протокол = Новый ЗаписьТекста(ИмяФайлаПротокола, КодировкаТекста.UTF8, , Истина);
	Ошибок = ПровестиДокументыОстатков(ДокументыОстатков, Протокол);
	Протокол.ЗаписатьСтроку("Документов остатков: " + Формат(ДокументыОстатков.Количество(), "ЧН=0; ЧГ=")
		+ ", не проведено: " + Формат(Ошибок, "ЧН=0; ЧГ="));
	Протокол.Закрыть();
	УстановитьГраницыПоследовательностей(ДатаОстатков);

	УстановитьМонопольныйРежим(Ложь);
	// Дальше - конфигуратор: тестирование и исправление с очисткой ссылок на несуществующие объекты

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

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

Почему файл базы не уменьшился

Удалённые строки освобождают место внутри файлов, но файлы не сжимаются. Файловая база — «Сжатие таблиц» в ТиИ (-IBCompression) или выгрузка и загрузка .dt. В SQL Server место возвращает DBCC SHRINKFILE (долго, фрагментирует индексы), в PostgreSQL — VACUUM FULL (эксклюзивная блокировка таблицы и место на диске под её копию).

-- SQL Server: сколько места в файлах базы trade занято, а сколько свободно (МБ)
USE trade;
SELECT name AS logical_name,
       type_desc,
       size / 128 AS size_mb,
       FILEPROPERTY(name, 'SpaceUsed') / 128 AS used_mb
FROM sys.database_files;

-- Вернуть свободное место системе: файл данных - до 40 ГБ (целевой размер в МБ),
-- имя файла - logical_name из запроса выше.
-- Только после полного бэкапа и в нерабочее время: операция долгая и фрагментирует индексы,
-- после неё перестройте индексы регламентом обслуживания.
DBCC SHRINKFILE (N'trade', 40960);

Разбор ключевых строк

  • ИменаТЧ — результат пакета N уходит в табличную часть N, пустое имя пропускает результат (например, ПОМЕСТИТЬ).
  • Остатки(&Дата, ...) на начало дня остатков — это остатки на конец дня свёртки; удаление по той же дате (Т.Дата < &Граница) документы остатков не трогает.
  • Загрузка = Истина — минимум проверок, обработчики по стандарту сразу выходят.
  • АвтоЗаполнение = Ложь — удаление документа не регистрируется для обменов и не уйдёт в другие базы; узлы РИБ после свёртки создают заново.
  • НЕ Т.Ссылка В (&НеУдалось) — неудаляемый объект не выбирается снова, цикл не вечный.
  • НачатьТранзакцию() до Попытка — пакет удаляется целиком или не трогается.

Типичные ошибки

  • Без копии или при работающих пользователях. Свёртка необратима.
  • Удалили установки цен — пропали цены. Нужен новый документ на дату остатков.
  • Почистили регистр с настройками. Учётную политику и штрихкоды вернёт только копия.
  • Документы остатков удалились: датированы последним днём периода или удаление шло «по дату включительно».
  • Всё в одной транзакции. Журнал транзакций SQL Server растёт, и удаление падает: «The transaction log for database 'trade' is full due to 'ACTIVE_TRANSACTION'». Пакеты держат транзакции короткими; при модели восстановления FULL нужны ещё бэкапы журнала.
  • В ТиИ выбрали «Создавать объекты» — для ссылок на удалённое появятся заглушки. Нужно «Очищать ссылки».
  • Итоги остались выключенными — запросы к остаткам и проведение с контролем остатков падают.

Частые вопросы

Сколько места освободит свёртка?

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

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

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

Где смотреть отчёты за прошлые годы?

В копии до свёртки: оставьте её архивом только для чтения.

Свёртка или перенос остатков в новую базу?

Конфигурация та же и база исправна — свёртка. Смена конфигурации или засорённая база — новая база с остатками.

Когда проще заказать

Ошибки свёртки всплывают не сразу: через неделю не сходятся остатки, пропали цены или накопления по картам. Если база доработана или в обмене, отдайте задачу программисту: свёртка на копии, сверка остатков до и после, потом рабочая база. Разместите задачу — оценка бесплатная, ответ в течение рабочего дня; если база не большая, а медленная — услуга «1С тормозит».

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.