При разработке внешних обработок в таких сложных конфигурациях, как 1С:ERP Управление предприятием 2.4 или 1С:Зарплата и управление персоналом 3.1, программисты часто сталкиваются с задачей сбора сводной информации о сотрудниках. Трудность заключается в том, что кадровые данные, сведения об окладах и тарифных разрядах разнесены по разным регистрам сведений, а показатели расчета зарплаты (тарифы, надбавки, коэффициенты) могут храниться в одной таблице, что требует их тщательной фильтрации. Рассмотрим, как эффективно решить эту задачу несколькими способами.
Рассмотрим ситуацию, когда нам необходимо получить данные напрямую из регистров. Основными источниками данных в ERP 2.4 для этой задачи являются справочник Сотрудники, регистр сведений РеестрКадровыхПриказов (или КадроваяИсторияСотрудников), а также регистры плановых начислений и показателей.
Проанализируем структуру запроса, который позволяет собрать ФИО, табельный номер, должность, разряд и значение тарифной ставки. Важной деталью здесь является соединение с виртуальными таблицами СрезПоследних. Посмотрим на пример реализации такого запроса:
ВЫБРАТЬ
Сотрудники.Код КАК ТабНомер,
Сотрудники.Наименование КАК ФИО,
РеестрКадровыхПриказов.Должность.Наименование КАК ДолжностьНаименование,
РеестрКадровыхПриказов.Разряд.Наименование КАК РазрядНаименование,
РеестрКадровыхПриказов.Дата КАК ДатаПриема,
Показатели.Значение КАК Тариф,
СУММА(Начисления.Размер) КАК ФОТ,
Сотрудники.ФизическоеЛицо.ДатаРождения КАК ДатаРождения
ИЗ
Справочник.Сотрудники КАК Сотрудники
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РеестрКадровыхПриказов КАК РеестрКадровыхПриказов
ПО Сотрудники.Ссылка = РеестрКадровыхПриказов.Сотрудник
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.СрезПоследних(&Период, ) КАК Показатели
ПО Сотрудники.Ссылка = Показатели.Сотрудник
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыеНачисления.СрезПоследних(&Период, ) КАК Начисления
ПО Сотрудники.Ссылка = Начисления.Сотрудник
ГДЕ
Показатели.Показатель.Наименование ПОДОБНО "Тариф%"
И НЕ Сотрудники.В Архиве
СГРУППИРОВАТЬ ПО
Сотрудники.Код,
Сотрудники.Наименование,
РеестрКадровыхПриказов.Должность.Наименование,
РеестрКадровыхПриказов.Разряд.Наименование,
РеестрКадровыхПриказов.Дата,
Показатели.Значение,
Сотрудники.ФизическоеЛицо.ДатаРождения
Важное замечание по фильтрации: Одной из главных проблем является попадание в выборку процентных надбавок (например, "Северная надбавка 1.4%" или "Вредность 4%"), если они хранятся в том же регистре показателей. Чтобы избежать этого, мы применили условие ПОДОБНО "Тариф%". Однако это не самый надежный метод, так как названия показателей могут меняться пользователями. Рассмотрим более надежные критерии фильтрации далее.
Вместо того чтобы полагаться на строковое наименование или пытаться отсечь значения условием Значение > 10 (что ошибочно, так как тариф может быть меньше 10, а процент — больше), проанализируем свойства самого справочника ПоказателиРасчетаЗарплаты. Выясним причину, по которой одни записи нам нужны, а другие нет.
В системе 1С у каждого показателя есть реквизит, определяющий его тип. Мы можем добавить в запрос условие по ссылке на конкретные предопределенные показатели или по их назначению. Рассмотрим вариант с использованием коллекции разрешенных показателей:
&СписокПоказателей.ГДЕ Показатели.Показатель В (&СписокПоказателей).Также можно использовать свойство ТипПоказателя, если оно доступно в вашей версии метаданных, чтобы выбирать только денежные показатели и исключать процентные. Это позволит сделать алгоритм независимым от конкретных названий, заданных пользователем.
Выясним наиболее современный и правильный подход, который рекомендуют разработчики фирмы "1С". В конфигурациях на базе БСП (Библиотеки стандартных подсистем), таких как ERP и ЗУП, существует специальный программный слой для получения кадровых данных. Использование прямого обращения к регистрам чревато ошибками при обновлении конфигурации, так как структура таблиц может измениться.
Разберем, как получить данные через общий модуль КадровыйУчет. Этот метод автоматически учитывает срезы последних, кадровые перемещения и актуальность данных на дату.
// Пример получения данных через типовой механизм
ДатаАктуальности = ТекущаяДата();
МассивСотрудников = Новый Массив;
// Заполняем массив ссылками на нужных сотрудников...
СписокПолей = "ФИОПолное,ТабельныйНомер,Должность,ДатаПриема,Подразделение,ТарифнаяСтавка";
ТаблицаДанных = КадровыйУчет.ДанныеСотрудников(Ложь, МассивСотрудников, СписокПолей, ДатаАктуальности);
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
НоваяСтрока = Объект.Сотрудники.Добавить();
НоваяСтрока.ФИО = СтрокаДанных.ФИОПолное;
НоваяСтрока.ТабНомер = СтрокаДанных.ТабельныйНомер;
НоваяСтрока.Должность = СтрокаДанных.Должность;
НоваяСтрока.Тариф = СтрокаДанных.ТарифнаяСтавка;
КонецЦикла;
Преимущества этого метода:
ДанныеСотрудников будет обновлена ими же, и ваш код продолжит работать.ЛЕВОЕ СОЕДИНЕНИЕ и группировки, система вернет уже готовую таблицу с актуальными значениями на указанную дату.Проанализируем еще один тонкий момент: получение Фонда оплаты труда (ФОТ). В первом сообщении темы автор суммирует Размер из регистра ПлановыеНачисления. Рассмотрим, почему это может привести к неверным результатам. В ERP 2.4 ФОТ — это расчетная величина, которая может включать в себя не только основной оклад, но и постоянные надбавки, районные коэффициенты и прочие плановые выплаты.
Если вам нужен именно совокупный ФОТ сотрудника, лучше обратиться к специализированным механизмам, таким как функции модуля ЗарплатаКадрыСоставПоказателей. Прямое суммирование всех строк регистра начислений может "задвоить" суммы, если у сотрудника есть несколько действующих начислений одновременно или если одно начисление перекрывает другое в течение месяца.
Рассмотрев все варианты, мы можем сделать следующие выводы для оптимизации вашей обработки:
Показатель, используя ссылки на объекты, а не строковые сравнения.ВНУТРЕННЕЕ СОЕДИНЕНИЕ с виртуальными таблицами СрезПоследних. Правильнее сначала получить список сотрудников во временную таблицу, а затем соединять ее с данными регистров.КадровыйУчет, ЗарплатаКадрыОбщиеНаборыДанных). Это сократит ваш код в несколько раз и сделает его профессиональным.В архиве у сотрудника, чтобы не заполнять таблицу уволенными людьми, если это не требуется по задаче.Применяя эти подходы, вы создадите надежный инструмент для работы с кадровыми данными, который будет корректно обрабатывать тарифные ставки и игнорировать ненужные процентные показатели.