В современных конфигурациях на платформе 1С:Предприятие 8.3, таких как 1С:ERP Управление предприятием и 1С:Зарплата и управление персоналом 3.1, разработчики часто сталкиваются с регистрами сведений, имеющими в названии суффикс Вторичный или Интервальный. Понимание их назначения критически важно для корректного написания запросов и оптимизации производительности системы, особенно в механизмах расчета заработной платы, НДФЛ и страховых взносов.
Рассмотрим детально, какую задачу решают эти объекты, как они устроены изнутри и почему их использование в коде предпочтительнее работы со стандартными периодическими регистрами.
Стандартный периодический регистр сведений хранит данные как «точки во времени». Каждая запись — это дата начала действия определенного состояния. Для получения состояния на конкретный момент времени платформа использует виртуальную таблицу СрезПоследних. Однако, когда нам нужно получить данные не на одну дату, а на каждую дату из большого массива (например, расчет статусов налогоплательщика для тысячи сотрудников за каждый день месяца), использование СрезПоследних в соединении или подзапросе становится крайне ресурсоемким.
Проанализируем ситуацию: СУБД вынуждена для каждой строки основной таблицы выполнять поиск подходящей записи в регистре, что приводит к деградации производительности. Именно здесь на помощь приходят «вторичные» регистры.
Регистры с суффиксом Вторичный реализуют механизм денормализации данных. Они преобразуют временные точки в непрерывные временные интервалы. В структуру такого регистра, помимо стандартных измерений, добавляется ресурс (или измерение) ДатаОкончания.
Разберем по шагам, как это работает:
01.01.2023 — Статус 1, 15.01.2023 — Статус 2.01.01.2023 по 14.01.2023 — Статус 1, 15.01.2023 по 31.12.3999 — Статус 2.ЛЕВОЕ СОЕДИНЕНИЕ по условию: НужнаяДата МЕЖДУ Регистр.ДатаНачала И Регистр.ДатаОкончания.Такой подход позволяет СУБД эффективно использовать индексы, что ускоряет выборку данных в десятки раз на крупных массивах информации.
Часто возникает путаница между этими двумя типами оптимизационных регистров. Выясним причину их разделения:
Регистры «Вторичный» строятся на базе классических периодических регистров. Их задача — превратить точки возникновения событий в линейную шкалу без разрывов. Если в основном регистре есть записи на 01.01 и 05.01, вторичный создаст два смежных интервала.
Регистры «Интервальный» работают сложнее. Они предназначены для данных, которые изначально имеют длительность (дата начала и дата окончания), и эти данные могут пересекаться или вытеснять друг друга. Например, начисление зарплаты может перекрываться больничным. Интервальный регистр разрешает эти конфликты и создает «плоскую» картину состояний, где в каждый момент времени действует только одна актуальная запись.
Данные во вторичных регистрах являются производными. Это означает, что их не нужно (и нельзя) заполнять вручную через интерфейс. Система поддерживает их актуальность автоматически через подписки на события при записи в основные регистры.
Однако существуют сценарии (обновление ИБ, восстановление данных после сбоев или создание новых узлов РИБ), когда требуется принудительное обновление этих «кешей». Для этого используются экспортные процедуры в модулях менеджеров соответствующих регистров. Посмотрим на пример вызова таких процедур:
Процедура ЗаполнитьЗависимыеДанныеПослеСозданияНовогоУзла() Экспорт
// Вызов процедур пересчета вторичных данных для НДФЛ
РегистрыСведений.СтатусФизическихЛицКакНалогоплательщиковНДФЛВторичный.ЗаполнитьВторичныеДанные();
РегистрыСведений.ПрименениеСтандартныхВычетовПоНДФЛВторичный.ЗаполнитьВторичныеДанные();
РегистрыСведений.РазмерВычетовНДФЛВторичный.ЗаполнитьВторичныеДанные();
КонецПроцедуры
Важный момент: если вы программно меняете данные в основных регистрах в обход стандартных механизмов (например, через ОбменДанными.Загрузка = Истина), автоматическое обновление вторичных данных может не сработать. В этом случае вызов ЗаполнитьВторичныеДанные() обязателен, иначе отчеты и расчеты по НДФЛ будут показывать неверные результаты.
В типовых конфигурациях рядом с вызовами этих процедур часто можно встретить комментарии вида // АПК:277-выкл. Проанализируем, что это значит.
АПК (Автоматизированная проверка конфигураций) — это инструмент статического анализа кода от фирмы «1С». Правило 277 регламентирует использование экспортных методов модулей менеджеров. Теги «выкл/вкл» сообщают анализатору, что разработчик намеренно нарушает стандарт (например, вызывает процедуру напрямую, а не через специализированный программный интерфейс), и это нарушение обосновано архитектурными особенностями механизма вторичных данных.
Использование вторичных регистров в собственных запросах делает код более элегантным и быстрым. Рассмотрим пример запроса, где нам нужно получить статус физлица на каждую дату из временной таблицы ВТ_Периоды:
ВЫБРАТЬ
Периоды.Дата КАК ДатаСобытия,
Статусы.Статус КАК СтатусНДФЛ
ИЗ
ВТ_Периоды КАК Периоды
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусФизическихЛицКакНалогоплательщиковНДФЛВторичный КАК Статусы
ПО Периоды.ФизЛицо = Статусы.ФизЛицо
И Периоды.Дата МЕЖДУ Статусы.ДатаНачала И Статусы.ДатаОкончания
Такой запрос работает максимально быстро, так как СУБД выполняет простое индексное сканирование. Нам не нужно заботиться о ПЕРВЫЕ 1, УПОРЯДОЧИТЬ ПО или виртуальных таблицах внутри цикла запроса.
Подведем итог нашему анализу:
СрезПоследних при массовой обработке данных.Вторичный — это обеспечит масштабируемость вашего решения на больших базах.