Как формируются кадровые данные через таблицы «Представления_» в расчетном листке 1С:ЗУП 3.1 и почему при повторном приеме выводится старая должность?

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

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

Архитектура динамической подмены запросов: таблицы «Представления_»

Рассмотрим, зачем разработчики платформенных решений 1С используют временные таблицы вида Представления_КадровыеДанныеСотрудниковАнализНачисленийИУдержаний. В исходной схеме компоновки данных создается лишь каркас временной таблицы с фиктивными или пустыми полями:


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

Такой подход решает сразу несколько ключевых задач:

  1. Фиксация структуры схемы: СКД заранее знает имена полей, типы данных и связи наборов данных, что позволяет визуально настраивать поля и группировки в конфигураторе.
  2. Оптимизация производительности: система не выбирает избыточные данные. Реальный запрос строится динамически в зависимости от того, какие поля пользователь включил в отчет.
  3. Учет ограничений доступа (RLS) и срезов на дату: кадровые данные подтягиваются программно с учетом прав текущего пользователя и периодов действия документов.

Где и как происходит подмена текста запроса

Проанализируем процесс выполнения отчета при формировании пользователем:

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

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

Логика вычисления поля «ПриоритетРабочегоМеста»

Если сотрудник увольнялся и принимался вновь либо работает на условиях внутреннего совместительства, у одного физического лица возникает несколько рабочих мест. Для корректного вывода шапки расчетного листка ЗУП 3.1 рассчитывает числовой приоритет для каждого рабочего места. Посмотрим на фрагмент типового алгоритма:


ВЫБОР
    КОГДА КадровыеДанныеСотрудников.ВидЗанятости ЕСТЬ NULL
        ТОГДА 9999999999
    ИНАЧЕ РАЗНОСТЬДАТ(ВЫБОР
            КОГДА КадровыеДанныеСотрудников.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
                ТОГДА ДАТАВРЕМЯ(2100, 1, 1)
            ИНАЧЕ КадровыеДанныеСотрудников.ДатаУвольнения
        КОНЕЦ, ДАТАВРЕМЯ(2100, 1, 1), ДЕНЬ) * 100 + КадровыеДанныеСотрудников.ВидЗанятости.Порядок
КОНЕЦ КАК ПриоритетРабочегоМеста

Разберем математику этого выражения:

  1. Правило сортировки: итоговые данные сортируются по полю ПриоритетРабочегоМеста по возрастанию. Чем меньше полученное число, тем выше приоритет места работы.
  2. Для работающего сотрудника: дата увольнения не заполнена (считается равной 0001-01-01), функция ВЫБОР подставляет 2100-01-01. Разность дней между датой 2100 года и 2100 годом дает 0. Итоговое значение определяется только порядком вида занятости (для основного места работы порядок равен 1, результат: 0 * 100 + 1 = 1).
  3. Для уволенного сотрудника: дата увольнения заполнена. Разность между реальной датой увольнения и 2100 годом составляет тысячи дней. Умножение на 100 дает огромное число, что отбрасывает уволенное рабочее место в конец списка.

Причины вывода старой должности после увольнения и повторного приема

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

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

Пошаговый план исправления ситуации

Для устранения ошибки выполним следующие шаги:

  1. Откроем справочник Сотрудники и убедимся, что для уволенного и вновь принятого человека создано два разных элемента, привязанных к одному элементу справочника ФизическиеЛица.
  2. Проверим документ Прием на работу по новой карточке: реквизит Вид занятости должен быть строго заполнен («Основное место работы» или «Внутреннее совместительство»).
  3. Перейдем в раздел Администрирование -> Обслуживание -> Корректировка данных и запустим регламентное обновление вспомогательных данных кадрового учета для пересчета интервальных регистров.
  4. При необходимости перепроведем документ увольнения по старому сотруднику и документ приема по новому сотруднику в хронологическом порядке.
← На главную