Как закрыть регистр взаиморасчетов и уменьшить распухшую таблицу итогов в 1С 7.7?

Программист 1С v7.7 Управленческий учет IT и автоматизация бизнеса
← На главную

При длительной и неаккуратной эксплуатации базы данных «1С:Предприятие 7.7» (особенно конфигураций «Торговля и Склад» или «Комплексная конфигурация») пользователи нередко сталкиваются с катастрофическим разрастанием базы данных. Таблица итогов регистра накопления (в базе SQL она имеет префикс RG) может раздуваться до десятков и сотен гигабайт. При этом реальных остатков может быть немного, но база начинает критически тормозить при проведении документов и формировании отчетов.

Разберем детально, почему это происходит, как правильно закрыть зависшие «хвосты» во взаиморасчетах и вернуть базу к нормальному рабочему состоянию.

Выясним причину: почему распухает таблица итогов RG

Для понимания корня проблемы проанализируем архитектуру хранения итогов платформы 1С 7.7. В отличие от более поздних версий, регистры накопления в «семерке» рассчитывают и фиксируют остатки помесячно. Если в каком-то месяце сформировался остаток, платформа будет дублировать его в таблице итогов за каждый последующий месяц вплоть до точки актуальности (ТА).

Главные причины лавинообразного роста таблицы итогов регистра взаиморасчетов:

  1. Расползание по измерению КредДокумент: В типовых конфигурациях взаиморасчеты ведутся не просто по контрагентам и договорам, но и в разрезе документов поставки/оплаты (измерение КредДокумент). Если документы оформлялись задним числом, с нарушением последовательности или в модулях проведения была допущена ошибка, приход ложится на один документ (или пустое значение), а расход — на другой. Для общего отчета по контрагенту баланс равен нулю («свернутое сальдо»), но для регистра это две параллельные незакрытые ветки: плюс 10 000 по одной строке и минус 10 000 по другой. Обе эти строки переносятся из месяца в месяц годами.
  2. Сбитая последовательность документов: При отключенном или заброшенном контроле последовательностей типовые алгоритмы распределения долга по методу ФИФО перестают корректно определять исходную задолженность, из-за чего долги перестают зачитываться автоматически.
  3. Дубли контрагентов и договоров: Создание менеджерами новых элементов справочников под каждую отдельную продажу без последующей корректной привязки оплат приводит к накоплению сотен тысяч уникальных веток аналитики.

Способ 1. Создание корректирующего документа для схлопывания движений

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

Алгоритм действий следующий:

  1. Формируем программный отчет по регистру взаиморасчетов с полной детализацией по всем измерениям: Контрагент, Договор, КредДокумент.
  2. Находим пары или группы строк по одному договору, дающие в сумме нулевое сальдо.
  3. Создаем обработку, которая генерирует документы корректировки, списывающие зависшие положительные и отрицательные остатки в разрезе проблемных документов и выравнивающие остаток в ноль.

Обратите внимание на важные правила пакетной обработки данных в 1С 7.7:

  1. Транзакции порциями: Нельзя запускать создание сотен тысяч движений в одной общей транзакции — это приведет к переполнению журнала транзакций MS SQL Server (файла .LDF) и блокировке всей базы. Транзакции необходимо дробить, например, закрывать через каждые 500–1000 документов.
  2. Простая модель восстановления: Перед проведением массовых корректировок на MS SQL Server переведите модель восстановления базы (Recovery Model) в режим Simple.

Посмотрим на пример пакетной фиксации изменений в коде внешней обработки:


КоличествоВТранзакции = 0;
НачатьТранзакцию();

Пока Выборка.ПолучитьСтроку() = 1 Цикл
    // Создание и заполнение корректирующего документа
    Док = СоздатьОбъект("Документ.КорректировкаДолга");
    Док.Новый();
    Док.ДатаДок = ТекущаяДата();
    // Заполнение реквизитов и табличной части
    // ...
    Док.Записать();
    Док.Провести();

    КоличествоВТранзакции = КоличествоВТранзакции + 1;
    Если КоличествоВТранзакции >= 500 Тогда
        ЗафиксироватьТранзакцию();
        КоличествоВТранзакции = 0;
        НачатьТранзакцию();
    КонецЕсли;
КонецЦикла;

Если КоличествоВТранзакции > 0 Тогда
    ЗафиксироватьТранзакцию();
КонецЕсли;

Способ 2. Реструктуризация регистра (отключение проблемного измерения)

Если аналитика по расчетным документам (КредДокумент) на предприятии фактически не ведется, учет запущен годами, а счета-фактуры и книги покупок/продаж по данному регистру формировать не требуется, самым быстрым и радикальным техническим решением является изменение структуры регистра.

Разберем по шагам, как это выполнить:

  1. Обязательно создаем полную резервную копию базы данных средствами СУБД.
  2. Открываем базу в конфигураторе в монопольном режиме.
  3. Находим в ветке метаданных регистр «Покупатели» / «Поставщики» (или «Взаиморасчеты»).
  4. Находим измерение КредДокумент. Если учет по нему не нужен — снимаем у него признак учета либо удаляем данное измерение.
  5. Сохраняем конфигурацию. При реструктуризации платформа 1С 7.7 автоматически пересчитает таблицу итогов: все строки, которые отличались только документом расчетов, будут схлопнуты по оставшимся измерениям (Контрагент, Договор). Все взаимозачетные «нули» самоуничтожатся, и таблица RG уменьшится в десятки раз.

Способ 3. Свертка базы и фиксация начальных остатков

Когда база разрослась до 100 гигабайт, лучшей стратегией является полная или частичная свертка. Проанализируем правильную последовательность действий:

  1. Получаем реальное (признанное руководством и бухгалтерией) сальдо по контрагентам на выбранную дату (например, начало текущего года).
  2. Фиксируем эти остатки отдельным документом ввода остатков по взаиморасчетам.
  3. Очищаем старые движения регистра (таблицы RA) за прошлые закрытые периоды. Если зачистка делается через базу данных SQL, таблицу итогов RG можно усечь (TRUNCATE TABLE), после чего выполнить штатный пересчет итогов в монопольном режиме.
  4. В документах прошлых периодов, которые двигали взаиморасчеты, либо отключаем проведение по данному регистру, либо блокируем их повторное проведение программно (проверяя дату документа или специальный реквизит-флаг свёртки в модуле проведения).

Способ 4. Корректировка периода рассчитанных итогов

Для временного снижения нагрузки и уменьшения объема рассчитываемых данных проверьте границы периода итогов:

  1. Запустите 1С:Предприятие 7.7 в монопольном режиме.
  2. Откройте меню Операции — Управление итогами.
  3. Проанализируйте, на какую дату рассчитаны итоги. Если дата ушла далеко вперед в будущее из-за случайно проведенного будущей датой документа, платформа хранит пустые ежемесячные срезы на все эти месяцы вперед. Установите период расчета итогов на актуальный месяц.

Применение одного из этих подходов (или их комбинации: схлопывание нулевых сальдо с последующей сверткой) позволяет сократить базу объемом 100 Гб до считанных гигабайт и полностью восстановить производительность проведения документов.

← На главную