Куда пропало поле ТекущаяДолжностьПоШтатномуРасписанию в ЗУП 3.1 и как теперь получать эти данные

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

В процессе обновления редакций 1С:Зарплата и управление персоналом 3.1 (начиная с версии 3.1.13 и выше) многие разработчики столкнулись с тем, что привычное поле ТекущаяДолжностьПоШтатномуРасписанию исчезло из ресурсов регистра сведений ТекущиеКадровыеДанныеСотрудников. Это изменение вызвало немало вопросов, так как старые запросы и отчеты перестали работать. В данной статье мы подробно разберем, почему это произошло, куда переместились данные и какими методами теперь следует пользоваться для получения актуальной информации о должности сотрудника.

Причина изменений и архитектурный подход

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

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

Способ 1: Использование метода КадровыеДанныеСотрудников

Это самый правильный и рекомендуемый способ получения данных. Вместо написания тяжелых запросов к виртуальным таблицам СрезПоследних, мы воспользуемся функцией общего модуля. Разберем на примере, как получить должность сотрудника:


// Определим список сотрудников и необходимых полей
СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(СсылкаНаСотрудника);

НужныеПоля = "ТекущаяДолжность, ТекущаяПозицияШтатногоРасписания, ТекущаяДолжностьПоШтатномуРасписанию";

// Вызываем метод кадрового учета
ДанныеСотрудников = КадровыйУчет.КадровыеДанныеСотрудников(Ложь, СписокСотрудников, НужныеПоля);

// Обрабатываем результат
Для Каждого СтрокаДанных Из ДанныеСотрудников Цикл
    Должность = СтрокаДанных.ТекущаяДолжность;
    ПозицияШР = СтрокаДанных.ТекущаяПозицияШтатногоРасписания;
    // Поле ТекущаяДолжностьПоШтатномуРасписанию всё еще доступно через API для совместимости
    ДолжностьПоШР = СтрокаДанных.ТекущаяДолжностьПоШтатномуРасписанию;
КонецЦикла;

Важно отметить, что даже если поля нет физически в регистре, метод КадровыеДанныеСотрудников умеет собирать эти данные «на лету» из связанных таблиц. Это обеспечивает обратную совместимость вашего кода.

Способ 2: Работа через Позицию штатного расписания

Проанализируем новую структуру данных. Теперь в регистре ТекущиеКадровыеДанныеСотрудников основным связующим звеном является ТекущаяПозицияШтатногоРасписания. Если нам нужно получить именно ту должность, которая прописана в штатном расписании, мы должны обращаться к реквизитам этой позиции.

Рассмотрим, как это выглядит в логике программы:

  1. У сотрудника есть ссылка на ТекущаяПозицияШтатногоРасписания (тип СправочникСсылка.ШтатноеРасписание).
  2. Внутри справочника ШтатноеРасписание есть реквизит Должность.

Следовательно, в запросе или коде путь будет выглядеть так: ТекущиеКадровыеДанныеСотрудников.ТекущаяПозицияШтатногоРасписания.Должность. Это гарантирует получение актуальной информации согласно действующему штатному расписанию организации.

Способ 3: Формирование временных таблиц в запросах

Если вам необходимо получить данные массово для сложного отчета, использование функций в цикле будет неэффективным. В ЗУП 3 существует мощный инструмент для работы внутри запросов — создание временных таблиц кадровых данных. Выясним, как применить этот метод.

Мы можем использовать процедуру КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников. Она создаст в вашем менеджере временных таблиц таблицу с именем ВТКадровыеДанныеСотрудников, в которой будут все необходимые поля на определенную дату.


МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

// Параметры: МенеджерВТ, ОписаниеПолей, МассивСотрудников, ДатаСреза
Поля = "ТекущаяДолжность, ТекущаяПозицияШтатногоРасписания";
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(МенеджерВТ, Истина, Поля);

Запрос.Текст = 
    "ВЫБРАТЬ
    |	КадровыеДанные.Сотрудник,
    |	КадровыеДанные.ТекущаяДолжность,
    |	КадровыеДанные.ТекущаяПозицияШтатногоРасписания.Должность КАК ДолжностьПоШР
    |ИЗ
    |	ВТКадровыеДанныеСотрудников КАК КадровыеДанные";

Результат = Запрос.Выполнить().Выгрузить();

Этот метод является наиболее производительным и "безопасным" с точки зрения обновлений конфигурации, так как он учитывает все внутренние механизмы 1С:ЗУП, включая периоды действия записей и настройки функциональных опций.

Проверка настроек функциональных опций

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

Проверьте следующий путь в интерфейсе:

Настройка — Кадровый учет — Настройка штатного расписания.

Если флаг "Ведется штатное расписание" снят, то обращение к ТекущаяПозицияШтатногоРасписания всегда будет возвращать пустую ссылку. В этом случае следует использовать только общее поле Должность из кадровой истории.

Резюме для разработчика

Подведем итог нашему исследованию:

  1. Не ищите поле в регистре: Оно действительно удалено для оптимизации в новых версиях 3.1.
  2. Используйте API: Метод КадровыйУчет.КадровыеДанныеСотрудников — ваш главный инструмент.
  3. Соблюдайте иерархию: Получайте должность через ТекущаяПозицияШтатногоРасписания.Должность, если штатное расписание ведется.
  4. Оптимизируйте запросы: Для отчетов используйте временные таблицы, создаваемые через программный модуль КадровыйУчет.

Следуя этим рекомендациям, вы обеспечите стабильную работу своих доработок в 1С:ЗУП 3.1, независимо от дальнейших изменений структуры метаданных вендором.

← На главную