В платформе 1С по умолчанию для регистров накопления остатков применяется механизм автоматического расчета и хранения помесячных итогов. Это позволяет быстро получать остатки на любую дату в прошлом, однако приводит к значительному разрастанию физических таблиц СУБД. В высоконагруженных системах (например, в оперативных front-системах или биллинге), где отчетность за прошлые периоды не строится, хранение промежуточных итогов создаёт избыточную нагрузку при записи и проведении документов.
Рассмотрим, как правильно настроить регистр накопления, чтобы платформа хранила только текущие (актуальные) итоги, и проанализируем важные особенности работы механизмов итогов.
Распространенное заблуждение — попытка полностью выключить режим итогов для регистра через методы конфигурации или программный код. Проанализируем, к чему это приводит на практике.
Если для регистра накопления полностью выключить использование итогов с помощью вызова метода УстановитьИспользованиеИтогов(Ложь), платформа прекращает обслуживание таблиц итогов. Однако при попытке выполнения запроса к виртуальным таблицам (например, к таблице Остатки) система сгенерирует критическую ошибку:
Ошибка обработки представления "РегистрНакопления.ИмяРегистра.Остатки: Использование итогов выключено"
Разберем назначение базовых флагов управления итогами:
ИспользованиеИтогов): определяет, служат ли таблицы итогов источником данных для виртуальных таблиц. Если он отключен, виртуальные таблицы остатков и оборотов становятся полностью недоступны в запросах.ИспользованиеТекущихИтогов): управляет формированием среза данных на текущую дату (специальная отметка в базе). Если выключить этот флаг, актуальный остаток на «сейчас» будет вычисляться путем наложения движений на последнюю рассчитанную точку помесячных итогов.Чтобы платформа перестала расчитывать и хранить таблицы помесячных итогов, но при этом сохранила работоспособность виртуальных таблиц остатков, необходимо сместить границу рассчитанных итогов в самое начало времен.
Разберем по шагам, как это реализовано в платформе 1С:
УстановитьИспользованиеИтогов(Истина)).УстановитьИспользованиеТекущихИтогов(Истина)).0001-01-01 (или на дату, заведомо предшествующую первой записи в регистре).В результате такой настройки платформа перестает создавать ежемесячные записи в таблице итогов. В базе данных хранится только таблица движений и таблица актуальных (текущих) итогов. Вся история за прошлые периоды при необходимости будет рассчитываться динамически «на лету» по таблице движений от нулевой точки.
Выясним, как программно проверить текущие настройки расчета итогов для конкретного регистра накопления. Используем следующий фрагмент кода:
ЗначениеСвойства = РегистрыНакопления.ТоварыНаСкладах.ПолучитьПериодРассчитанныхИтогов();
Сообщить("ПериодРассчитанныхИтогов: " + ЗначениеСвойства);
ЗначениеСвойства = РегистрыНакопления.ТоварыНаСкладах.ПолучитьИспользованиеИтогов();
Сообщить("ИспользованиеИтогов: " + ЗначениеСвойства);
ЗначениеСвойства = РегистрыНакопления.ТоварыНаСкладах.ПолучитьИспользованиеТекущихИтогов();
Сообщить("ИспользованиеТекущихИтогов: " + ЗначениеСвойства);
В платформе 1С v8.3 также доступны методы ПолучитьМаксимальныйПериодРассчитанныхИтогов() и ПолучитьМинимальныйПериодРассчитанныхИтогов(), позволяющие точно контролировать диапазон рассчитанных интервалов.
Для корректной работы режима «только актуальные остатки» значения методов должны быть следующими:
ПолучитьИспользованиеИтогов() — Истина.ПолучитьИспользованиеТекущихИтогов() — Истина.ПолучитьМаксимальныйПериодРассчитанныхИтогов() — 0001-01-01.Рассмотренный метод оптимизации идеально подходит для узкоспециализированных OLTP-систем (экспресс-продажи, биллинг, учет остатков в реальном времени), но имеет свои особенности, которые обязательно нужно учитывать при проектировании архитектуры.
Плюсы решения:
Ограничения и риски: