Свертка информационной базы — это процедура среза накопленных данных на определенную дату, формирование документов ввода остатков и удаление устаревших первичных документов и их движений. В типовых решениях от 1С (таких как 1С:Бухгалтерия или 1С:Управление торговлей) присутствуют готовые обработки свертки, однако при работе с нетиповой или полностью самописной конфигурацией разработчик сталкивается с необходимостью проектирования индивидуального механизма.
Рассмотрим подробно, с какими архитектурными особенностями платформы 1С вы столкнетесь при свертке нетиповой базы, как правильно организовать программный срез остатков и какие подводные камни следует учитывать.
Прежде чем приступать к написанию кода для удаления документов и свертки регистров, проанализируем ключевые особенности платформы 1С:Предприятие 8.3:
Регистратор является обязательным системным реквизитом. Записи нельзя просто «оставить» в регистре, предварительно удалив сам документ-источник. Для всех остатков на дату свертки должен быть создан специальный документ-регистратор (например, универсальный документ ВводОстатков).<Объект не найден>). В частности, документы прошлого периода часто входят в состав измерений других регистров — служат объектами расчетов в взаиморасчетах или партиями в партионном учете..1CD) необходимо дополнительно выполнять операцию сжатия таблиц через Тестирование и исправление. В клиент-серверном режиме требуется процедура сжатия (Shrink) в Microsoft SQL Server или PostgreSQL.Разберем классический подход к свертке базы данных, который реализуется программным путем прямо в текущей конфигурации:
ВводОстатковПоРегистрам), который станет новым регистратором для всех записей на дату свертки.ВводОстатковПоРегистрам на дату свертки и запишем рассчитанные остатки в соответствующие таблицы регистров.Удалить()).Посмотрим на пример кода, позволяющий с помощью дерева метаданных обойти регистры накопления, рассчитать остатки и сформировать их запись через документ ввода остатков:
// Пример формирования документа ввода остатков по регистрам накопления
ДатаСвертки = НачалоМесяца(ТекущаяДата());
// Создаем новый документ-регистратор для остатков
ДокОстатков = Документы.ВводОстатковПоРегистрам.СоздатьДокумент();
ДокОстатков.Дата = ДатаСвертки - 1; // Записываем остатки на конец предыдущего периода
ДокОстатков.Записать();
// Проходим по всем регистрам накопления в метаданных
Для Каждого МетаданныеРегистра Из Метаданные.РегистрыНакопления Цикл
// Сворачивать имеет смысл только регистры остатков
Если МетаданныеРегистра.ВидРегистра <> Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
Продолжить;
КонецЕсли;
ИмяРегистра = МетаданныеРегистра.Имя;
// Формируем запрос для получения остатков
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| *
|ИЗ
| РегистрНакопления." + ИмяРегистра + ".Остатки(&ДатаОстатков, ) КАК ОстаткиТаблица";
Запрос.УстановитьПараметр("ДатаОстатков", ДатаСвертки);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Продолжить;
КонецЕсли;
// Создаем набор записей для нового регистратора
НаборЗаписей = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокОстатков.Ссылка);
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = НаборЗаписей.ДобавитьПриход();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
КонецЦикла;
// Записываем полученные остатки
НаборЗаписей.Записать(Истина);
КонецЦикла;
Для корректного удаления движений у старых документов используется очистка набора записей регистра с установкой отбора по удаляемому регистратору:
// Очистка движений конкретного документа по регистру
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаСтарыйДокумент);
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
Если цель регулярной свертки — скрытие истории или кардинальное уменьшение объема информационной базы, наиболее чистым техническим решением является ротация баз:
Этот подход гарантирует отсутствие «мусорных» записей, поврежденных ссылок и фрагментации индексов на уровне СУБД.
Если вы хотите ограничить просмотр или изменение прошлых документов пользователями без их физического удаления из базы, разберите варианты с использованием встроенных механизмов платформы: