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