В процессе длительной эксплуатации учетных систем, таких как 1С:ERP или 1С:Управление торговлей, часто возникает проблема «раздувания» таблиц регистров накопления. Огромное количество «висячих» остатков по давно закрытым или забытым заказам приводит к тому, что таблицы данных и их индексы занимают десятки гигабайт. Это негативно сказывается на скорости проведения документов и формировании отчетов. Разберем, как справиться с этой проблемой эффективно и безопасно.
Прежде чем приступать к очистке, важно понять, почему данные не были закрыты своевременно. В большинстве случаев это происходит из-за того, что бизнес-процесс завершился фактически, но в системе не был сформирован финальный документ (например, документ Закрытие заказа или отмена строк). Также причиной могут быть сбои при проведении транзакций в прошлых периодах. Поскольку остатки не закрыты, они продолжают учитываться в итоговых таблицах, увеличивая объем базы.
Главная ошибка — пытаться закрыть все остатки за несколько лет одним движением. Это приведет к огромной транзакции, росту журнала регистрации (лог-файла) и блокировке работы пользователей. Мы рекомендуем использовать метод порционной обработки.
отмены строк заказов. Это обеспечит корректное отражение изменений во всех связанных регистрах.После того как записи в регистре были скорректированы (фактически обнулены), в таблице итогов всё еще могут присутствовать записи с нулевыми значениями. Чтобы их удалить, необходимо выполнить ПересчитатьИтоги().
Для максимально эффективной очистки базы, особенно при работе с большими объемами данных (сотни миллионов записей), рассмотрим продвинутый подход:
Важное предупреждение: Использование низкоуровневых операций на уровне СУБД требует квалификации администратора баз данных. Обязательно делайте резервную копию перед выполнением любых действий с таблицами SQL!
Опытные разработчики отмечают, что после закрытия больших объемов данных выполнение процедуры ПересчитатьИтоги() может занимать много времени. Иногда более эффективным методом является очистка (truncation) итоговых таблиц с последующим пересчетом. Посмотрим на алгоритм действий:
truncate соответствующих таблиц итогов регистра на стороне СУБД (требует глубокого понимания структуры базы).ПересчитатьИтоги(). Это позволит перестроить индексы и удалить «мусорные» записи, которые мешали работе оптимизатора запросов.Чтобы ситуация не повторилась через год, внедрим регламентные процедуры:
Разработаем РегламентноеЗадание, которое будет анализировать заказы, имеющие остатки, но не имеющие движений (или обновлений) в течение длительного периода. Такое задание может автоматически проставлять статус «Закрыт» для заказов, превышающих, например, годовой «возраст». Это позволит поддерживать регистры в «чистом» состоянии на постоянной основе, предотвращая их чрезмерное разрастание.
Таким образом, мы не просто удаляем данные, а обеспечиваем чистоту учета, что положительно сказывается на производительности всей системы.