Для чего нужны интервальные регистры сведений в 1С:ЗУП 3.1 и как они работают?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При переходе с версии ЗУП 2.5 на 3.1 многие разработчики замечают существенное усложнение архитектуры хранения данных. Одним из самых заметных нововведений стало появление так называемых интервальных регистров сведений. Например, рядом с привычным регистром ТерриторииСотрудников (подчинен регистратору) всегда сосуществует ТерриторииСотрудниковИнтервальный (независимый). В этой статье мы подробно разберем, зачем 1С пошла на такое дублирование данных, как это помогает производительности и что делать с регистрами исправлений и корректировок.

1. Проблема производительности «Среза последних»

Для начала проанализируем, как работала система в версии 2.5. Большинство кадровых данных извлекалось с помощью виртуальной таблицы СрезПоследних. На уровне SQL-запроса это выглядит как сложный подзапрос, который ищет максимальную дату (период) для каждого сотрудника, не превышающую заданную дату документа или отчета.

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

Рассмотрим, как меняется логика запроса:

  1. В обычном регистре: требуется обращение к виртуальной таблице или подзапрос с использованием МАКСИМУМ(Период).
  2. В интервальном регистре: используется простое и максимально быстрое для СУБД условие: ВыбраннаяДата МЕЖДУ ДатаНачала И ДатаОкончания.

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

2. Архитектура «Дублирование ради скорости»

Многих смущает, что данные в интервальном регистре избыточны. Однако в ЗУП 3.1 реализован принцип денормализации. Основной регистр (подчиненный регистратору) является эталоном и хранит историю «событий». Интервальный регистр (независимый) хранит «состояния».

Выясним причину, почему интервальный регистр сделан независимым. Это позволяет системе программно пересчитывать его записи без привязки к конкретному документу-регистратору. Если в кадровой истории происходит изменение «задним числом», специальные обработчики в модуле ЗарплатаКадрыСоставДокументов автоматически обновляют интервальные записи, «схлопывая» или разрывая периоды так, чтобы в истории не было дырок или наложений.

Важный нюанс: обращаться к этим регистрам напрямую из своих запросов крайне не рекомендуется. 1С предоставляет для этого специальный программный слой.

3. Универсальный программный интерфейс (API) для работы с регистрами

Для получения данных из интервальных регистров следует использовать методы общего модуля ЗарплатаКадрыПериодическиеРегистры. Рассмотрим основные функции, которые заменяют привычный СрезПоследних:


// Создание временной таблицы с данными на определенную дату
ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраСрезПоследних(
    МенеджерВременныхТаблиц, 
    Истина, 
    ПараметрыПостроения
);

// Получение истории изменений за период
ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраПериоды(
    МенеджерВременныхТаблиц, 
    Истина, 
    ПараметрыПостроения
);

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

4. Обработка сложных кадровых ситуаций

Разберем ситуацию, когда на одну и ту же дату приходятся два разных события. В стандартном периодическом регистре это могло бы вызвать неоднозначность (какая запись «последняя»?). Интервальные механизмы ЗУП 3.1 проектировались с учетом прикладной специфики:

5. Регистры с постфиксами «Испр» и «Корректировка»

Помимо интервальных, в ЗУП 3.1 встречаются регистры типа ДанныеОВремениДляРасчетаСреднегоОбщийКорректировка или кадровые регистры с окончанием _Испр. Проанализируем их назначение.

Регистры «Испр» (Исправления) предназначены для реализации механизма, который пользователь видит как кнопку «Исправить» в документах. Когда расчетчик исправляет документ прошлого периода в текущем месяце, система должна хранить старое состояние для корректного сторнирования и новое — для начисления. Для управления этим процессом используется модуль ИсправлениеПериодическихСведений. При отмене исправления данные из регистра _Испр могут «возвращаться» в основной регистр или удаляться.

Регистры «Корректировка» используются там, где данные собираются из нескольких источников. Разберем на примере расчета среднего заработка:

  1. Программа анализирует записи о фактически отработанном времени.
  2. Если несколько документов (например, Табель и Индивидуальный график) претендуют на один и тот же период, может возникнуть задвоение дней.
  3. Алгоритм вычисляет, сколько дней «лишних», и записывает их в регистр корректировок с отрицательным или положительным значением.

Это позволяет не менять первичные данные документов, но при этом получать правильный итоговый результат при расчете. Если вы видите странные данные в таких регистрах, нужно искать причину в «плохих» данных регистра расчета (пересекающиеся начисления), а не просто очищать корректировки — программа восстановит их при следующем расчете.

Заключение

Интервальные регистры в ЗУП 3.1 — это мощный инструмент оптимизации. Несмотря на кажущуюся сложность и дублирование, они позволяют системе работать стабильно при больших объемах данных. Разработчику важно помнить:

← На главную