При доработке отчетов по штатному расписанию в «1С:Зарплата и Управление Персоналом» разработчики часто сталкиваются с требованием пользователей сформировать штатное расписание за временной интервал (например, за месяц, квартал или год). Попытка передать диапазон дат непосредственно в параметр виртуальной таблицы среза сведений приводит к ошибке компиляции запроса:
...синтаксическая ошибка "МЕЖДУ"...
Разберем подробно причины возникновения этой проблемы и рассмотрим способы правильной реализации задачи как с технической, так и с методической точки зрения.
Проанализируем синтаксис виртуальной таблицы СрезПоследних. Первый параметр данной таблицы предназначен исключительно для указания одной конкретной точки во времени (тип Дата или МоментВремени), на которую система рассчитывает состояние среза.
Когда в запросе записывается конструкция вида:
РегистрСведений.ШтатноеРасписаниеОрганизаций.СрезПоследних(МЕЖДУ &ПериодНачало И &ПериодКонец, ) КАК Расписание
Платформа 1С не может обработать оператор МЕЖДУ внутри первого параметра виртуальной таблицы, так как этот параметр ожидает единичное значение даты. Это и вызывает синтаксическую ошибку.
Рассмотрим несколько способов реализации поставленной задачи в зависимости от требований пользователей.
Если кадровой службе требуется увидеть все изменения штатного расписания (введение новых ставок, изменение окладов или закрытие позиций), произошедшие в течение периода, необходимо отказаться от использования виртуальной таблицы СрезПоследних. Вместо этого обратимся напрямую к физической (основной) таблице регистра сведений РегистрСведений.ШтатноеРасписаниеОрганизаций.
В этом случае условие по интервалу дат накладывается в секции ГДЕ:
ВЫБРАТЬ
ШтатноеРасписание.Период КАК Период,
ШтатноеРасписание.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
ШтатноеРасписание.Должность КАК Должность,
ШтатноеРасписание.КоличествоСтавок КАК КоличествоСтавок,
ШтатноеРасписание.МинимальнаяТарифнаяСтавка КАК МинимальнаяТарифнаяСтавка
ИЗ
РегистрСведений.ШтатноеРасписаниеОрганизаций КАК ШтатноеРасписание
ГДЕ
ШтатноеРасписание.Период МЕЖДУ &ПериодНачало И &ПериодКонец
При таком подходе в отчет попадут все движения и записи, зарегистрированные в выбранном временном интервале.
Если нужно получить полную картину штатного расписания, действующего в периоде (учитывая ставки, введенные до начала интервала и продолжающие действовать), применяется выборка с объединением:
СрезПоследних(&ПериодНачало).&ПериодНачало до &ПериодКонец.ОБЪЕДИНИТЬ ВСЕ.Посмотрим на пример такого запроса:
ВЫБРАТЬ
Расписание.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
Расписание.Должность КАК Должность,
Расписание.КоличествоСтавок КАК КоличествоСтавок
ИЗ
РегистрСведений.ШтатноеРасписаниеОрганизаций.СрезПоследних(&ПериодНачало, ) КАК Расписание
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Изменения.ПодразделениеОрганизации,
Изменения.Должность,
Изменения.КоличествоСтавок
ИЗ
РегистрСведений.ШтатноеРасписаниеОрганизаций КАК Изменения
ГДЕ
Изменения.Период МЕЖДУ &ПериодНачало И &ПериодКонец
Унифицированная форма Т-3 «Штатное расписание» по своей природе является срезом состояния штатного состава организации на фиксированную дату. Попытка сформировать утвержденное формализованное штатное расписание «за период» методически некорректна.
Если пользователю требуется штатное расписание на определенный момент внутри периода (например, на конец месяца или конец года), передадим конкретную дату в срез последних:
РегистрСведений.ШтатноеРасписаниеОрганизаций.СрезПоследних(&ПериодКонец, ) КАК Расписание
Важный момент: При разработке отчета в Системе компоновки данных (СКД) параметр Период виртуальной таблицы удобно связывать с выражением КонецПериода(&ПериодКонец, "ДЕНЬ"), чтобы автоматически запрашивать данные на последнюю секунду указанного дня.