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