С прикладной точки зрения, полагаю, понятно что такое итоги, хотелось бы рассмотреть что это значит с точки зрения базы данных в СУБД, понять как и где они хранятся, когда создаются и пересчитываются. Сразу хочу отметить что я буду рассматривать именно итоги регистров накопления, а не регистров бухгалтерии. В принципе, сказанное о регистрах накопления можно перенести и на регистры бухгалтерии, но их структура хранения несколько сложнее.
Немного теории
Не вдаваясь в подробности, скажу что итоговые данные используются при обращении к виртуальным таблицам регистров накопления, а если быть точнее, только в случае если выбираемые данные кратны месяцу, в ином случае будет задействована основная таблица регистра.
Начнем с того что объект метаданных «Регистр накопления» в СУБД представлен совокупностью двух таблиц: основной таблицы, куда пишутся движения, и таблицы итогов, которая содержит помесячные итоговые записи в разрезе набора измерений. В случае с оборотным регистром, итоговую таблицу правильнее называть «Таблицей оборотов», а для остаточного регистра она так и называется «Таблица итогов», тем не менее я буду обе таблицы называть итоговыми.
![Представление архитектуры метаданных вида "Регистр накопления" в СУБД](https://ausevich.ru/wp-content/uploads/2017/09/Architecture.png)
Для регистра вида «Обороты» в итоговой таблице содержатся итоговые записи оборотов за месяц, а для регистров накопления вида «Остатки» итоговая таблица содержит итоги на конец месяца и так называемые «текущие итоги» (итоги на +∞, в 1С:Предприятие за +∞ формально принят конец 3999 года). Еще одним важным условием наличия итоговых записей в остаточных регистрах является установленный период рассчитанных итогов: итоговых записей по периоду больше этой даты в таблице итогов не будет, сделано это для оптимизации проведения документов (ускорения и увеличения параллельности работы).
Полагаю, многим известны приведенные факты, но, на мой взгляд, куда интереснее увидеть это «вживую».
Подготовка базы данных
Создадим новую информационную базу, в которую добавим:
- Перечисление «ПриходРасход» с двумя значениями: «Приход», «Расход»
- Документ «ДокументПриходРасход» с реквизитами: «ПриходРасход» (перечисление «ПриходРасход»), «Измерение1» (строка, длина 10), «Измерение2» (строка, длина 10), «Сумма» (число, длина 15, точность 2)
- Регистр накопления вида «Остатки» с измерениями «Измерение1» и «Измерение2» и ресурсом «Сумма». Их типы аналогичны реквизитам документа «ДокументПриходРасход», который будет регистратором данного регистра
- Регистр накопления вида «Обороты» с измерениями «Измерение1» и «Измерение2» и ресурсом «Сумма». Их типы аналогичны реквизитам документа «ДокументПриходРасход», который будет регистратором данного регистра
Документ должен делать движения в регистры накопления по соответствующим измерениям и ресурсам. Вид движения (для остаточного регистра) и знак суммы (для оборотного регистра) должны соответствовать значению реквизита «ПриходРасход» из документа.
![Метаданные конфигурации](https://ausevich.ru/wp-content/uploads/2017/09/Metadata.png)
Хранение в базе данных
Для того чтобы увидеть структуру хранения наших регистров, воспользуемся обработкой из статьи «Получение информации о структуре хранения базы данных в терминах 1С:Предприятие и СУБД», с ее же помощью мы узнаем имена таблиц базы данных в СУБД.
![Структура хранения регистров накопления в СУБД](https://ausevich.ru/wp-content/uploads/2017/09/Metadata_Database_Names.png)
Далее, в информационной базе проведем несколько документов в разных месяцах, например, так:
![Проведенные документы](https://ausevich.ru/wp-content/uploads/2017/09/Documents_1.png)
А сейчас перейдем в Management Studio и создадим запрос к таблицам итогов остаточного и оборотного регистров (имена таблиц в СУБД, как писал выше, можно узнать из обработки получения информации о структуре хранения). В моем случае, запрос будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 |
-- Регистр остатков SELECT * FROM _AccumRgT284 -- Регистр оборотов SELECT * FROM _AccumRgTn289 |
Как видно из результата запроса, в таблице итогов оборотного регистра содержатся свернутые помесячно, в разрезе всех измерений, данные. А у остаточного регистра присутствуют записи только по периоду «5999-11-01», что, с учетом смещения, означает 01.11.3999, это и есть так называемые «Текущие итоги». Как упоминалось выше, для того чтобы в остаточном регистре появились помесячные записи, необходимо установить период рассчитанных итогов. Именно поэтому в итогах остаточного регистра сейчас отсутствуют помесячные данные.
![Итоги регистров накопления](https://ausevich.ru/wp-content/uploads/2017/09/Totals_1.png)
Установка периода рассчитанных итогов
Установить период рассчитанных итогов можно через встроенную в платформу обработку управления итогами, но мы воспользуемся универсальным способом — методом менеджера регистра УстановитьПериодРассчитанныхИтогов(). Установим период на конец ноября 2016 года, после чего еще раз выполним наш запрос в Management Studio.
![Установка периода рассчитанных итогов](https://ausevich.ru/wp-content/uploads/2017/09/SetTotalsPeriod.png)
![Итоги после установки периода рассчитанных итогов](https://ausevich.ru/wp-content/uploads/2017/09/Totals_2.png)
Как видно из результата запроса, добавились итоговые записи по остаточному регистру с периодами «4016-11-01» и «4016-12-01» это и есть итоги на конец октября и ноября 2016 года, соответственно (судя по периодам, логичнее называть их остатками на начало ноября и декабря). Итоговых записей на начало января (конец декабря) не появилось, т.к. движения за декабрь превышают установленный период рассчитанных итогов. Также хочу обратить особое внимание на то что по набору измерений (1;1) на начало декабря итог нулевой, но такая запись в таблице отсутствует.
Пересчет итоговых записей
Введем еще один документ в октябре 2016 по набору измерений (1;2) и выполним наш запрос в Management Studio
![Проведем еще один документ](https://ausevich.ru/wp-content/uploads/2017/09/Documents_2.png)
Как видно, при проведении итоги автоматически были пересчитаны, но при этом появилось много «нулевых» записей.
![Итоги после проведения документа](https://ausevich.ru/wp-content/uploads/2017/09/Totals_3.png)
Возникает резонный вопрос, зачем же нужна регламентная операция пересчета итогов, если итоги автоматически пересчитываются?
Пересчет итогов можно произвести с помощью метода менеджера регистра ПересчитатьИтоги(), давайте выполним его и посмотрим на результат в Management Studio.
![Метод ПересчитатьИтоги()](https://ausevich.ru/wp-content/uploads/2017/09/RecountTotals.png)
В конечном итоге (если использование итогов не отключалось), данный метод всего лишь убирает «нулевые» строки из итогов остаточных регистров и «нулевые» строки в оборотных регистрах только если в периоде нет движений по данному набору измерений (например, отменили проведение документа). Хотя, если использование итогов было отключено программно на какой-то период времени, тогда данный метод действительно их пересчитает, это вы можете проверить самостоятельно.
![Итоги после пересчета](https://ausevich.ru/wp-content/uploads/2017/09/Totals_4.png)
Замечу, что не смотря на то что ПересчитатьИтоги() всего лишь убирает «нулевые» строки (если использование итогов не отключалось), данная операция может существенно сократить размер базы данных на диске если регистр «тяжелый» и в нем содержится много таких «нулевых» строк.