Как эффективно свернуть большую распределенную информационную базу (РИБ) в 1С?

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

Свертка большой распределенной информационной базы (РИБ) — это одна из самых сложных задач, с которыми сталкивается администратор или программист 1С. Основная проблема заключается в том, что стандартные механизмы свертки при работе с огромными массивами данных (сотни гигабайт и миллионы документов) могут выполняться неделями, что абсолютно неприемлемо для работающего бизнеса. Кроме того, в условиях РИБ возникает риск «заспамить» каналы связи гигантскими пакетами обмена с информацией об удалениях.

В этой статье мы подробно разберем, как оптимизировать этот процесс, проанализируем различные методики и выберем наиболее эффективные инструменты для ускорения свертки.

Проблема стандартной свертки и ее причины

Стандартная обработка СверткаБазы работает по следующему алгоритму: создание документов ввода остатков, пометка документов на удаление и последующее их физическое удаление с контролем ссылочной целостности. На больших объемах этот процесс «упирается» в несколько ограничений:

  1. Транзакционный лог (LDF): Каждое удаление фиксируется в логе, который может вырасти до размеров, превышающих саму базу.
  2. Обновление индексов: При удалении каждой записи SQL-сервер тратит ресурсы на перестроение индексов таблиц.
  3. Регистрация изменений в РИБ: Система пытается записать информацию об удалении каждого объекта в таблицы регистрации изменений, чтобы передать эти данные в другие узлы.
  4. Однопоточность: Стандартное удаление объектов в 1С происходит последовательно, не используя всю мощность современных многоядерных серверов.

Метод 1. Гибридная свертка и многопоточная очистка

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

Сначала мы создаем документы «Корректировка записей регистров» (КЗР) или специализированные документы ввода остатков на выбранную дату. Это делается стандартными средствами, так как этот этап обычно проходит достаточно быстро. Самая трудоемкая часть — удаление старых движений и документов — выполняется следующим образом:

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

Шаг 2: Фоновое удаление документов. После того как остатки зафиксированы, а движения старых документов очищены, сами документы перестают влиять на учет. Их можно помечать на удаление «неспешно» в течение недели в фоновом режиме, порциями по 1000–5000 штук, чтобы не блокировать работу пользователей.


// Пример логики запуска фонового удаления
ПараметрыЗапуска = Новый Структура("ДатаСвертки, МассивДокументов");
ФоновыеЗадания.Выполнить("МойМодуль.ПроцедураУдаления", ПараметрыЗапуска);

Метод 2. Прямое удаление через SQL (Direct SQL)

Выясним причину, почему это самый быстрый способ. Использование DELETE или TRUNCATE на уровне СУБД позволяет обойти объектную логику 1С и механизмы регистрации изменений. Внимание: этот метод требует глубокого понимания структуры таблиц 1С и должен выполняться только после создания резервной копии.

Для ускорения процесса на уровне SQL рекомендуется:

  1. Перевести модель восстановления базы данных (Recovery Model) в режим Simple. Это предотвратит бесконтрольный рост файла лога транзакций.
  2. Отключить итоги в 1С перед выполнением операций. Программный код будет выглядеть так:
    
    РегистрыНакопления.Продажи.УстановитьИспользованиеИтогов(Ложь);
    // Аналогично для всех тяжелых регистров
    
  3. Использовать скрипты для удаления записей из таблиц регистра накопления (например, _AccumReg123) по условию даты.
  4. Обязательно очистить таблицы регистрации изменений (_DocumentChngRec), иначе при первом же обмене система попытается выгрузить «пустые» ссылки на удаленные данные.

Этот метод позволяет свернуть 1–2 года данных за одни выходные даже на очень нагруженных базах.

Метод 3. Свертка через «клон» узла РИБ

Разберем по шагам специфический метод для распределенных систем. Если база является центральным узлом РИБ, можно воспользоваться механизмом создания начального образа.

  1. Создаем полную копию центральной базы (еще один узел).
  2. В этой копии проводим агрессивную свертку любым удобным способом (включая SQL).
  3. Так как это РИБ, удаление объектов будет распространяться по узлам через сообщения обмена.
  4. Чтобы не «положить» каналы связи, в центральной базе перед очисткой отключаем авторегистрацию изменений для удаляемых объектов.

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


ПланыОбмена.УстановитьРегистрациюИзменений(УзелМагазин, Ложь);
// Проводим удаление
ПланыОбмена.УстановитьРегистрациюИзменений(УзелМагазин, Истина);

Метод «Инвертированной» свертки (Перенос в чистую базу)

Иногда проще не удалять старое, а перенести нужное в новое. Рассмотрим этот алгоритм:

  1. Создаем пустую базу той же конфигурации.
  2. Переносим справочники и остатки на дату свертки (например, через XML или COM-соединение).
  3. Главная хитрость для РИБ: Чтобы сохранить работоспособность магазинов без переинициализации их баз, в новой центральной базе нужно программно создать узлы планов обмена с теми же самыми GUID и кодами, которые были в старой базе.
  4. После этого магазины «узнают» новую центральную базу как свою и продолжат обмен, начиная с чистого листа.

Важные технические нюансы после свертки

После физического удаления данных размер файлов базы данных (MDF/LDF) на диске не уменьшится автоматически. Чтобы вернуть место операционной системе и восстановить производительность, необходимо выполнить следующие действия:

Подведем итог: для свертки большой РИБ наиболее эффективным является сочетание прямой работы с SQL (для очистки движений) и многопоточного удаления документов в 1С с обязательным контролем регистрации изменений в плане обмена. Это позволяет сократить время выполнения процедуры с недель до десятков часов.

← На главную