При разработке управленческих отчетов по фонду оплаты труда (ФОТ) в конфигурации «1С:Управление производственным предприятием 1.3» часто возникает задача сгруппировать данные по структуре управленческих подразделений (справочник Подразделения), сохранив при этом детализацию до конкретных сотрудников (справочник СотрудникиОрганизаций) и физических лиц (справочник ФизическиеЛица). На практике прямое соединение таблиц нередко приводит к задвоению строк, потере данных или попаданию сотрудников не в свои отделы. Разберем по шагам, почему возникают такие коллизии и как правильно построить запрос.
В УПП 1.3 кадровый учет четко разделен на два независимых разреза:
ПодразделенияОрганизаций. Документы кадрового учета (приемы, переводы, увольнения организаций) двигают именно этот контур.Подразделения (подразделения компании). Если в компании не регистрируются управленческие кадровые документы («Прием на работу в компанию», «Кадровое перемещение компании»), то управленческие кадровые регистры остаются пустыми.Для связи этих двух миров в типовой конфигурации предусмотрен непериодический регистр сведений СоответствиеПодразделенийИПодразделенийОрганизаций. Измерениями регистра являются Подразделение, Организация и ПодразделениеОрганизации. Главная сложность заключается в том, что соответствие в регистре не всегда строго «один к одному»: к одному управленческому отделу могут относиться несколько подразделений разных юридических лиц компании.
Рассмотрим частые ошибки, которые приводят к некорректным результатам:
ПодразделениеОрганизации в справочнике СотрудникиОрганизаций указывает лишь на то подразделение, куда работник был принят изначально. Если сотрудника переводили, значение реквизита не меняется. Для получения актуального подразделения необходимо обращаться к периодическим кадровым регистрам либо использовать реквизит ТекущееПодразделениеОрганизации.ТекущееПодразделениеКомпании зачастую не заполнен вовсе, если на предприятии не ведется управленческий документооборот по кадрам.ЗначенияСвойствОбъектов условие по конкретному виду свойства обязательно должно находиться в секции ПО. Если поставить фильтр в условие ГДЕ, левое соединение превратится во внутреннее, и все подразделения, у которых дополнительное свойство не задано, полностью исчезнут из выборки.Если нам требуется оперативная выборка на текущую дату и в базе поддерживается актуальность реквизитов сотрудников, мы можем связать сотрудника с регистром соответствия через его регламентированное подразделение. Разберем правильное построение такого запроса:
ВЫБРАТЬ
ЗначенияСвойствОбъектов.Значение КАК ПорядокВОтчетеТЗ,
Подразделения.Код КАК КодПодр,
Подразделения.Ссылка КАК Подразделение,
СотрудникиОрганизаций.ТекущееПодразделениеОрганизации КАК ПодразделениеОрганизации,
СотрудникиОрганизаций.Организация КАК Организация,
СотрудникиОрганизаций.Ссылка КАК Сотрудник,
СотрудникиОрганизаций.Физлицо КАК Физлицо
ИЗ
Справочник.Подразделения КАК Подразделения
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ПО Подразделения.Ссылка = ЗначенияСвойствОбъектов.Объект
И ЗначенияСвойствОбъектов.Свойство = &СвойствоПорядок
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеПодразделенийИПодразделенийОрганизаций КАК СоответствиеПодразделенийИПодразделенийОрганизаций
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
ПО СоответствиеПодразделенийИПодразделенийОрганизаций.ПодразделениеОрганизации = СотрудникиОрганизаций.ТекущееПодразделениеОрганизации
И СоответствиеПодразделенийИПодразделенийОрганизаций.Организация = СотрудникиОрганизаций.Организация
ПО Подразделения.Ссылка = СоответствиеПодразделенийИПодразделенийОрганизаций.Подразделение
УПОРЯДОЧИТЬ ПО
ЗначенияСвойствОбъектов.Значение
Обратим внимание на условие связи: мы сопоставляем сотрудника не только по подразделению организации, но и строго по организации. Это предотвращает ошибки, когда в двух разных юридических лицах присутствуют подразделения с одинаковой структурой или кодами.
Для отчетов по расчету заработной платы и ФОТ подход с использованием реквизита ТекущееПодразделениеОрганизации имеет существенный недостаток: он не учитывает состояние на прошлую дату (например, на конец прошлого месяца) и включает уже уволенных сотрудников. Чтобы отчет работал корректно за любой период, обратимся к виртуальной таблице среза последних регистра сведений РаботникиОрганизаций.
Проанализируем структуру запроса с использованием временных таблиц:
ВЫБРАТЬ
Работники.Сотрудник КАК Сотрудник,
Работники.Сотрудник.Физлицо КАК Физлицо,
Работники.Организация КАК Организация,
Работники.ПодразделениеОрганизации КАК ПодразделениеОрганизации
ПОМЕСТИТЬ ВТ_РаботающиеСотрудники
ИЗ
РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ) КАК Работники
ГДЕ
Работники.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
;
ВЫБРАТЬ
ЗначенияСвойств.Значение КАК ПорядокВОтчете,
Подразделения.Ссылка КАК Подразделение,
ВТ_РаботающиеСотрудники.Сотрудник КАК Сотрудник,
ВТ_РаботающиеСотрудники.Физлицо КАК Физлицо,
ВТ_РаботающиеСотрудники.Организация КАК Организация,
ВТ_РаботающиеСотрудники.ПодразделениеОрганизации КАК ПодразделениеОрганизации
ИЗ
Справочник.Подразделения КАК Подразделения
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
ПО Подразделения.Ссылка = ЗначенияСвойств.Объект
И ЗначенияСвойств.Свойство = &СвойствоПорядок
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеПодразделенийИПодразделенийОрганизаций КАК Соответствие
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РаботающиеСотрудники КАК ВТ_РаботающиеСотрудники
ПО Соответствие.ПодразделениеОрганизации = ВТ_РаботающиеСотрудники.ПодразделениеОрганизации
И Соответствие.Организация = ВТ_РаботающиеСотрудники.Организация
ПО Подразделения.Ссылка = Соответствие.Подразделение
УПОРЯДОЧИТЬ ПО
ЗначенияСвойств.Значение
Если в вашей базе одному подразделению организации сопоставлено несколько управленческих подразделений, левое соединение неизбежно размножит строки с сотрудниками. Выясним, как устранить эту проблему:
СоответствиеПодразделенийИПодразделенийОрганизаций и проверим, нет ли дублирующихся записей для одного подразделения организации. В идеале для каждого подразделения организации должно быть определено ровно одно управленческое подразделение компании.МИНИМУМ(Подразделение), чтобы для каждого подразделения организации выбиралась строго одна управленческая позиция.ТекущееПодразделениеКомпании в справочнике СотрудникиОрганизаций. Это упростит структуру последующих запросов до прямого обращения к реквизиту справочника.