Как получить срез последних на дату из интервального регистра сведений в 1С:ЗУП 3.1?

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

При разработке отчетов и доработке конфигураций на базе 1С:ЗУП 3.1 (а также 1С:ERP и 1С:Комплексная автоматизация) разработчики часто сталкиваются с необходимостью получить актуальные плановые начисления, кадровые данные или тарифные ставки сотрудников на определенную дату. При попытке обратиться к таблице вида РегистрСведений.ПлановыеНачисленияИнтервальный.СрезПоследних возникает ошибка, так как конструктор запросов не предлагает привычных виртуальных таблиц срезов.

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

Почему у интервальных регистров нет виртуальной таблицы СрезПоследних?

Проанализируем структуру интервальных регистров. В типовых зарплатно-кадровых конфигурациях регистры с суффиксом Интервальный (например, ПлановыеНачисленияИнтервальный, ВидыЗанятостиСотрудниковИнтервальный) по своей структуре являются непериодическими. В них отсутствует стандартное платформенное измерение Период, а интервалы действия состояния задаются явными полями ДатаНачала и ДатаОкончания.

Поскольку платформа 1С формирует виртуальные таблицы СрезПоследних и СрезПервых только для периодических регистров сведений, к интервальным регистрам эти таблицы применить невозможно. Данные регистры созданы для ускорения выборок за интервалы времени и оптимизации запросов при расчете заработной платы.

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

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

Разберем пример текста запроса:


ВЫБРАТЬ
	Интервальный.Сотрудник КАК Сотрудник,
	Интервальный.Начисление КАК Начисление,
	Интервальный.Размер КАК Размер,
	Интервальный.ДатаНачала КАК ДатаНачала,
	Интервальный.ДатаОкончания КАК ДатаОкончания
ИЗ
	РегистрСведений.ПлановыеНачисленияИнтервальный КАК Интервальный
ГДЕ
	&ДатаСреза МЕЖДУ Интервальный.ДатаНачала И Интервальный.ДатаОкончания

Обратите внимание: бессрочные интервалы в типовых конфигурациях закрываются максимальной служебной датой — 31.12.3999 23:59:59, поэтому конструкция МЕЖДУ корректно обрабатывает открытые периоды начислений.

Способ 2. Использование типового API модуля ЗарплатаКадрыПериодическиеРегистры

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

Разберем по шагам, как получить текст запроса для формирования временной таблицы со срезом данных:

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

Посмотрим на пример вызова генератора текста запроса в программном коде:


// Формирование текста запроса среза плановых начислений
ПараметрыПостроения = ЗарплатаКадрыПериодическиеРегистры.ПараметрыПостроенияДляЗапроса();
ПараметрыПостроения.Период = &ДатаСреза;

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

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

Способ 3. Обращение к основному периодическому регистру сведений

Если в задаче не требуется оптимизация работы именно с интервальными таблицами, можно обратиться к основному периодическому регистру сведений ПлановыеНачисления, для которого платформа стандартно предоставляет виртуальную таблицу среза.

Посмотрим на пример запроса:


ВЫБРАТЬ
	ПлановыеНачисленияСрезПоследних.Сотрудник КАК Сотрудник,
	ПлановыеНачисленияСрезПоследних.Начисление КАК Начисление,
	ПлановыеНачисленияСрезПоследних.Размер КАК Размер,
	ПлановыеНачисленияСрезПоследних.Действует КАК Действует
ИЗ
	РегистрСведений.ПлановыеНачисления.СрезПоследних(&ДатаСреза, ) КАК ПлановыеНачисленияСрезПоследних
ГДЕ
	ПлановыеНачисленияСрезПоследних.Действует = ИСТИНА

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

← На главную