Как оптимально очистить движения по конкретной организации в 1С:УПП 1.3

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

В процессе эксплуатации системы «1С:Управление производственным предприятием» редакции 1.3 часто возникают задачи по очистке данных. Это может быть связано с разделением баз, исправлением ошибок учета или выводом одной из организаций из состава холдинга. Очистка движений — процедура трудоемкая и ресурсозатратная, особенно если объем документов исчисляется миллионами. В данной статье мы подробно разберем, как правильно подойти к этой задаче, какие инструменты использовать и как минимизировать риски нарушения целостности базы данных.

Анализ задачи и выбор стратегии

Прежде чем приступать к удалению, проанализируем, что именно подразумевается под «очисткой движений». В 1С:УПП 1.3 движения — это записи в регистрах накопления, регистрах сведений и регистрах бухгалтерии, которые порождаются документами. Следовательно, очистка может идти двумя путями: либо через отмену проведения/удаление документов-регистраторов, либо через прямое воздействие на записи регистров. Мы рекомендуем первый вариант как наиболее безопасный, однако рассмотрим и продвинутые технические методы.

Метод 1. Использование встроенной групповой обработки

Если объем данных позволяет, начнем с самого простого и штатного способа. В конфигурации УПП 1.3 существует обработка «Групповая обработка справочников и документов». Проанализируем порядок действий при её использовании:

  1. Откроем обработку и выберем тип объекта «Документы».
  2. Настроим фильтр по полю Организация, указав ту, данные по которой необходимо очистить.
  3. Выберем все найденные документы и установим действие «Изменить состояние: Отменить проведение».
  4. После этого записи во всех связанных регистрах накопления и бухгалтерии будут удалены автоматически самой платформой.
  5. Следующим шагом можно установить пометку на удаление на эти же объекты.

Преимущество этого метода в том, что отрабатывают все стандартные механизмы контроля, а данные очищаются корректно с точки зрения логики конфигурации.

Метод 2. Программная очистка через наборы записей

В ситуациях, когда нам нужно оставить документы в базе (например, для истории или ссылочной целостности), но полностью обнулить их влияние на баланс и регистры, применим программный метод. Мы можем использовать объект НаборЗаписей. Рассмотрим пример кода, который позволяет очистить движения по конкретному регистратору:


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

Разберем важный нюанс: при массовой обработке тысяч документов необходимо использовать свойство ОбменДанными.Загрузка = Истина. Это критически важно для производительности, так как отключает проверку прав и выполнение тяжелых обработчиков событий в модулях наборов записей. Проанализируем пример оптимизированного цикла:


Для Каждого Док Из ВыборкаДокументов Цикл
    Для Каждого Движение Из Док.Движения Цикл
        Движение.Прочитать();
        Если Движение.Количество() > 0 Тогда
            Движение.Очистить();
            Движение.ОбменДанными.Загрузка = Истина;
            Движение.Записать();
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Метод 3. Очистка независимых регистров сведений

Важно помнить, что в УПП 1.3 существует множество независимых регистров сведений (например, настройки учетной политики, методы распределения расходов), где нет поля Регистратор, но есть измерение Организация. Простое удаление документов их не затронет. Выясним, как их очистить: необходимо сделать выборку по этим регистрам с фильтром по организации и программно удалить записи через НаборЗаписей с установленным отбором по измерению.

Метод 4. Оптимизация через SQL (Advanced)

Если ваша база работает на MS SQL Server и объем записей составляет десятки миллионов строк, стандартные методы 1С могут занять недели. В этом случае программисты прибегают к прямому удалению записей из таблиц базы данных. Внимание: этот метод требует высочайшей квалификации и обязательного создания резервной копии.

Проанализируем последовательность действий при работе с SQL:

  1. Выясним соответствие имен таблиц 1С именам в SQL. Для этого используем функцию ПолучитьСтруктуруХраненияБазыДанных(). Нас интересуют таблицы _AccumReg... (движения) и _AccumRegTotals... (итоги).
  2. Составим SQL-запрос на удаление (DELETE) записей, где идентификатор организации совпадает с целевым.
  3. Сначала удаляем записи из таблиц итогов, затем из таблиц движений.
  4. После завершения SQL-операций обязательно запускаем в Конфигураторе «Тестирование и исправление» с флагами «Пересчет итогов» и «Реиндексация таблиц».

Метод 5. Порционное удаление (Batch Processing)

Рассмотрим ситуацию, когда мы удаляем объекты через стандартный механизм, но система «подвисает» из-за огромного количества связей. Чтобы этого избежать, реализуем порционное удаление. Вместо того чтобы пытаться удалить всё сразу, будем обрабатывать данные блоками по 1000–5000 объектов в одной транзакции. Это позволит SQL-серверу эффективнее управлять логами транзакций и предотвратит раздувание файла .ldf.

Отключение итогов как ключ к ускорению

Одной из главных причин медленной очистки движений в 1С является постоянный пересчет итогов. При каждом удалении строки из регистра система пытается обновить текущие итоги. Чтобы ускорить процесс в десятки раз, выполним следующие шаги:

  1. Отключим использование итогов для всех регистров (через УстановитьИспользованиеИтогов(Ложь)).
  2. Произведем массовое удаление данных или отмену проведения документов.
  3. Включим использование итогов обратно.
  4. Выполним полный пересчет итогов за один раз.

Такой подход значительно экономит время за счет исключения промежуточных расчетов.

Проверка ссылочной целостности

Выясним, что еще нужно очистить, кроме движений. Организация в УПП 1.3 связана со множеством справочников. Чтобы база была действительно чистой, проанализируем связи и пометим на удаление:

Только после удаления всех связанных элементов справочников и документов мы сможем окончательно удалить саму запись в справочнике Организации.

Заключение

Мы рассмотрели различные подходы к очистке движений в УПП 1.3. Помните, что для небольших и средних баз оптимальным является использование штатной групповой обработки с предварительным отключением итогов. Для сверхбольших баз эффективнее применять программную запись пустых наборов с флагом ОбменДанными.Загрузка = Истина. Всегда проверяйте результат через отчет «Оборотно-сальдовая ведомость» или консоль запросов, чтобы убедиться, что в базе не осталось «хвостов» по удаленной организации.

← На главную