Как хранить только актуальные остатки в регистре накопления 1С и отключить промежуточные итоги?

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

В платформе 1С по умолчанию для регистров накопления остатков применяется механизм автоматического расчета и хранения помесячных итогов. Это позволяет быстро получать остатки на любую дату в прошлом, однако приводит к значительному разрастанию физических таблиц СУБД. В высоконагруженных системах (например, в оперативных front-системах или биллинге), где отчетность за прошлые периоды не строится, хранение промежуточных итогов создаёт избыточную нагрузку при записи и проведении документов.

Рассмотрим, как правильно настроить регистр накопления, чтобы платформа хранила только текущие (актуальные) итоги, и проанализируем важные особенности работы механизмов итогов.

Почему нельзя просто отключить флаг "Использование итогов"?

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

Если для регистра накопления полностью выключить использование итогов с помощью вызова метода УстановитьИспользованиеИтогов(Ложь), платформа прекращает обслуживание таблиц итогов. Однако при попытке выполнения запроса к виртуальным таблицам (например, к таблице Остатки) система сгенерирует критическую ошибку:

Ошибка обработки представления "РегистрНакопления.ИмяРегистра.Остатки: Использование итогов выключено"

Разберем назначение базовых флагов управления итогами:

  1. Флаг "Использование итогов" (ИспользованиеИтогов): определяет, служат ли таблицы итогов источником данных для виртуальных таблиц. Если он отключен, виртуальные таблицы остатков и оборотов становятся полностью недоступны в запросах.
  2. Флаг "Текущие итоги" (ИспользованиеТекущихИтогов): управляет формированием среза данных на текущую дату (специальная отметка в базе). Если выключить этот флаг, актуальный остаток на «сейчас» будет вычисляться путем наложения движений на последнюю рассчитанную точку помесячных итогов.

Алгоритм отключения помесячных итогов и перехода на актуальные остатки

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

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

  1. Оставляем включенным использование итогов (УстановитьИспользованиеИтогов(Истина)).
  2. Оставляем включенным использование текущих итогов (УстановитьИспользованиеТекущихИтогов(Истина)).
  3. Устанавливаем период рассчитанных итогов на дату 0001-01-01 (или на дату, заведомо предшествующую первой записи в регистре).
  4. Выполняем пересчет итогов регистра накопления.

В результате такой настройки платформа перестает создавать ежемесячные записи в таблице итогов. В базе данных хранится только таблица движений и таблица актуальных (текущих) итогов. Вся история за прошлые периоды при необходимости будет рассчитываться динамически «на лету» по таблице движений от нулевой точки.

Проверка состояния итогов через встроенный язык

Выясним, как программно проверить текущие настройки расчета итогов для конкретного регистра накопления. Используем следующий фрагмент кода:


ЗначениеСвойства = РегистрыНакопления.ТоварыНаСкладах.ПолучитьПериодРассчитанныхИтогов();
Сообщить("ПериодРассчитанныхИтогов: " + ЗначениеСвойства);

ЗначениеСвойства = РегистрыНакопления.ТоварыНаСкладах.ПолучитьИспользованиеИтогов();
Сообщить("ИспользованиеИтогов: " + ЗначениеСвойства);

ЗначениеСвойства = РегистрыНакопления.ТоварыНаСкладах.ПолучитьИспользованиеТекущихИтогов();
Сообщить("ИспользованиеТекущихИтогов: " + ЗначениеСвойства);

В платформе 1С v8.3 также доступны методы ПолучитьМаксимальныйПериодРассчитанныхИтогов() и ПолучитьМинимальныйПериодРассчитанныхИтогов(), позволяющие точно контролировать диапазон рассчитанных интервалов.

Для корректной работы режима «только актуальные остатки» значения методов должны быть следующими:

  1. ПолучитьИспользованиеИтогов() — Истина.
  2. ПолучитьИспользованиеТекущихИтогов() — Истина.
  3. ПолучитьМаксимальныйПериодРассчитанныхИтогов() — 0001-01-01.

Преимущества и ограничения данного подхода

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

Плюсы решения:

  1. Ускорение операции записи документов и неоперативного проведения, так как СУБД не нужно пересчитывать цепочку последующих помесячных итогов при вводе задним числом.
  2. Существенное уменьшение объема базы данных за счет отсутствия миллионов строк с помесячной агрегацией.
  3. Максимальная скорость получения остатков на текущую дату (без вызова даты среза).

Ограничения и риски:

  1. Замедление формирования исторических отчетов: запрос остатков на дату двухлетней давности потребует полного сканирования таблицы движений от начала времен до указанной даты.
  2. Влияние типовых регламентных заданий: в стандартных конфигурациях (на базе БСП) присутствует регламентная процедура управления итоговыми таблицами. При автоматическом запуске она может восстановить расчет помесячных итогов на конец прошлого месяца, если не отключить соответствующее задание.
← На главную