При длительной и неаккуратной эксплуатации базы данных «1С:Предприятие 7.7» (особенно конфигураций «Торговля и Склад» или «Комплексная конфигурация») пользователи нередко сталкиваются с катастрофическим разрастанием базы данных. Таблица итогов регистра накопления (в базе SQL она имеет префикс RG) может раздуваться до десятков и сотен гигабайт. При этом реальных остатков может быть немного, но база начинает критически тормозить при проведении документов и формировании отчетов.
Разберем детально, почему это происходит, как правильно закрыть зависшие «хвосты» во взаиморасчетах и вернуть базу к нормальному рабочему состоянию.
Для понимания корня проблемы проанализируем архитектуру хранения итогов платформы 1С 7.7. В отличие от более поздних версий, регистры накопления в «семерке» рассчитывают и фиксируют остатки помесячно. Если в каком-то месяце сформировался остаток, платформа будет дублировать его в таблице итогов за каждый последующий месяц вплоть до точки актуальности (ТА).
Главные причины лавинообразного роста таблицы итогов регистра взаиморасчетов:
КредДокумент: В типовых конфигурациях взаиморасчеты ведутся не просто по контрагентам и договорам, но и в разрезе документов поставки/оплаты (измерение КредДокумент). Если документы оформлялись задним числом, с нарушением последовательности или в модулях проведения была допущена ошибка, приход ложится на один документ (или пустое значение), а расход — на другой. Для общего отчета по контрагенту баланс равен нулю («свернутое сальдо»), но для регистра это две параллельные незакрытые ветки: плюс 10 000 по одной строке и минус 10 000 по другой. Обе эти строки переносятся из месяца в месяц годами.Рассмотрим вариант, когда базу нельзя кардинально перекраивать на уровне структуры метаданных, но необходимо закрыть развернутые нулевые остатки. Для этого создается специальный документ (например, «Корректировка взаиморасчетов» или «Списание долгов»), который делает движения по регистру взаиморасчетов.
Алгоритм действий следующий:
Контрагент, Договор, КредДокумент.Обратите внимание на важные правила пакетной обработки данных в 1С 7.7:
.LDF) и блокировке всей базы. Транзакции необходимо дробить, например, закрывать через каждые 500–1000 документов.Simple.Посмотрим на пример пакетной фиксации изменений в коде внешней обработки:
КоличествоВТранзакции = 0;
НачатьТранзакцию();
Пока Выборка.ПолучитьСтроку() = 1 Цикл
// Создание и заполнение корректирующего документа
Док = СоздатьОбъект("Документ.КорректировкаДолга");
Док.Новый();
Док.ДатаДок = ТекущаяДата();
// Заполнение реквизитов и табличной части
// ...
Док.Записать();
Док.Провести();
КоличествоВТранзакции = КоличествоВТранзакции + 1;
Если КоличествоВТранзакции >= 500 Тогда
ЗафиксироватьТранзакцию();
КоличествоВТранзакции = 0;
НачатьТранзакцию();
КонецЕсли;
КонецЦикла;
Если КоличествоВТранзакции > 0 Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Если аналитика по расчетным документам (КредДокумент) на предприятии фактически не ведется, учет запущен годами, а счета-фактуры и книги покупок/продаж по данному регистру формировать не требуется, самым быстрым и радикальным техническим решением является изменение структуры регистра.
Разберем по шагам, как это выполнить:
КредДокумент. Если учет по нему не нужен — снимаем у него признак учета либо удаляем данное измерение.Контрагент, Договор). Все взаимозачетные «нули» самоуничтожатся, и таблица RG уменьшится в десятки раз.Когда база разрослась до 100 гигабайт, лучшей стратегией является полная или частичная свертка. Проанализируем правильную последовательность действий:
RA) за прошлые закрытые периоды. Если зачистка делается через базу данных SQL, таблицу итогов RG можно усечь (TRUNCATE TABLE), после чего выполнить штатный пересчет итогов в монопольном режиме.Для временного снижения нагрузки и уменьшения объема рассчитываемых данных проверьте границы периода итогов:
Применение одного из этих подходов (или их комбинации: схлопывание нулевых сальдо с последующей сверткой) позволяет сократить базу объемом 100 Гб до считанных гигабайт и полностью восстановить производительность проведения документов.