Share:

Почему Вы не обслуживаете итоги?

YPermitinвSQL Server

2019-07-04

#SQL Server

#1С:Предприятие

#обслуживание

#итоги

И снова об итогах

Вы сотрудник франчайзи “1С”? Может быть, Вы даже обновляете клиентов и следите за работоспособностью их информационных баз? Или Вы работаете в штате компании и работоспособность систем на базе платформы “1С” лежит на Ваших плечах? Если ответа “ДА” хотя бы на один вопрос, то эта статья для Вас!

Сегодня мы рассмотрим, с одной стороны, очень простой вопрос обслуживания итогов в регистрах. Но с другой стороны - вопрос простой, но настраивать подобающее обслуживание итогов часто никто не торопится.

Не могу точно сказать для кого эта статья - для новичков или опытных программистов. Или администраторов? Думаю, что решать только Вам!

Как они работают

Платформа “1С” использует механизм итогов для оптимизации получения данных в запросах за большой период. Механизм итогов доступен в регистрах накопления, бухгалтерии и сведений. Именно благодаря ему мы можем формировать отчеты достаточно быстро за большой период времени. Не всегда, конечно, но это уже другая история :).

Но, прежде чем говорить об обслуживании итогов, давайте поверхностно рассмотрим их работу для каждого вида регистра. Мы не будем погружаться в особенности их работы на стороне СУБД, аспекты блокировок и другие связанные темы. Только принцип работы, только суть!

Регистры сведений

Начнем с простого - итогов регистров сведений. С некоторого момента, платформа поддерживает итоги среза первых / последних записей. Например, в последних типовых конфигурациях для регистра “Курсы валют” включены итоги среза последних. Под спойлером Вы найдете пример как данные в регистре отражаются на итогах этого регистра.

Вот такие данные содержатся в самом регистре.

Дата курсаВалютаКурсКратность
12.06.2019USD64,5161
12.06.2019EUR73,0451
13.06.2019USD64,5161
13.06.2019EUR73,0451
14.06.2019USD64,6311
14.06.2019EUR73,0141
15.06.2019USD64,4331
15.06.2019EUR72,6991

И вот такие данные будет содержать таблица итогов.

Дата курсаВалютаКурсКратность
15.06.2019USD64,4331
15.06.2019EUR72,6991

Все просто - в итогах хранятся последние записи по периоду в разрезе измерений. Для регистра сведений “Курсы валют” это “Валюта”.

Все логично - срез последних записей хранит последние по периоду записи в разрезе измерений регистра. При этом в итогах хранятся данные как измерений, так и ресурсов, и реквизитов.

По такому же принципу работают итоги среза первых, только хранят они, внезапно, срез первых записей.

Регистры накопления

Итоги регистров накопления уже интересней, чем у регистров сведений. О внутренних механизмах платформы и принципа работы с итогами Вы можете узнать на сайте ИТС. А сейчас рассмотрим лишь основное. Во-первых, регистры накопления бывают двух видов: оборотов и остатков. От вида регистра также зависит принцип построения и использования итогов.

Регистр оборотов

Для примера возьмем регистр накопления “Реализация услуг” из типовой конфигурации “Бухгалтерия предприятия 3.0”. Под спойлером пример данных в регистре и полученные итоги.

Это пример данных.

ПериодРегистраторОрганизацияСчет расходовНоменклатурная группаПодразделениеСумма
14.03.2019 00:00:00Оказание услуг 1 от 14.03.2019 00:00:00ООО “Копыта и Рога”90.02.1Всякая всячинаМосква2000
29.03.2019 00:00:00Оказание услуг 2 от 29.03.2019 00:00:00ООО “Копыта и Рога”90.02.1Всякая всячинаМосква1000
17.04.2019 00:00:00Оказание услуг 3 от 17.04.2019 00:00:00ООО “Копыта и Рога”90.02.1Всякая всячинаМосква500
19.04.2019 00:00:00Оказание услуг 4 от 19.04.2019 00:00:00ООО “Копыта и Рога”90.02.1Всякая всячинаМосква600
30.04.2019 00:00:00Оказание услуг 5 от 30.04.2019 00:00:00ООО “Копыта и Рога”90.02.1Всякая всячинаМосква5000
31.05.2019 00:00:00Оказание услуг 6 от 31.05.2019 00:00:00ООО “Копыта и Рога”90.02.1Всякая всячинаМосква1000

Движения регистра сформированы в период с марта по май 2019 года. Итоги в этом случае содержат сгруппированные данные по измерениям.

ПериодОрганизацияСчет расходовНоменклатурная группаПодразделениеСумма
01.03.2019 00:00:00ООО “Копыта и Рога”90.02.1Всякая всячинаМосква3000
01.04.2019 00:00:00ООО “Копыта и Рога”90.02.1Всякая всячинаМосква1100
01.05.2019 00:00:00ООО “Копыта и Рога”90.02.1Всякая всячинаМосква6000

Итоги содержат сгруппированные данные по месяцам, а период записи - начало месяца.

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

Регистр остатков

В качестве примера остаточного регистра возьмем “НДС предъявленный”. Пример снова под спойлером.

Вот пример данных регистра “НДС предъявленный”. Некоторые поля убраны (пустые, служебные, реквизиты регистра). Правильность данных с прикладной точки зрения не гарантируется :).

Вид операцииПериодРегистраторОрганизацияСчет-фактураСтавка НДСПоставщикСумма без НДСНДС
Приход10.04.2019 00:00:00Поступление (акт, накладная) 1 от 10.04.2019 00:00:00ООО “Копыта и Рога”Поступление (акт, накладная) 1 от 10.04.2019 00:00:0020%ООО “Все есть”3000600
Приход15.05.2019 00:00:00Поступление (акт, накладная) 2 от 15.05.2019 00:00:00ООО “Копыта и Рога”Поступление (акт, накладная) 2 от 15.05.2019 00:00:0010%ООО “Все есть”50001000
Расход20.06.2019 00:00:00Счет-фактура полученный 1 от 20.06.2019 00:00:00ООО “Копыта и Рога”Поступление (акт, накладная) 1 от 10.04.2019 00:00:0020%ООО “Все есть”3000600
Расход23.06.2019 00:00:00Счет-фактура полученный 2 от 20.06.2019 00:00:00ООО “Копыта и Рога”Поступление (акт, накладная) 2 от 15.05.2019 00:00:0010%ООО “Все есть”2500500

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

ПериодОрганизацияСчет-фактураСтавка НДСПоставщикСумма без НДСНДС
01.05.2019 00:00:00ООО “Копыта и Рога”Поступление (акт, накладная) 1 от 10.04.2019 00:00:0020%ООО “Все есть”3000600
01.06.2019 00:00:00ООО “Копыта и Рога”Поступление (акт, накладная) 1 от 10.04.2019 00:00:0020%ООО “Все есть”3000600
01.06.2019 00:00:00ООО “Копыта и Рога”Поступление (акт, накладная) 2 от 15.05.2019 00:00:0010%ООО “Все есть”50001000
01.07.2019 00:00:00ООО “Копыта и Рога”Поступление (акт, накладная) 2 от 15.05.2019 00:00:0010%ООО “Все есть”2500500

В этом случае, на самом деле, тоже все просто:

  • На начало мая имеем остаток от операции прихода в апреле.
  • На начало июня сохраняется остаток с апрельской операции, а также добавляется строка с остатком от операции в мае. Именно поэтому в июньских остатках две записи.
  • В июне был сделан расход, которых закрыл остаток по первой операции, а также расход с частичным закрытием второй операции. Поэтому в итогах добавлена запись по оставшейся сумме.

Кроме того, есть текущие итоги, которые сохраняют информацию об остатках на самую последнюю дату. В таблице итогов они хранятся с датой “01.11.3999” и позволяют получить информацию об остатках на самый последний момент времени, который может быть зафиксирован в регистре.

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

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

Регистры бухгалтерии

Не менее интересным объектом с поддержкой хранения итогов является регистр бухгалтерии. Это настоящий рекордсмен по количеству таблиц с итогами. Возьмем для рассмотрения типовой регистр “Хозрасчетный” в той же “Бухгалтерии предприятия 3.0”. Всего в регистре можно насчитать 5 таблиц с итогами:

Итоги между счетами - для хранения итогов оборотов между корреспондирующими счетами

  • Итоги по счетам - для хранения итогов по счету в целом
  • Итоги по счетам с субконто 1 - итоги по счетам с 1 субконто
  • Итоги по счетам с субконто 2 - итоги по счетам с 2 субконто
  • Итоги по счетам с субконто 3 - итоги по счетам с 3 субконто

Чтобы не углубляться сейчас во внутренние механизмы регистра, отметим лишь, что в таблице итогов между счетами хранятся итоги только по оборотам. В остальных таблицах итогов хранятся итоги и по оборотам, и по остаткам. Также регистр бухгалтерии поддерживает текущие итоги, которые работают практически также, как и в регистре накопления.

Теперь Вы знаете на сколько большим по размеру и тяжелым по использованию может быть регистр бухгалтерии. Ведь при формировании проводок платформе требуется поддерживать большое количество таблиц с итогами. А представьте что бы было, если план счетов поддерживал не три, а пять субконто!

Что же с обслуживанием

И так, мы быстрым шагом прошлись по механизму хранения итогов платформы, рассмотрели какие итоги бывают и у каких объектов. Что же здесь может такое случиться, что потребует обслуживания?

Самым “самообслуживаемым” объектом в части итогов является регистр сведений. Включили итоги по срезу последних и забыли. Ничего настраивать и обслуживать не нужно.

С регистром накопления и бухгалтерии дело обстоит иначе. Для остаточных регистров накопления и любого регистра бухгалтерии обязательно в начале каждого месяца необходимо устанавливать период рассчитанных итогов. Если этого не сделать, то итоги по остаткам просто не будут рассчитаны. Соответственно, и использоваться они не будут.

Во всех типовых конфигурациях имеется регламентное задание “Установка периода рассчитанных итогов” с расписанием на запуск каждое 5 число месяца в 01:00. Вот алгоритм обновления периода рассчитанных итогов.

Эта функция получена из модулей “Библиотеки стандартных подсистем” и находится в общем модуле “УправлениеИтогамиИАгрегатамиСлужебный”.

// Рассчитывает итоги всех регистров бухгалтерии и накопления, у которых они включены.
Процедура РассчитатьИтоги() Экспорт
ДатаСеанса = ТекущаяДатаСеанса();
РегистрНакопленияПериод = КонецМесяца(ДобавитьМесяц(ДатаСеанса, -1)); // Конец прошлого месяца.
РегистрБухгалтерииПериод = КонецМесяца(ДатаСеанса); // Конец текущего месяца.
Кэш = КэшПроверкиРазделения();
// Расчет итогов для регистров накопления.
ВидОстатки = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки;
Для Каждого РегистрМетаданные Из Метаданные.РегистрыНакопления Цикл
Если РегистрМетаданные.ВидРегистра <> ВидОстатки Тогда
Продолжить;
КонецЕсли;
Если Не ОбъектМетаданныхДоступенПоРазделению(Кэш, РегистрМетаданные) Тогда
Продолжить;
КонецЕсли;
РегистрНакопленияМенеджер = РегистрыНакопления[РегистрМетаданные.Имя];
Если РегистрНакопленияМенеджер.ПолучитьМаксимальныйПериодРассчитанныхИтогов() >= РегистрНакопленияПериод Тогда
Продолжить;
КонецЕсли;
РегистрНакопленияМенеджер.УстановитьМаксимальныйПериодРассчитанныхИтогов(РегистрНакопленияПериод);
Если Не РегистрНакопленияМенеджер.ПолучитьИспользованиеИтогов()
Или Не РегистрНакопленияМенеджер.ПолучитьИспользованиеТекущихИтогов() Тогда
Продолжить;
КонецЕсли;
РегистрНакопленияМенеджер.ПересчитатьТекущиеИтоги();
КонецЦикла;
// Расчет итогов для регистров бухгалтерии.
Для Каждого РегистрМетаданные Из Метаданные.РегистрыБухгалтерии Цикл
Если Не ОбъектМетаданныхДоступенПоРазделению(Кэш, РегистрМетаданные) Тогда
Продолжить;
КонецЕсли;
РегистрБухгалтерииМенеджер = РегистрыБухгалтерии[РегистрМетаданные.Имя];
Если РегистрБухгалтерииМенеджер.ПолучитьМаксимальныйПериодРассчитанныхИтогов() >= РегистрБухгалтерииПериод Тогда
Продолжить;
КонецЕсли;
РегистрБухгалтерииМенеджер.УстановитьМаксимальныйПериодРассчитанныхИтогов(РегистрБухгалтерииПериод);
Если Не РегистрБухгалтерииМенеджер.ПолучитьИспользованиеИтогов()
Или Не РегистрБухгалтерииМенеджер.ПолучитьИспользованиеТекущихИтогов() Тогда
Продолжить;
КонецЕсли;
РегистрБухгалтерииМенеджер.ПересчитатьТекущиеИтоги();
КонецЦикла;
// Регистрация даты.
Если РежимРаботыЛокальныйФайловый() Тогда
ПараметрыИтогов = ПараметрыИтоговИАгрегатов();
ПараметрыИтогов.ДатаРасчетаИтогов = НачалоМесяца(ДатаСеанса);
ЗаписатьПараметрыИтоговИАгрегатов(ПараметрыИтогов);
КонецЕсли;
КонецПроцедуры

Установка периода рассчитанных итогов выполняется только для остаточных регистров накопления и регистров бухгалтерии. Для этого вызывается метод “УстановитьМаксимальныйПериодРассчитанныхИтогов” для менеджера регистра. Для регистров накопления передается конец предыдущего месяца, а для регистров бухгалтерии конец текущего месяца.

Как проверить, что у Вас установлен актуальный период рассчитанных итогов? Самый простой способ - зайти в обработку “Управление итогами” через “Все функции ➡️ Стандартные ➡️ Управление итогами”. Там выбрать полные возможности и в показанной таблице проверить дату в колонке “Период итогов”.

Инструмент управления итогами

Для регистров бухгалтерии это должен быть конец текущего месяца, а для остаточных регистров накопления - конец предыдущего месяца. Если даты обновлены, то все отлично. Если нет - значит либо еще не наступило 5 число месяца, либо регламентное задание по установке периода рассчитанных итогов у Вас не работает.

Но и это еще не все! Есть еще как минимум две операции, которые необходимо планировать для итогов:

  • Пересчет итогов - помогает не только исправить “странные” возникающие ошибки в отчетах (хоть это и очень редко), но и исправить возможные проблемы с производительностью. Периодичность работ нужно выбирать по ситуации, но можно для начала запланировать их выполнение раз в квартал.
  • Двигать минимальный период хранимых итогов. Здесь речь идет о настройке минимального периода хранимых итогов, который позволяет задать точный период “От” и “До”, за который итоги будут рассчитаны.
    Установка периода итогов

Зачем их устанавливать? Если в базе хранятся данные за 10 лет, то вряд ли они все используются. Целесообразно проанализировать какие данные действительно используются и за какой период (например, только последние 5 лет) и ограничить период хранения итогов нужным значением. Данный подход похож на метод скользящего окна, который упрощает сопровождение больших объемов данных.

Вот и все основные операции обслуживания.

Заключение

Мы быстро пробежались по принципу работы механизма итогов платформы “1С” и рассмотрели основные направления работ по обслуживанию итогов. Список получился коротким:

  • Ежемесячное обновление периода рассчитанных итогов для регистра бухгалтерии и остаточных регистров накопления.
  • Пересчет итогов для поддержки корректности данных и предотвращения проблем с производительностью.
  • Актуализация периода хранения итогов, чтобы итоги хранились за действительно необходимый период времени.

Мы не коснулись таких вопросов как:

  • Обслуживание индексов и статистик базы данных для таблиц итогов
  • Влияние этого механизма на производительность
  • Особые настройки таблиц итогов
  • И другое.

Но цели такой и не ставилось.

Проверьте свои итоги! Улучшите производительность отчетов!

Y

YPermitin

.NET, TSQL, DevOps, 1C:Enterprise

Developer, just developer.

Поделиться

Другие статьи

Развертывание ASP.NET Core приложений на Ubuntu Linux
Развертывание ASP.NET Core приложений на Ubuntu Linux
Настройка обслуживания PostgreSQL. Основное и простое
Настройка обслуживания PostgreSQL. Основное и простое
Счетчики производительности Windows + PowerShell
Счетчики производительности Windows + PowerShell

Все статьи от автора: YPermitin

Copyright © 2024 Убежище инженера