В процессе эксплуатации системы «1С:Управление производственным предприятием» редакции 1.3 часто возникают задачи по очистке данных. Это может быть связано с разделением баз, исправлением ошибок учета или выводом одной из организаций из состава холдинга. Очистка движений — процедура трудоемкая и ресурсозатратная, особенно если объем документов исчисляется миллионами. В данной статье мы подробно разберем, как правильно подойти к этой задаче, какие инструменты использовать и как минимизировать риски нарушения целостности базы данных.
Прежде чем приступать к удалению, проанализируем, что именно подразумевается под «очисткой движений». В 1С:УПП 1.3 движения — это записи в регистрах накопления, регистрах сведений и регистрах бухгалтерии, которые порождаются документами. Следовательно, очистка может идти двумя путями: либо через отмену проведения/удаление документов-регистраторов, либо через прямое воздействие на записи регистров. Мы рекомендуем первый вариант как наиболее безопасный, однако рассмотрим и продвинутые технические методы.
Если объем данных позволяет, начнем с самого простого и штатного способа. В конфигурации УПП 1.3 существует обработка «Групповая обработка справочников и документов». Проанализируем порядок действий при её использовании:
Организация, указав ту, данные по которой необходимо очистить.Преимущество этого метода в том, что отрабатывают все стандартные механизмы контроля, а данные очищаются корректно с точки зрения логики конфигурации.
В ситуациях, когда нам нужно оставить документы в базе (например, для истории или ссылочной целостности), но полностью обнулить их влияние на баланс и регистры, применим программный метод. Мы можем использовать объект НаборЗаписей. Рассмотрим пример кода, который позволяет очистить движения по конкретному регистратору:
// Пример очистки движений документа
Набор = РегистрыНакопления.Закупки.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);
Набор.Записать(); // Запись пустого набора удаляет движения
Разберем важный нюанс: при массовой обработке тысяч документов необходимо использовать свойство ОбменДанными.Загрузка = Истина. Это критически важно для производительности, так как отключает проверку прав и выполнение тяжелых обработчиков событий в модулях наборов записей. Проанализируем пример оптимизированного цикла:
Для Каждого Док Из ВыборкаДокументов Цикл
Для Каждого Движение Из Док.Движения Цикл
Движение.Прочитать();
Если Движение.Количество() > 0 Тогда
Движение.Очистить();
Движение.ОбменДанными.Загрузка = Истина;
Движение.Записать();
КонецЕсли;
КонецЦикла;
КонецЦикла;
Важно помнить, что в УПП 1.3 существует множество независимых регистров сведений (например, настройки учетной политики, методы распределения расходов), где нет поля Регистратор, но есть измерение Организация. Простое удаление документов их не затронет. Выясним, как их очистить: необходимо сделать выборку по этим регистрам с фильтром по организации и программно удалить записи через НаборЗаписей с установленным отбором по измерению.
Если ваша база работает на MS SQL Server и объем записей составляет десятки миллионов строк, стандартные методы 1С могут занять недели. В этом случае программисты прибегают к прямому удалению записей из таблиц базы данных. Внимание: этот метод требует высочайшей квалификации и обязательного создания резервной копии.
Проанализируем последовательность действий при работе с SQL:
ПолучитьСтруктуруХраненияБазыДанных(). Нас интересуют таблицы _AccumReg... (движения) и _AccumRegTotals... (итоги).Рассмотрим ситуацию, когда мы удаляем объекты через стандартный механизм, но система «подвисает» из-за огромного количества связей. Чтобы этого избежать, реализуем порционное удаление. Вместо того чтобы пытаться удалить всё сразу, будем обрабатывать данные блоками по 1000–5000 объектов в одной транзакции. Это позволит SQL-серверу эффективнее управлять логами транзакций и предотвратит раздувание файла .ldf.
Одной из главных причин медленной очистки движений в 1С является постоянный пересчет итогов. При каждом удалении строки из регистра система пытается обновить текущие итоги. Чтобы ускорить процесс в десятки раз, выполним следующие шаги:
УстановитьИспользованиеИтогов(Ложь)).Такой подход значительно экономит время за счет исключения промежуточных расчетов.
Выясним, что еще нужно очистить, кроме движений. Организация в УПП 1.3 связана со множеством справочников. Чтобы база была действительно чистой, проанализируем связи и пометим на удаление:
Только после удаления всех связанных элементов справочников и документов мы сможем окончательно удалить саму запись в справочнике Организации.
Мы рассмотрели различные подходы к очистке движений в УПП 1.3. Помните, что для небольших и средних баз оптимальным является использование штатной групповой обработки с предварительным отключением итогов. Для сверхбольших баз эффективнее применять программную запись пустых наборов с флагом ОбменДанными.Загрузка = Истина. Всегда проверяйте результат через отчет «Оборотно-сальдовая ведомость» или консоль запросов, чтобы убедиться, что в базе не осталось «хвостов» по удаленной организации.