Свёртка базы 1С — удаление документов за закрытые периоды с переносом остатков на дату свёртки: история уходит, остатки, цены и настройки остаются, база становится меньше и быстрее. Разберём штатную свёртку в УТ 11, КА 2 и БП 3.0, ручной порядок из практики автора (розничная сеть) и код: документы остатков по запросу к регистрам и удаление старых документов пакетами с протоколом.
Сворачивают, когда база выросла, а старые периоды закрыты: отчётность сдана, задним числом ничего не правят. Поводы — долгие бэкапы и обновления, медленные отчёты, нехватка диска.
Альтернатива — перенос остатков в новую базу 1С: пустая база, в неё переносят справочники и остатки (см. статью о выгрузке и загрузке данных XML).
| Что | Свёртка в той же базе | Новая база с остатками |
|---|---|---|
| Справочники, пользователи, настройки | остаются | переносят заново |
| Регистры сведений | остаются, кроме подчинённых документам | только перенесённое |
| Обмены и доработки | работают, РИБ — с оговорками | подключают заново |
| Битые ссылки и мусор | остаются | не переносятся |
| Когда выбирать | база исправна, нужна легче | смена конфигурации, база засорена |
Сначала посмотрите, что занимает место. Иногда больше всего весят не документы, а версии объектов (регистр «Версии объектов» в конфигурациях на БСП), присоединённые файлы или нетиповые журналы — тогда хватит почистить их. Журнал регистрации хранится в файлах, а не в таблицах базы, и свёртка его не уменьшит.
Метод ПолучитьРазмерДанныхБазыДанных есть с платформы 8.3.15 и считает только доступные пользователю данные — запускайте функцию на сервере под администратором.
// Какие объекты занимают место в базе: таблица «объект - размер, МБ» по убыванию.
// ПолучитьРазмерДанныхБазыДанных есть в платформе с 8.3.15 и считает только данные,
// доступные пользователю для чтения, - запускайте на сервере под администратором.
Функция РазмерыОбъектовБазы(МинимумМБ = 50) Экспорт
Коллекции = Новый Массив;
Коллекции.Добавить(Метаданные.Документы);
Коллекции.Добавить(Метаданные.РегистрыНакопления);
Коллекции.Добавить(Метаданные.РегистрыСведений);
Коллекции.Добавить(Метаданные.РегистрыБухгалтерии);
Коллекции.Добавить(Метаданные.Справочники);
Размеры = Новый ТаблицаЗначений;
Размеры.Колонки.Добавить("Объект", Новый ОписаниеТипов("Строка"));
Размеры.Колонки.Добавить("РазмерМБ", Новый ОписаниеТипов("Число"));
Для Каждого Коллекция Из Коллекции Цикл
Для Каждого МетаОбъект Из Коллекция Цикл
Состав = Новый Массив;
Состав.Добавить(МетаОбъект);
// Первый параметр - пустой массив: считаем только объекты из Состав
Байт = ПолучитьРазмерДанныхБазыДанных(Новый Массив, Состав);
Если Байт < МинимумМБ * 1048576 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = Размеры.Добавить();
НоваяСтрока.Объект = МетаОбъект.ПолноеИмя();
НоваяСтрока.РазмерМБ = Окр(Байт / 1048576);
КонецЦикла;
КонецЦикла;
Размеры.Сортировать("РазмерМБ Убыв");
Возврат Размеры;
КонецФункции
На платформе ниже 8.3.15 (или если метод недоступен в режиме совместимости вашей конфигурации) размеры таблиц покажет СУБД, а имена таблиц с объектами сопоставит ПолучитьСтруктуруХраненияБазыДанных().
Для свёртки базы 1С в УТ 11 и КА 2 есть обработка «Свертка информационной базы» — пошаговый помощник. В выгрузках УТ 11.4 и КА 2.5 её команда стоит в разделе «НСИ и администрирование», группа «Сервис». Не нашли команду — «Все функции → Обработки».
Помощник спрашивает дату свёртки — последний день сворачиваемого периода (для остатков на 01.01.2025 — 31.12.2024) — и режим: автоматический или контролируемый, по этапам. Этапы: документы ввода остатков; удаление движений регистров и пометка документов на удаление; проведение документов остатков. Потом — штатное удаление помеченных объектов и неиспользуемых элементов справочников, ссылки на них помощник даёт в конце.
Из встроенной справки (в УТ 11.4 и КА 2.5 она одинаковая):
В БП 3.0 своя свёртка — раздел «Свертка информационной базы» в руководстве 1С по ведению учёта ред. 3.0; путь в меню сверьте со справкой релиза. В УТ 10.3 и самописных конфигурациях встроенного помощника нет — только внешние обработки.
Так автор сворачивал базу розничной сети на доработанной конфигурации: документы остатков создают, пока старые движения на месте, а проводят, когда старого уже нет.
Цены переносят документом, потому что регистр «Цены номенклатуры» в УТ 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"
Независимые регистры сведений удаление документов не задевает, чистить их не обязательно. Автор чистил их все, кроме белого списка:
Правило: что вводили руками и что описывает, как работать, не трогаем.
Функция создаёт документ и раскладывает результаты пакета запросов по табличным частям, сопоставляя колонки с реквизитами по именам: на каждый участок учёта пишется только запрос (отладить его удобно в консоли запросов).
// Создаёт документ ввода остатков и заполняет табличные части из пакета запросов:
// результат пакета с номером 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, пустое имя пропускает результат (например, ПОМЕСТИТЬ).Остатки(&Дата, ...) на начало дня остатков — это остатки на конец дня свёртки; удаление по той же дате (Т.Дата < &Граница) документы остатков не трогает.Загрузка = Истина — минимум проверок, обработчики по стандарту сразу выходят.АвтоЗаполнение = Ложь — удаление документа не регистрируется для обменов и не уйдёт в другие базы; узлы РИБ после свёртки создают заново.НЕ Т.Ссылка В (&НеУдалось) — неудаляемый объект не выбирается снова, цикл не вечный.НачатьТранзакцию() до Попытка — пакет удаляется целиком или не трогается.Столько, сколько занимают удаляемые документы с движениями, — оцените функцией из начала статьи. Файл базы сам при этом не уменьшится.
Нет: остатки снимаются на дату, а документы, введённые во время удаления, испортят результат. Делают ночью или в выходные, первый раз — на копии, чтобы знать время.
В копии до свёртки: оставьте её архивом только для чтения.
Конфигурация та же и база исправна — свёртка. Смена конфигурации или засорённая база — новая база с остатками.
Ошибки свёртки всплывают не сразу: через неделю не сходятся остатки, пропали цены или накопления по картам. Если база доработана или в обмене, отдайте задачу программисту: свёртка на копии, сверка остатков до и после, потом рабочая база. Разместите задачу — оценка бесплатная, ответ в течение рабочего дня; если база не большая, а медленная — услуга «1С тормозит».
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.