Рассказывает моя коллега Екатерина, разработчик 1С в нашей команде:
В конфигурации «Зарплата и управление персоналом», редакция 3.1, разработчики фирмы 1С пересмотрели классический подход к хранению периодических данных. В дополнение к привычным регистрам сведений со срезами последних появился механизм интервальных регистров.
В этой статье попробуем разобраться, зачем это было сделано, как это работает и как использовать этот механизм в разработке.
Содержание:
1. Что не так с регистрами сведений из предыдущих версий ЗУП.
2. В чем отличия интервального регистра.
3. Как это выглядит в регистре
4. Как может быть использовано в коде.
5. В чем плюсы использования интервальных регистров.
6. Что делать, если данные «разъехались».
1. Что не так с регистрами сведений из предыдущих версий ЗУП
В версии 2.5 и ранних редакциях 3.0 информация (например, об окладе или подразделении) хранилась в периодических регистрах сведений. Чтобы узнать состояние сотрудника на конкретную дату, необходимо было получить СрезПоследних.
Это и есть та большая «ложка дегтя» использования регистров сведений, а точнее, их виртуальных таблиц. Запросы с их использованием были тяжелыми. В случаях, когда необходимо было получить состояния сотрудников на каждый день из периода, особенно для большого числа сотрудников одновременно, нагрузка на СУБД была очень значительной.
2. В чем отличия интервального регистра
Интервальный регистр — это в некотором роде дубль обычного периодического регистра. Почти у каждого важного регистра есть интервальный двойник:

Ключевые отличия в структуре: в обычном регистре есть стандартный реквизит Период. В интервальном регистре, который является непериодическим, реквизита Период нет, зато добавляются измерения ДатаНачала (фактическое начало действия записи) и ДатаОкончания (дата, по которую действует это состояние или 31.12.3999, если состояние открыто).
Важно: пользователь не работает с интервальными регистрами напрямую. Данные в них формируются автоматически при проведении документов (Прием на работу, Кадровый перевод и др.), а точнее, в процедуре «ПриЗаписи» основного регистра через вызов процедуры ОбновитьИнтервальныйРегистрСведений().
Это ведомые регистры: изменения в основном реестре (например, кадровые переводы) генерируют интервалы, учитывая суточный учет и возможные вытеснения документов. При нескольких изменениях на одну дату механизм вытеснений определяет «победителя» по порядку в сутках, формируя точные интервалы с временем, не всегда 00:00 или 23:59.
3. Как это выглядит в регистре
Рассмотрим пример. Сотрудник был принят на работу с одним окладом, а через некоторое время оклад был изменен.
В регистре сведений ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников записи выглядят так:

В интервальном регистре ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный – так:

Теперь, чтобы получить данные на любую дату, нет необходимости искать «последнюю запись до этой даты» (срез последних). Нужно лишь добавить в запрос с интервальным регистром условие (предварительно параметр &НужнаяДата необходимо привести к концу дня, так как ДатаНачала может иметь не нулевое значение секунд)
ГДЕ
&НужнаяДата МЕЖДУ ИнтервальныйРС.ДатаНачала И ИнтервальныйРС.ДатаОкончания
4. Как может быть использовано в коде
Например, если нужно получить подразделение и должность сотрудника в определенном периоде в своем отчете, запрос к интервальному регистру может выглядеть так:
ВЫБРАТЬ
ИнтервальныйРС.Сотрудник КАК Сотрудник,
ИнтервальныйРС.Подразделение КАК Подразделение,
ИнтервальныйРС.Должность КАК Должность,
ИнтервальныйРС.ДатаНачала КАК ДатаНачала,
ИнтервальныйРС.ДатаОкончания КАК ДатаОкончания
ИЗ
РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК ИнтервальныйРС
ГДЕ
ИнтервальныйРС.Сотрудник = &Сотрудник
И ИнтервальныйРС.ДатаНачала <= &КонецПериода
И ИнтервальныйРС.ДатаОкончания >= &НачалоПериода
Предварительно параметр &КонецПериода необходимо привести к концу дня, так как ДатаНачала может иметь не нулевое значение секунд.
Этот запрос вернет все кадровые изменения, которые затронули выбранный период.

Нужно помнить, что при работе с типовой конфигурацией прямые запросы к интервальным регистрам использовать не следует. Вместо этого нужно использовать механизм представлений.
5. В чем плюсы использования интервальных регистров
- значительное увеличение скорости формирования отчетов, так как данные выбираются прямым соединением таблиц;
- упрощение соединений: теперь можно одним запросом соединить таблицу рабочего времени и таблицу интервальных регистров по условию перекрытия периодов;
- исключение неописанных периодов: механизм гарантирует, что внутри цепочки событий не будет «пробелов», если это не предусмотрено логикой.
6. Что делать, если данные «разъехались».
Иногда из-за сбоев или некорректных доработок данные в основном и интервальном регистрах начинают различаться. В «ЗУП 3.1» предусмотрены механизмы защиты:
- автоматическое обновление: при проведении регистратора интервалы для конкретного сотрудника пересчитываются;
- общий пересчет: в разделе Администрирование -> Перезаполнение интервальных регистров есть возможность запустить обновление интервальных регистров;
- программный метод: для разработчика доступен вызов метода
ЗарплатаКадрыПериодическиеРегистры.ОбновитьДвиженияИнтервальногоРегистра (…)
// Обновляет движения интервального регистра сведений
// КадроваяИсторияСотрудников
//
// Параметры:
// ИмяРегистра - Строка - Имя регистра сведений, имеющего интервальную версию.
// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц
Процедура ОбновитьДвиженияИнтервальногоРегистра(ИмяРегистра, МенеджерВременныхТаблиц) Экспорт
ПараметрыПостроения = ПараметрыПостроенияИнтервальногоРегистра();
ПараметрыПостроения.ПолноеПереформирование = Истина;
ПараметрыПостроения.РежимЗагрузки = Истина;
ПараметрыПостроения.ФильтрВВидеВТ = Истина;
ПараметрыПостроения.ТаблицаФильтра = МенеджерВременныхТаблиц;
ИнтервальныеРегистрыБЗК.СформироватьДвиженияИнтервальногоРегистра(ИмяРегистра, ПараметрыПостроения);
КонецПроцедуры
Интервальные регистры в «ЗУП 3.1» — это мощный инструмент оптимизации. Они делают систему сложнее в плане хранения (избыточность данных), но значительно выигрывают в скорости чтения и простоте построения сложных аналитических запросов.
Механизм интервальных регистров — это компромисс между скоростью чтения и сложностью записи. Для конечного пользователя это означает мгновенное формирование отчетов, а для разработчика — необходимость следить за синхронизацией «точечных» и «интервальных» данных.
Интервальные регистры можно рассматривать как кэш, используемый для ускорения системы. Как и любой кэш, его иногда нужно чистить и обновлять. При написании инструкций для пользователей или техподдержки следует всегда включать пункт о пересчете интервальных регистров как первый шаг при возникновении «странных» данных в кадровых отчетах.
Вступайте в нашу телеграмм-группу Инфостарт
