Агрегаты регистра накопления: когда они ускоряют отчёты, а когда мешают
Содержание
Агрегаты в 1С — это заранее посчитанные обороты регистра накопления по части его измерений и с выбранной периодичностью. Работают они только у регистров с видом Обороты: у регистра остатков агрегатов нет, там ускорение даёт механизм итогов. Включают агрегаты в два этапа: разработчик описывает их в Конфигураторе, а администратор переводит регистр в режим агрегатов и строит их в пользовательском режиме.
Частое заблуждение — путать агрегаты с агрегатными функциями запроса (СУММА, КОЛИЧЕСТВО, МАКСИМУМ). Это разные вещи. Функции считают «на лету» при каждом запросе. Агрегаты — это отдельные таблицы в базе данных, которые платформа держит наготове и подставляет в запрос сама, без правки кода отчётов.
Что такое агрегаты и какую задачу они решают
Представьте оборотный регистр «Продажи» с измерениями Номенклатура, Контрагент, Склад, Менеджер, Подразделение. За пять лет в нём накопилось 20 млн записей. Руководитель открывает отчёт «Продажи по менеджерам за год». Без агрегатов СУБД перебирает все записи за год и сворачивает их по менеджеру.
Агрегат «Менеджер × Месяц» хранит уже свёрнутые суммы. При 40 менеджерах за пять лет это 40 × 60 = 2 400 строк. Отчёт за год читает 480 из них вместо нескольких миллионов. Разница в скорости — на порядки.
Что важно про механизм:
- 📌 Агрегат содержит только измерения и ресурсы. Реквизитов регистра в нём нет.
- 📌 Платформа сама решает, каким агрегатом ответить на запрос. Код отчёта не меняется.
- 📌 Агрегаты используются только при обращении к виртуальной таблице
Обороты. - 📌 На правильность результата агрегаты не влияют: если подходящего агрегата нет, данные считаются по движениям, как обычно.
Итоги, агрегаты и виртуальные таблицы: чем отличаются
Здесь путаются чаще всего, поэтому сведём всё в одну таблицу.
| Механизм | Где работает | Что хранит | Чем ускоряет |
|---|---|---|---|
| Таблица движений | Все регистры | Каждую запись регистратора | Ничем, это исходные данные |
| Итоги | Регистры остатков и оборотные регистры | Итоги по всем измерениям помесячно | Быстрые остатки и обороты по полному набору измерений |
| Агрегаты | Только оборотные регистры | Обороты по выбранным измерениям и периодичности | Быстрые отчёты по части измерений и укрупнённым периодам |
Виртуальная таблица Обороты | Запросы к регистру | Ничего не хранит | Это способ обращения: платформа строит её из итогов или агрегатов |
Ключевая деталь: оборотный регистр работает либо в режиме итогов, либо в режиме агрегатов. Одновременно оба механизма не используются. Переключив регистр на агрегаты, вы отказываетесь от его таблицы итогов.
Отсюда простое правило выбора. Если отчёты почти всегда группируют обороты по всем измерениям сразу, итогов достаточно. Если отчёты смотрят на регистр «срезами» — по одному-двум измерениям за месяц, квартал или год, — выигрыш дадут агрегаты.
Как настроить агрегаты для оборотного регистра накопления
Настройка состоит из двух частей: описание агрегатов в конфигурации и включение их в работающей базе.
Шаг 1. Описать агрегаты в Конфигураторе
- Откройте конфигурацию и найдите нужный регистр в ветке
Регистры накопления. Проверьте, что в свойствах у него стоит вид регистраОбороты. - Откройте редактор агрегатов: команда «Агрегаты» есть в окне редактирования регистра и в контекстном меню регистра в дереве метаданных.
- Добавьте агрегат и отметьте измерения, которые в него войдут.
- Задайте периодичность:
День,Месяц,Квартал,Полугодие,Год,Нет(без разбивки по периодам) илиАвто. - Укажите использование:
Авто— платформа сама решит, строить ли агрегат при перестроении;Всегда— агрегат строится обязательно. - При необходимости ограничьте агрегат началом и концом периода. Это удобно, если старые годы в отчётах не смотрят.
- Сохраните конфигурацию и выполните
Конфигурация → Обновить конфигурацию базы данных.
Если конфигурация типовая и на поддержке, правка агрегатов меняет объект поставщика. Это усложнит следующие обновления. Взвесьте выигрыш заранее.
Шаг 2. Включить режим агрегатов в базе
Включение делают кодом или через обработку управления итогами (о ней ниже). Последовательность в коде такая:
Регистр = РегистрыНакопления.Продажи;
// 1. Перевести регистр из режима итогов в режим агрегатов
Регистр.УстановитьРежимАгрегатов(Истина);
// 2. Построить агрегаты по текущим данным
Регистр.ПерестроитьАгрегаты();
// 3. Разрешить запросам пользоваться агрегатами
Регистр.УстановитьИспользованиеАгрегатов(Истина);
Порядок важен. Режим и использование — два разных флага. Режим говорит, что регистр хранит агрегаты вместо итогов. Использование разрешает подставлять их в запросы. Пока использование выключено, обороты считаются по движениям, и отчёты могут стать медленнее, чем были на итогах.
Первое перестроение агрегатов на большом регистре нагружает сервер СУБД — запускайте его в нерабочее время. Сеансы пользователей оно не обрывает, но их отчёты и проведение в это время будут работать медленнее.
Шаг 3. Подобрать оптимальный набор
Угадать нужные агрегаты вручную трудно. У менеджера регистра есть метод ПолучитьОптимальныеАгрегаты(): платформа анализирует регистр и предлагает набор агрегатов с учётом ограничения по их размеру. Результат сохраняют в файл и загружают в редактор агрегатов Конфигуратора, после чего снова обновляют конфигурацию базы данных.
Перед загрузкой просмотрите предложенный список глазами. Сверьте его с отчётами, которые реально тормозят: если самый тяжёлый отчёт группирует по складу и месяцу, а такого агрегата в наборе нет, добавьте его вручную с использованием Всегда. Агрегаты с пятью-шестью измерениями из набора лучше убрать — они почти не сворачивают данные.
💡 Подбирайте агрегаты на рабочей базе с реальными данными, а не на пустой копии. На пустом регистре расчёт ничего полезного не покажет.
Почему агрегаты тормозят систему: типичные промахи
Агрегаты ускоряют чтение, но обслуживание у них не бесплатное. Вот ситуации, когда эффект обратный.
- 🐢 Слишком много агрегатов. Каждый агрегат — отдельная таблица. При обновлении платформа пересчитывает их все. Двадцать агрегатов «на всякий случай» превращают ночное обновление в многочасовое.
- 🐢 Периодичность
Деньза весь период. Агрегат «Номенклатура × Контрагент × День» за пять лет может оказаться почти таким же большим, как сама таблица движений. Пользы от него нет. - 🐢 Агрегаты не обновляются. Свежие движения в агрегат не попадают, пока не выполнено обновление. Данные в отчётах остаются верными, но для новых периодов платформа читает движения, и выигрыш тает.
- 🐢 Режим включён, использование нет. Регистр уже не ведёт итоги, а агрегатами запросы не пользуются. Отчёты считают всё по движениям — это самый медленный вариант.
- 🐢 Отчёты не попадают в агрегаты. Отбор по реквизиту регистра, группировка по регистратору или по записи, обращение к физической таблице вместо виртуальной
Обороты— во всех этих случаях агрегат не применяется. - 🐢 Агрегат шире, чем нужно. Если в агрегате пять измерений из шести, он почти не сворачивает данные. Хороший агрегат содержит одно-три измерения.
Если после включения агрегатов отчёты стали медленнее, первым делом проверьте флаг использования. Вторым — давно ли обновлялись агрегаты.
Обновление и перестроение по расписанию
У агрегатов две операции обслуживания, и путать их не стоит.
| Операция | Метод | Что делает | Как часто |
|---|---|---|---|
| Обновление | ОбновитьАгрегаты() | Дописывает в агрегаты движения, появившиеся после прошлого обновления | Каждую ночь или несколько раз в день |
| Перестроение | ПерестроитьАгрегаты() | Пересчитывает агрегаты с нуля и заново решает, какие из агрегатов с использованием Авто строить | Раз в неделю или раз в месяц |
| Очистка | ОчиститьАгрегаты() | Удаляет данные агрегатов | При диагностике или перед отключением |
Обновление лёгкое, его можно запускать часто. Перестроение тяжёлое: ставьте его на выходные или ночь, когда никто не проводит документы задним числом.
Готовые регламентные задания
В конфигурациях на Библиотеке стандартных подсистем (Бухгалтерия 3.0, ЗУП 3.1, УТ 11, ERP) есть подсистема управления итогами и агрегатами. Она добавляет регламентные задания «Обновление агрегатов» и «Перестроение агрегатов».
Найти их можно так:
- Откройте
Администрирование → Обслуживание. - Перейдите в регламентные операции и откройте список регламентных и фоновых заданий.
- Найдите задания по слову «агрегат» и проверьте, что они включены и у них задано расписание.
В клиент-серверной базе задания выполняет сервер 1С. В файловой базе их запускает один из клиентских сеансов, поэтому без открытой программы обновление не пройдёт — для файловых баз удобнее делать его вручную или отдельным запуском по расписанию Windows.
Своё задание, если в конфигурации его нет
В самописной конфигурации создайте регламентное задание и общий модуль с процедурой:
Процедура ОбновитьАгрегатыРегистров() Экспорт
Для Каждого Регистр Из РегистрыНакопления Цикл
Если Регистр.ПолучитьРежимАгрегатов()
И Регистр.ПолучитьИспользованиеАгрегатов() Тогда
Регистр.ОбновитьАгрегаты();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура обходит все регистры накопления и обновляет только те, что работают в режиме агрегатов. Регистры остатков в этот режим перевести нельзя, поэтому проверка режима их отсеет. Перестроение делается так же, только с методом ПерестроитьАгрегаты() и в отдельном задании с редким расписанием.
Где агрегаты дают максимальный эффект
Лучшие кандидаты — оборотные регистры, которые растут годами и читаются сводными отчётами.
- 📊 Продажи и выручка. Отчёты «по менеджерам за квартал», «по группам товаров за год», «динамика по месяцам». Агрегаты «Менеджер × Месяц» и «Номенклатура × Месяц» закрывают большую часть таких запросов.
- 📊 Закупки. Сводки по поставщикам и складам за период. Хватает агрегата «Контрагент × Склад × Месяц».
- 📊 Аналитика для руководителя. Панели показателей, которые обновляются при каждом открытии и смотрят на год-два назад.
- 📊 Выгрузки в BI-системы. Сводные данные за большой период, которые забирают по расписанию.
Где пользы почти не будет:
- ❌ регистры с небольшим числом записей;
- ❌ отчёты с детализацией до документа или дня;
- ❌ регистры, которые читают в основном при проведении, а не в отчётах.
Мини-кейс. Регистр продаж на 30 млн записей, отчёт «Продажи по подразделениям за год» строился около 40 секунд. Добавили агрегат «Подразделение × Месяц» и ночное обновление. Отчёт стал читать несколько сотен строк агрегата вместо миллионов движений. Сам регистр, проведение документов и другие отчёты при этом не изменились. Цифры условные, но порядок выигрыша на таких регистрах именно такой.
Как проверить, работают ли агрегаты в базе
Проверка идёт от простого к сложному.
- Режим и использование. Выполните в консоли кода или обработке:
Регистр = РегистрыНакопления.Продажи;
Сообщить("Режим агрегатов: " + Регистр.ПолучитьРежимАгрегатов());
Сообщить("Использование: " + Регистр.ПолучитьИспользованиеАгрегатов());
Оба значения должны быть Да. Если режим Да, а использование Нет — это та самая медленная комбинация из раздела выше.
Стандартная обработка. В пользовательском режиме откройте
Все функции → Стандартные → Управление итогами. Если пункта «Все функции» нет в главном меню, включите его в параметрах программы. В обработке видно, в каком режиме каждый регистр, и доступны команды обновления, перестроения и подбора оптимальных агрегатов.Таблицы в СУБД. Функция
ПолучитьСтруктуруХраненияБазыДанных()возвращает соответствие объектов метаданных и таблиц базы. У регистра в режиме агрегатов появляются служебные таблицы агрегатов. Если их нет — агрегаты не построены.Замер отчёта. Засеките время отчёта до и после. Для точного разбора включите замер производительности или технологический журнал: по тексту запроса к СУБД видно, к какой таблице обратилась платформа — к движениям или к агрегату.
Частые вопросы об агрегатах
Можно ли включить агрегаты для регистра остатков?
Будут ли отчёты показывать неверные цифры, если агрегаты давно не обновлялись?
Есть ли агрегаты у регистров бухгалтерии и сведений?
Как вернуть регистр в режим итогов?
УстановитьРежимАгрегатов(Ложь) и пересчитайте итоги регистра. Делайте это в нерабочее время: пересчёт итогов на большом регистре идёт долго.Нужно ли менять запросы в отчётах после включения агрегатов?
Обороты. Платформа подставляет подходящий агрегат сама. Переписывать имеет смысл только запросы к физической таблице движений.