При разработке кастомных отчетов, обработок или интеграций в программе 1С:Зарплата и управление персоналом 3.1 (ЗУП) программисты часто сталкиваются с задачей получения актуального размера оклада сотрудника на определенную дату. Ситуация усложняется, если в организации ведется штатное расписание и регулярно проводится индексация заработка. Простые запросы к регистру сведений ПлановыеНачисления в этом случае перестают возвращать корректные данные.
В этой статье мы подробно разберем, почему стандартные регистры плановых начислений не содержат информацию об изменении оклада после индексации, изучим архитектуру хранения этих данных в ЗУП 3.1, а также рассмотрим рекомендуемые разработчиками 1С программные методы получения тарифных ставок.
Разберем причину, которая часто вводит в заблуждение начинающих разработчиков. При открытии регистра сведений ПлановыеНачисления после проведения документов индексации мы можем обнаружить, что по конкретному сотруднику там присутствует всего одна запись — например, созданная документом Прием на работу. Почему так происходит?
Логика платформы 1С:ЗУП 3.1 строится на строгом разделении самого планового начисления и его числовых показателей:
Оплата по окладу, и оно не отменялось, то в этом регистре будет зафиксирована всего одна запись на дату приема. Сама сумма оклада здесь не хранится.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный или его неинтервальный аналог) отвечают за хранение числовых значений. Оклад — это показатель (обычно с идентификатором ТарифнаяСтавка или Оклад). При индексации или плановом изменении оклада меняется именно значение этого показателя, поэтому новая запись создается в регистрах показателей, а в плановых начислениях никаких новых движений не происходит.Именно поэтому прямые запросы к регистру плановых начислений не позволяют получить актуальную сумму оклада после индексации заработка.
Для исключения ошибок при последующих обновлениях конфигурации разработчики «1С» настоятельно рекомендуют отказаться от прямых запросов к таблицам баз данных и использовать готовые функции общих модулей. Самым надежным инструментом является программный интерфейс модуля КадровыйУчет.
Рассмотрим подробнее, как применить функцию КадровыеДанныеСотрудников для получения актуального оклада (тарифной ставки) и планового ФОТ на текущую дату.
Для этого мы можем использовать следующий пример кода:
// Формируем массив сотрудников, по которым нужно получить данные
СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(ВыбранныйСотрудник);
// Задаем список необходимых полей
// Поле "ТарифнаяСтавка" возвращает актуальный размер оклада с учетом всех индексаций
КадровыеДанные = "ТарифнаяСтавка, ФОТ, ОсновноеНачисление, ПоказатьТарифнуюСтавку";
// Вызываем программный интерфейс кадрового учета
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(Истина, СписокСотрудников, КадровыеДанные, ТекущаяДата());
Если ТаблицаДанных.Количество() > 0 Тогда
СтрокаДанных = ТаблицаДанных[0];
ТекущийОклад = СтрокаДанных.ТарифнаяСтавка;
ТекущийФОТ = СтрокаДанных.ФОТ;
Отказ = Ложь; // Обработка успешного получения
КонецЕсли;
Преимущество этого метода заключается в том, что система сама анализирует всю цепочку кадровых документов, индексаций, тарифных групп и временных переводов, предоставляя вам гарантированно верный итоговый результат на указанную дату.
Еще один рабочий способ быстро получить данные в коде — использовать специализированный метод общего модуля КадровыйУчетРасширенный. Данный метод удобен, когда требуется получить не просто общую ставку, а весь спектр действующих начислений сотрудника с детализацией по показателям.
Разберем по шагам, как выглядит вызов этого метода:
ТекущаяДатаАнализа = ТекущаяДата();
ТекущиеДанныеОплатыТруда = КадровыйУчетРасширенный.ТекущиеНачисленияСотрудника(Сотрудник, ТекущаяДатаАнализа,,);
Стоит учитывать нюанс: этот метод возвращает данные в виде структуры (или соответствия), где ключом является ссылка на сотрудника, а значением — таблица его актуальных плановых начислений со всеми показателями. Этот способ отлично подходит для точечного анализа начислений в специализированных формах.
Если вам необходимо получить оклад сотрудника внутри собственного сложного запроса (например, для построения отчета на СКД), выполнять левые соединения с периодическими регистрами сведений напрямую крайне не рекомендуется. Это приводит к значительному падению производительности и потенциальным ошибкам при наличии документов «совмещение» или «временный перевод».
Для решения этой задачи в запросах мы можем использовать механизм временных таблиц, предоставляемый общим модулем КадровыйУчет. Проанализируем алгоритм реализации:
Сотрудник и Период). Назовем ее ВТСотрудникиПериоды.
// Подготавливаем описатель временных таблиц
ОписательВТ = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(МенеджерВременныхТаблиц, "ВТСотрудникиПериоды");
// Вызываем заполнение кадровых данных (оклад и ФОТ)
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательВТ, Истина, "ТарифнаяСтавка, ФОТ");
После выполнения данного кода в вашем менеджере временных таблиц появится готовая заполненная таблица с именем ВТКадровыеДанныеСотрудников. Вы можете легко связать её через ЛЕВОЕ СОЕДИНЕНИЕ со своими основными таблицами в последующих пакетах запроса по полям Сотрудник и Период.
Выясним причину, по которой оклады сотрудников могут не обновляться в программе даже после изменения штатного расписания. В ЗУП 3.1 ведение штатного расписания и расчет зарплаты сотрудников — это два связанных, но раздельных процесса:
Если данные документы не были проведены, то показатели сотрудников в регистре ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный останутся прежними, и любые программные методы (включая функции общего модуля КадровыйУчет) будут возвращать старый доиндексационный оклад.
Таким образом, для получения корректного оклада на текущую дату всегда используйте функции общего модуля КадровыйУчет.КадровыеДанныеСотрудников, избегайте прямых запросов к периодическим регистрам показателей и контролируйте своевременное проведение документов изменения плановых начислений сотрудникам при любых изменениях штатного расписания.