При доработке и отладке отчетов по заработной плате в конфигурации 1С:Зарплата и управление персоналом 3.1 разработчики часто сталкиваются с нестандартным механизмом работы схемы компоновки данных (СКД). Открывая схему отчета (например, «Расчетный листок» или «Анализ начислений и удержаний»), мы видим во временных таблицах пустые поля и конструкции с префиксом Представления_, хотя при формировании отчета выводятся полные кадровые срезы. Разберем детально, как устроен этот механизм, где формируется итоговый текст запроса и почему при увольнении и повторном приеме сотрудника в расчетном листке может отображаться его прежняя должность.
Рассмотрим, зачем разработчики платформенных решений 1С используют временные таблицы вида Представления_КадровыеДанныеСотрудниковАнализНачисленийИУдержаний. В исходной схеме компоновки данных создается лишь каркас временной таблицы с фиктивными или пустыми полями:
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность,
ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение
ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудниковАнализНачисленийИУдержаний
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
ЛОЖЬ
Такой подход решает сразу несколько ключевых задач:
Проанализируем процесс выполнения отчета при формировании пользователем:
ПриКомпоновкеРезультата.ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект, СоответствиеДополнительныхПолейПредставлениям).Представления_... и заменяет фиктивную выборку на сложный сгенерированный подзапрос к реальным регистрам кадрового учета (КадроваяИсторияСотрудников, ТекущиеКадровыеДанныеСотрудников, ВидыЗанятостиСотрудников).Именно поэтому при поиске в конфигураторе разработчик видит пустые поля, а реальный текст запроса можно перехватить только в отладчике непосредственно перед исполнением схемы компоновки данных.
Если сотрудник увольнялся и принимался вновь либо работает на условиях внутреннего совместительства, у одного физического лица возникает несколько рабочих мест. Для корректного вывода шапки расчетного листка ЗУП 3.1 рассчитывает числовой приоритет для каждого рабочего места. Посмотрим на фрагмент типового алгоритма:
ВЫБОР
КОГДА КадровыеДанныеСотрудников.ВидЗанятости ЕСТЬ NULL
ТОГДА 9999999999
ИНАЧЕ РАЗНОСТЬДАТ(ВЫБОР
КОГДА КадровыеДанныеСотрудников.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ДАТАВРЕМЯ(2100, 1, 1)
ИНАЧЕ КадровыеДанныеСотрудников.ДатаУвольнения
КОНЕЦ, ДАТАВРЕМЯ(2100, 1, 1), ДЕНЬ) * 100 + КадровыеДанныеСотрудников.ВидЗанятости.Порядок
КОНЕЦ КАК ПриоритетРабочегоМеста
Разберем математику этого выражения:
ПриоритетРабочегоМеста по возрастанию. Чем меньше полученное число, тем выше приоритет места работы.0001-01-01), функция ВЫБОР подставляет 2100-01-01. Разность дней между датой 2100 года и 2100 годом дает 0. Итоговое значение определяется только порядком вида занятости (для основного места работы порядок равен 1, результат: 0 * 100 + 1 = 1).Если после повторного приема в расчетном листке выводится прежняя должность, выясним причину сбоя приоритетов:
Сотрудники. Если кадровик оформил новый прием на ранее уволенного сотрудника, нарушается целостность периодических регистров сведений.КОГДА ВидЗанятости ЕСТЬ NULL ТОГДА 9999999999. Новое рабочее место получает максимальное числовое значение и уступает старому месту работы.Кадровая история сотрудников (интервальный), Текущие кадровые данные сотрудников) могут стать неактуальными, из-за чего дата увольнения по прошлому месту работы теряется в выборке среза.Для устранения ошибки выполним следующие шаги:
Сотрудники и убедимся, что для уволенного и вновь принятого человека создано два разных элемента, привязанных к одному элементу справочника ФизическиеЛица.Прием на работу по новой карточке: реквизит Вид занятости должен быть строго заполнен («Основное место работы» или «Внутреннее совместительство»).