Как правильно выполнить свертку нетиповой базы в 1С:Предприятие 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Свертка информационной базы — это процедура среза накопленных данных на определенную дату, формирование документов ввода остатков и удаление устаревших первичных документов и их движений. В типовых решениях от 1С (таких как 1С:Бухгалтерия или 1С:Управление торговлей) присутствуют готовые обработки свертки, однако при работе с нетиповой или полностью самописной конфигурацией разработчик сталкивается с необходимостью проектирования индивидуального механизма.

Рассмотрим подробно, с какими архитектурными особенностями платформы 1С вы столкнетесь при свертке нетиповой базы, как правильно организовать программный срез остатков и какие подводные камни следует учитывать.

Ограничения платформы 1С и архитектура регистров

Прежде чем приступать к написанию кода для удаления документов и свертки регистров, проанализируем ключевые особенности платформы 1С:Предприятие 8.3:

  1. Режим записи «Подчинение регистратору»: Регистры накопления, бухгалтерии и расчета технически не могут содержать записи без привязанного документа. Поле Регистратор является обязательным системным реквизитом. Записи нельзя просто «оставить» в регистре, предварительно удалив сам документ-источник. Для всех остатков на дату свертки должен быть создан специальный документ-регистратор (например, универсальный документ ВводОстатков).
  2. Ссылочная целостность: Попытка удалить старые документы без предварительной очистки аналитики приведет к появлению битых ссылок (вида <Объект не найден>). В частности, документы прошлого периода часто входят в состав измерений других регистров — служат объектами расчетов в взаиморасчетах или партиями в партионном учете.
  3. Физический размер базы данных: Простое удаление документов из программы программным методом не освобождает дисковое пространство автоматически. В файловом режиме (файл .1CD) необходимо дополнительно выполнять операцию сжатия таблиц через Тестирование и исправление. В клиент-серверном режиме требуется процедура сжатия (Shrink) в Microsoft SQL Server или PostgreSQL.

Пошаговый алгоритм свертки нетиповой базы

Разберем классический подход к свертке базы данных, который реализуется программным путем прямо в текущей конфигурации:

  1. Создание полной архивной копии: Перед выполнением любых операций обязательно сохраним копию базы. Это позволит обратиться к прошлым документам при необходимости расшифровки старых операций.
  2. Проектирование специализированного документа: Добавим в конфигурацию служебный документ (например, ВводОстатковПоРегистрам), который станет новым регистратором для всех записей на дату свертки.
  3. Расчет остатков на границу периода: С помощью запросов получим остатки по всем необходимым регистрам накопления и бухгалтерии на начало месяца (граница свертки).
  4. Запись остатков новым документом: Сформируем документ ВводОстатковПоРегистрам на дату свертки и запишем рассчитанные остатки в соответствующие таблицы регистров.
  5. Очистка движений и удаление старых документов: Программно очистим наборы записей прошлых документов и установим пометку удаления (или вызовем непосредственное удаление через метод Удалить()).

Пример программного обхода регистров и фиксации остатков

Посмотрим на пример кода, позволяющий с помощью дерева метаданных обойти регистры накопления, рассчитать остатки и сформировать их запись через документ ввода остатков:


// Пример формирования документа ввода остатков по регистрам накопления
ДатаСвертки = НачалоМесяца(ТекущаяДата());

// Создаем новый документ-регистратор для остатков
ДокОстатков = Документы.ВводОстатковПоРегистрам.СоздатьДокумент();
ДокОстатков.Дата = ДатаСвертки - 1; // Записываем остатки на конец предыдущего периода
ДокОстатков.Записать();

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

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


// Очистка движений конкретного документа по регистру
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаСтарыйДокумент);
НаборЗаписей.Очистить();
НаборЗаписей.Записать();

Альтернативный вариант: ротация баз (выгрузка остатков)

Если цель регулярной свертки — скрытие истории или кардинальное уменьшение объема информационной базы, наиболее чистым техническим решением является ротация баз:

  1. Текущая рабочая база сохраняется в архив.
  2. Создается пустая информационная база с аналогичной конфигурацией.
  3. Из рабочей базы выгружаются только нормативно-справочная информация (НСИ) и рассчитанные остатки на 1-е число месяца (например, через механизмы XML или JSON).
  4. В новой базе автоматически создаются документы ввода остатков, а вся история старых документов остается в архиве.

Этот подход гарантирует отсутствие «мусорных» записей, поврежденных ссылок и фрагментации индексов на уровне СУБД.

Решение задачи через права доступа и даты запрета

Если вы хотите ограничить просмотр или изменение прошлых документов пользователями без их физического удаления из базы, разберите варианты с использованием встроенных механизмов платформы:

← На главную