С прикладной точки зрения, полагаю, понятно что такое итоги, хотелось бы рассмотреть что это значит с точки зрения базы данных в СУБД, понять как и где они хранятся, когда создаются и пересчитываются. Сразу хочу отметить что я буду рассматривать именно итоги регистров накопления, а не регистров бухгалтерии. В принципе, сказанное о регистрах накопления можно перенести и на регистры бухгалтерии, но их структура хранения несколько сложнее.
Немного теории
Не вдаваясь в подробности, скажу что итоговые данные используются при обращении к виртуальным таблицам регистров накопления, а если быть точнее, только в случае если выбираемые данные кратны месяцу, в ином случае будет задействована основная таблица регистра.
Начнем с того что объект метаданных «Регистр накопления» в СУБД представлен совокупностью двух таблиц: основной таблицы, куда пишутся движения, и таблицы итогов, которая содержит помесячные итоговые записи в разрезе набора измерений. В случае с оборотным регистром, итоговую таблицу правильнее называть «Таблицей оборотов», а для остаточного регистра она так и называется «Таблица итогов», тем не менее я буду обе таблицы называть итоговыми.
Для регистра вида «Обороты» в итоговой таблице содержатся итоговые записи оборотов за месяц, а для регистров накопления вида «Остатки» итоговая таблица содержит итоги на конец месяца и так называемые «текущие итоги» (итоги на +∞, в 1С:Предприятие за +∞ формально принят конец 3999 года). Еще одним важным условием наличия итоговых записей в остаточных регистрах является установленный период рассчитанных итогов: итоговых записей по периоду больше этой даты в таблице итогов не будет, сделано это для оптимизации проведения документов (ускорения и увеличения параллельности работы).
Полагаю, многим известны приведенные факты, но, на мой взгляд, куда интереснее увидеть это «вживую».
Подготовка базы данных
Создадим новую информационную базу, в которую добавим:
- Перечисление «ПриходРасход» с двумя значениями: «Приход», «Расход»
- Документ «ДокументПриходРасход» с реквизитами: «ПриходРасход» (перечисление «ПриходРасход»), «Измерение1» (строка, длина 10), «Измерение2» (строка, длина 10), «Сумма» (число, длина 15, точность 2)
- Регистр накопления вида «Остатки» с измерениями «Измерение1» и «Измерение2» и ресурсом «Сумма». Их типы аналогичны реквизитам документа «ДокументПриходРасход», который будет регистратором данного регистра
- Регистр накопления вида «Обороты» с измерениями «Измерение1» и «Измерение2» и ресурсом «Сумма». Их типы аналогичны реквизитам документа «ДокументПриходРасход», который будет регистратором данного регистра
Документ должен делать движения в регистры накопления по соответствующим измерениям и ресурсам. Вид движения (для остаточного регистра) и знак суммы (для оборотного регистра) должны соответствовать значению реквизита «ПриходРасход» из документа.
Хранение в базе данных
Для того чтобы увидеть структуру хранения наших регистров, воспользуемся обработкой из статьи «Получение информации о структуре хранения базы данных в терминах 1С:Предприятие и СУБД», с ее же помощью мы узнаем имена таблиц базы данных в СУБД.
Далее, в информационной базе проведем несколько документов в разных месяцах, например, так:
А сейчас перейдем в 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, это и есть так называемые «Текущие итоги». Как упоминалось выше, для того чтобы в остаточном регистре появились помесячные записи, необходимо установить период рассчитанных итогов. Именно поэтому в итогах остаточного регистра сейчас отсутствуют помесячные данные.
Установка периода рассчитанных итогов
Установить период рассчитанных итогов можно через встроенную в платформу обработку управления итогами, но мы воспользуемся универсальным способом — методом менеджера регистра УстановитьПериодРассчитанныхИтогов(). Установим период на конец ноября 2016 года, после чего еще раз выполним наш запрос в Management Studio.
Как видно из результата запроса, добавились итоговые записи по остаточному регистру с периодами «4016-11-01» и «4016-12-01» это и есть итоги на конец октября и ноября 2016 года, соответственно (судя по периодам, логичнее называть их остатками на начало ноября и декабря). Итоговых записей на начало января (конец декабря) не появилось, т.к. движения за декабрь превышают установленный период рассчитанных итогов. Также хочу обратить особое внимание на то что по набору измерений (1;1) на начало декабря итог нулевой, но такая запись в таблице отсутствует.
Пересчет итоговых записей
Введем еще один документ в октябре 2016 по набору измерений (1;2) и выполним наш запрос в Management Studio
Как видно, при проведении итоги автоматически были пересчитаны, но при этом появилось много «нулевых» записей.
Возникает резонный вопрос, зачем же нужна регламентная операция пересчета итогов, если итоги автоматически пересчитываются?
Пересчет итогов можно произвести с помощью метода менеджера регистра ПересчитатьИтоги(), давайте выполним его и посмотрим на результат в Management Studio.
В конечном итоге (если использование итогов не отключалось), данный метод всего лишь убирает «нулевые» строки из итогов остаточных регистров и «нулевые» строки в оборотных регистрах только если в периоде нет движений по данному набору измерений (например, отменили проведение документа). Хотя, если использование итогов было отключено программно на какой-то период времени, тогда данный метод действительно их пересчитает, это вы можете проверить самостоятельно.
Замечу, что не смотря на то что ПересчитатьИтоги() всего лишь убирает «нулевые» строки (если использование итогов не отключалось), данная операция может существенно сократить размер базы данных на диске если регистр «тяжелый» и в нем содержится много таких «нулевых» строк.