При работе с современными конфигурациями на платформе 1С:Предприятие 8.3, такими как Зарплата и управление персоналом (ЗУП 3.1) или ERP Управление предприятием, разработчики часто сталкиваются с регистрами сведений, в названии которых присутствует слово Интервальный. Например, КадроваяИсторияСотрудниковИнтервальный или ГрафикРаботыСотрудниковИнтервальный. Понимание механики их работы критически важно для корректного построения запросов и отладки системы. Давайте подробно разберем, что это за объекты, зачем они нужны и в какой момент происходит их актуализация.
Для начала проанализируем архитектурную проблему, которую решают эти регистры. В классических конфигурациях (например, ЗУП 2.5) кадровая история хранилась в обычных периодических регистрах сведений. Чтобы получить состояние сотрудника на определенную дату, система обращалась к виртуальной таблице СрезПоследних. Однако при огромном количестве записей и необходимости получать данные по тысячам сотрудников в сложных отчетах, производительность СрезаПоследних падает. Это происходит из-за того, что СУБД приходится выполнять сложные вложенные подзапросы для поиска актуальной записи.
Рассмотрим решение, предложенное методистами 1С: создать вторичные регистры, которые хранят данные в виде готовых временных интервалов. В таких регистрах каждая запись имеет не только дату начала (Период), но и явную дату окончания. Таким образом, любая точка во времени попадает в строго определенный интервал.
Преимущества такого подхода:
СрезПоследних, мы используем обычную таблицу регистра с простым условием в секции ГДЕ: НужнаяДата МЕЖДУ ДатаНачала И ДатаОкончания.Выясним, когда именно заполняются эти данные. Важно понимать, что интервальные регистры — это производные объекты. Данные в них попадают не напрямую из документов, а зеркально отражают содержимое "основных" (базовых) регистров.
Проанализируем техническую цепочку событий:
Кадровый перевод).КадроваяИсторияСотрудников.ПриЗаписи срабатывает программный код, который инициирует пересчет интервалов.КадроваяИсторияСотрудниковИнтервальный.Таким образом, актуализация происходит в момент записи основного регистра. Это может происходить как при проведении документа, так и при ручной правке записей регистра (если она разрешена). Интервальный регистр обычно является независимым, что позволяет системе обновлять его без необходимости перепроводить документы-регистраторы, просто на основании имеющихся данных в базе.
Посмотрим на структуру типичного интервального регистра. В нем присутствуют ключевые поля:
31.12.3999.Интересной особенностью является обработка наложений. Если в один день происходят два события (например, перевод и изменение оплаты), система в интервальном регистре выстраивает их в строгой последовательности, используя внутренние приоритеты и номера строк, чтобы исключить пересечение периодов с одинаковым смыслом.
Рассмотрим рекомендации по разработке. Хотя технически мы можем написать прямой запрос к таблице интервального регистра, фирма 1С крайне не рекомендует этого делать. Причина проста: логика формирования интервалов может меняться в обновлениях конфигурации.
Для получения данных рекомендуется использовать методы программного интерфейса (API) общих модулей. Разберем пример использования основного инструмента разработчика — модуля ЗарплатаКадрыПериодическиеРегистры. Рассмотрим фрагмент кода для получения кадровых данных:
// Пример получения данных из интервального регистра через типовой механизм
ПараметрыПолучения = ЗарплатаКадрыПериодическиеРегистры.ПараметрыПолученияДанных();
ПараметрыПолучения.ИмяРегистра = "КадроваяИсторияСотрудников";
ПараметрыПолучения.ДатаАктуальности = ТекущаяДата();
ПараметрыПолучения.ПостроитьЗапрос = Истина;
// Метод сам решит, использовать интервальный регистр или основной
Результат = ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраСрезПоследних(МенеджерВТ, "ВТКадроваяИстория", ПараметрыПолучения);
Метод СоздатьВТИмяРегистраСрезПоследних внутри себя проверяет наличие интервального аналога для указанного регистра. Если интервальный регистр существует и он актуален, запрос будет направлен к нему, что существенно ускорит выполнение кода.
Проанализируем ситуацию, описанную в сообщениях форума: что делать, если в интервальном регистре "фигня" или данные не соответствуют документам? Такое случается при нарушении последовательности проведения документов "задним числом" или при программной записи в основные регистры с отключенными обработчиками событий.
Для исправления подобных ситуаций в типовых конфигурациях предусмотрены специальные инструменты:
Подведем итог нашего анализа. Интервальные регистры — это мощный инструмент оптимизации, который делает работу системы ЗУП 3 плавной даже на огромных базах данных. При работе с ними следует придерживаться следующих правил:
ЗарплатаКадрыПериодическиеРегистры — ваш лучший друг. Они автоматически выбирают наиболее эффективный способ получения данных.31.12.3999.Разбираясь в таких тонкостях платформенных решений, мы повышаем качество своего кода и понимаем, почему система ведет себя именно так в сложных ситуациях с кадровым учетом и расчетом зарплаты.