Как связать управленческие подразделения и сотрудников в запросе УПП 1.3?

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

При разработке управленческих отчетов по фонду оплаты труда (ФОТ) в конфигурации «1С:Управление производственным предприятием 1.3» часто возникает задача сгруппировать данные по структуре управленческих подразделений (справочник Подразделения), сохранив при этом детализацию до конкретных сотрудников (справочник СотрудникиОрганизаций) и физических лиц (справочник ФизическиеЛица). На практике прямое соединение таблиц нередко приводит к задвоению строк, потере данных или попаданию сотрудников не в свои отделы. Разберем по шагам, почему возникают такие коллизии и как правильно построить запрос.

Анализ структуры данных: управленческий и регламентированный контуры

В УПП 1.3 кадровый учет четко разделен на два независимых разреза:

  1. Регламентированный учет: ведется в разрезе организаций и справочника ПодразделенияОрганизаций. Документы кадрового учета (приемы, переводы, увольнения организаций) двигают именно этот контур.
  2. Управленческий учет: использует единый справочник Подразделения (подразделения компании). Если в компании не регистрируются управленческие кадровые документы («Прием на работу в компанию», «Кадровое перемещение компании»), то управленческие кадровые регистры остаются пустыми.

Для связи этих двух миров в типовой конфигурации предусмотрен непериодический регистр сведений СоответствиеПодразделенийИПодразделенийОрганизаций. Измерениями регистра являются Подразделение, Организация и ПодразделениеОрганизации. Главная сложность заключается в том, что соответствие в регистре не всегда строго «один к одному»: к одному управленческому отделу могут относиться несколько подразделений разных юридических лиц компании.

Типичные ошибки при построении запроса

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

  1. Использование устаревшего реквизита: Реквизит ПодразделениеОрганизации в справочнике СотрудникиОрганизаций указывает лишь на то подразделение, куда работник был принят изначально. Если сотрудника переводили, значение реквизита не меняется. Для получения актуального подразделения необходимо обращаться к периодическим кадровым регистрам либо использовать реквизит ТекущееПодразделениеОрганизации.
  2. Попытка связать сотрудника через управленческий реквизит: Реквизит ТекущееПодразделениеКомпании зачастую не заполнен вовсе, если на предприятии не ведется управленческий документооборот по кадрам.
  3. Неправильный отбор свойств в секции ГДЕ: При левом соединении с регистром ЗначенияСвойствОбъектов условие по конкретному виду свойства обязательно должно находиться в секции ПО. Если поставить фильтр в условие ГДЕ, левое соединение превратится во внутреннее, и все подразделения, у которых дополнительное свойство не задано, полностью исчезнут из выборки.
  4. Множественное сопоставление (декартово произведение): Соединение справочника подразделений с регистром соответствия без учета организации способно размножить строки, если одинаковые названия регламентированных отделов сопоставлены разным управленческим узлам.

Вариант 1. Запрос на основе текущих реквизитов справочника сотрудников

Если нам требуется оперативная выборка на текущую дату и в базе поддерживается актуальность реквизитов сотрудников, мы можем связать сотрудника с регистром соответствия через его регламентированное подразделение. Разберем правильное построение такого запроса:


ВЫБРАТЬ
    ЗначенияСвойствОбъектов.Значение КАК ПорядокВОтчетеТЗ,
    Подразделения.Код КАК КодПодр,
    Подразделения.Ссылка КАК Подразделение,
    СотрудникиОрганизаций.ТекущееПодразделениеОрганизации КАК ПодразделениеОрганизации,
    СотрудникиОрганизаций.Организация КАК Организация,
    СотрудникиОрганизаций.Ссылка КАК Сотрудник,
    СотрудникиОрганизаций.Физлицо КАК Физлицо
ИЗ
    Справочник.Подразделения КАК Подразделения
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО Подразделения.Ссылка = ЗначенияСвойствОбъектов.Объект
        И ЗначенияСвойствОбъектов.Свойство = &СвойствоПорядок
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеПодразделенийИПодразделенийОрганизаций КАК СоответствиеПодразделенийИПодразделенийОрганизаций
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
            ПО СоответствиеПодразделенийИПодразделенийОрганизаций.ПодразделениеОрганизации = СотрудникиОрганизаций.ТекущееПодразделениеОрганизации
            И СоответствиеПодразделенийИПодразделенийОрганизаций.Организация = СотрудникиОрганизаций.Организация
        ПО Подразделения.Ссылка = СоответствиеПодразделенийИПодразделенийОрганизаций.Подразделение
УПОРЯДОЧИТЬ ПО
    ЗначенияСвойствОбъектов.Значение

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

Вариант 2. Точный срез на дату отчета через регистр сведений

Для отчетов по расчету заработной платы и ФОТ подход с использованием реквизита ТекущееПодразделениеОрганизации имеет существенный недостаток: он не учитывает состояние на прошлую дату (например, на конец прошлого месяца) и включает уже уволенных сотрудников. Чтобы отчет работал корректно за любой период, обратимся к виртуальной таблице среза последних регистра сведений РаботникиОрганизаций.

Проанализируем структуру запроса с использованием временных таблиц:


ВЫБРАТЬ
    Работники.Сотрудник КАК Сотрудник,
    Работники.Сотрудник.Физлицо КАК Физлицо,
    Работники.Организация КАК Организация,
    Работники.ПодразделениеОрганизации КАК ПодразделениеОрганизации
ПОМЕСТИТЬ ВТ_РаботающиеСотрудники
ИЗ
    РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ) КАК Работники
ГДЕ
    Работники.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
;

ВЫБРАТЬ
    ЗначенияСвойств.Значение КАК ПорядокВОтчете,
    Подразделения.Ссылка КАК Подразделение,
    ВТ_РаботающиеСотрудники.Сотрудник КАК Сотрудник,
    ВТ_РаботающиеСотрудники.Физлицо КАК Физлицо,
    ВТ_РаботающиеСотрудники.Организация КАК Организация,
    ВТ_РаботающиеСотрудники.ПодразделениеОрганизации КАК ПодразделениеОрганизации
ИЗ
    Справочник.Подразделения КАК Подразделения
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
        ПО Подразделения.Ссылка = ЗначенияСвойств.Объект
        И ЗначенияСвойств.Свойство = &СвойствоПорядок
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеПодразделенийИПодразделенийОрганизаций КАК Соответствие
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РаботающиеСотрудники КАК ВТ_РаботающиеСотрудники
            ПО Соответствие.ПодразделениеОрганизации = ВТ_РаботающиеСотрудники.ПодразделениеОрганизации
            И Соответствие.Организация = ВТ_РаботающиеСотрудники.Организация
        ПО Подразделения.Ссылка = Соответствие.Подразделение
УПОРЯДОЧИТЬ ПО
    ЗначенияСвойств.Значение

Как избежать задвоения строк при неполной однозначности соответствий

Если в вашей базе одному подразделению организации сопоставлено несколько управленческих подразделений, левое соединение неизбежно размножит строки с сотрудниками. Выясним, как устранить эту проблему:

  1. Проверка целостности регистра: Откроем регистр сведений СоответствиеПодразделенийИПодразделенийОрганизаций и проверим, нет ли дублирующихся записей для одного подразделения организации. В идеале для каждого подразделения организации должно быть определено ровно одно управленческое подразделение компании.
  2. Использование агрегатных функций во временной таблице: Если избавиться от множественных соответствий в данных невозможно, предварительно свернем таблицу соответствия в запросе с помощью функции МИНИМУМ(Подразделение), чтобы для каждого подразделения организации выбиралась строго одна управленческая позиция.
  3. Автоматическое заполнение реквизита: Если кадровый учет компании не ведется вручную, напишем простую групповую обработку, которая на основании регистра соответствий заполнит реквизит ТекущееПодразделениеКомпании в справочнике СотрудникиОрганизаций. Это упростит структуру последующих запросов до прямого обращения к реквизиту справочника.
← На главную