Как исключить дубли сотрудников в отчете СКД при работе в нескольких организациях?

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

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

В этой статье мы подробно разберем, как реализовать такую логику в Системе компоновки данных (СКД), используя временные таблицы и условия в запросах. Также мы затронем вопрос специфики работы регистра сведений ГрафикиРаботыСотрудников при совместительстве.

Метод 1. Использование временных таблиц для фильтрации (рекомендуемый)

Рассмотрим наиболее надежный способ реализации данной задачи через структуру запроса с использованием временных таблиц. Основная идея заключается в том, чтобы разделить выборку на два этапа: получение списка физических лиц из основных организаций и последующая фильтрация сотрудников «Управленческой базы».

Разберем этот процесс по шагам:

  1. Создаем первую временную таблицу: Выбираем всех сотрудников из «основных» организаций (например, ООО «Рога» и ООО «Копыта»). Нам важно получить уникальный список ФизическоеЛицо.
  2. Создаем вторую временную таблицу: Выбираем данные сотрудников из «основных» организаций, которые пойдут в финальную выборку.
  3. Формируем запрос по «Управленческой базе»: При выборе сотрудников из третьей организации устанавливаем условие: поле ФизическоеЛицо не должно присутствовать в первой временной таблице.
  4. Объединяем результаты: Соединяем данные основных организаций и отфильтрованные данные управленческой базы через ОБЪЕДИНИТЬ ВСЕ.

Пример реализации в тексте запроса:


// Шаг 1: Собираем Физлиц основных организаций
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо
ПОМЕСТИТЬ ВТ_ФизЛицаОсновныхОрг
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    Сотрудники.Организация В (&СписокОсновныхОрганизаций);

////////////////////////////////////////////////////////////////////////////////
// Шаг 2: Выбираем данные по управленческой организации с фильтром
ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    Сотрудники.Организация КАК Организация,
    Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    Сотрудники.Организация = &УправленческаяОрганизация
    И НЕ Сотрудники.ФизическоеЛицо В (ВЫБРАТЬ ВТ.ФизическоеЛицо ИЗ ВТ_ФизЛицаОсновныхОрг КАК ВТ)

ОБЪЕДИНИТЬ ВСЕ

// Шаг 3: Добавляем данные по основным организациям
ВЫБРАТЬ
    Сотрудники.Ссылка,
    Сотрудники.Организация,
    Сотрудники.ФизическоеЛицо
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    Сотрудники.Организация В (&СписокОсновныхОрганизаций)

Метод 2. Приоритезация через вычисляемые поля в СКД

Если вы не хотите сильно менять структуру запроса, можно воспользоваться механизмом группировок и ресурсов СКД. Этот метод основан на присвоении «веса» или «приоритета» каждой организации.

Проанализируем ситуацию: в запросе мы можем добавить поле Приоритет. Для основных организаций установим значение 1, а для управленческой — 2. Затем в настройках СКД выполним группировку по полю ФизическоеЛицо. Чтобы вывести данные только одного сотрудника, мы можем использовать функцию Минимум(Приоритет).

Рассмотрим подробнее логику формирования полей:

Метод 3. Использование коррелированного подзапроса в секции ГДЕ

Иногда удобнее прописать логику исключения прямо в условии выбора данных. Выясним, как это выглядит на практике. В секции ГДЕ мы можем проверить существование записи по тому же физическому лицу в других организациях.


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

Важный нюанс: при таком подходе обязательно учитывайте статус сотрудника (работает он или уволен) на дату формирования отчета. Для этого в подзапрос следует добавить проверку по кадровым срезам последних или использовать таблицу ТекущиеКадровыеДанныеСотрудников.

Проблема отсутствия записей в регистре графиков сотрудников

Разберем вторую проблему, упомянутую в теме: почему для одного совместителя в регистре ГрафикиРаботыСотрудников есть две записи, а для другого — только одна? Проанализируем возможные технические причины:

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

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

← На главную