Как программно получить подразделение сотрудника и способ отражения в бухучете в 1С:ЗУП 3.1?

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

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

Почему нельзя обращаться к кадровым регистрам напрямую?

В редакциях ЗУП 3.0 и 3.1 архитектура хранения кадровой истории существенно отличается от предыдущих платформ (например, ЗУП 2.5). Кадровая история хранится с использованием интервальных регистров, структуры которых периодически оптимизируются разработчиками 1С. Прямые запросы к регистрам типа КадроваяИсторияСотрудников или КадроваяИсторияСотрудниковИнтервальный не рекомендуются по следующим причинам:

  1. Нестабильность структуры: В новых релизах конфигурации фирма 1С может изменить состав измерений и ресурсов, разнести данные по разным регистрам или переименовать их. Прямой запрос перестанет работать после очередного обновления.
  2. Гарантия обратной совместимости API: Разработчики 1С гарантируют неизменность параметров процедур и функций программного интерфейса (публичных общих модулей). Вызовы экспортных функций из модуля КадровыйУчет будут корректно работать и в будущих релизах.
  3. Сложная логика среза дат: Учет периодов, переведенных сотрудников и совместителей требует учета множества нюансов, которые уже заложены внутри стандартных функций программы.

Метод 1. Использование экспортной функции «КадровыйУчет.КадровыеДанныеСотрудников»

Рассмотрим основной способ получения данных для массива сотрудников на определенную дату. Для этого используется экспортная функция общего модуля КадровыйУчет.КадровыеДанныеСотрудников(). Сформируем массив сотрудников, передадим список запрашиваемых полей через запятую и дату среза данных.

Разберем пример кода на языке 1С:


ТолькоРазрешенные = Истина;
ДатаСреза = ТекущаяДата();

// Задаем список запрашиваемых полей через запятую
СтрокаПолей = "Подразделение, СпособОтраженияЗарплатыВБухучете";

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

// Получаем таблицу значений с кадровыми данными
ТаблицаКадровыхДанных = КадровыйУчет.КадровыеДанныеСотрудников(
    ТолькоРазрешенные, 
    МассивСотрудников, 
    СтрокаПолей, 
    ДатаСреза
);

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

Если требуется получить данные только по одному конкретному сотруднику, можно использовать аналогичную функцию КадровыйУчет.КадровыеДанныеСотрудника(), которая возвращает не таблицу значений, а удобную структуру с результатами.

Особенности работы со способом отражения в бухучете

При запросе поля СпособОтраженияЗарплатыВБухучете важно понимать логику его хранения в ЗУП 3.1:

Метод 2. Получение кадровых данных во временную таблицу в Запросе

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


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

// Создаем во временной таблице "ВТКадровыеДанныеСотрудников" нужные данные
КадровыйУчет.СоздатьНаДатуВТКадровыеДанныеСотрудников(
    МенеджерВТ,
    Истина, // ТолькоРазрешенные
    МассивСотрудников,
    "Подразделение, СпособОтраженияЗарплатыВБухучете",
    ДатаСреза
);

// Далее используем МенеджерВТ в своем запросе
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ВТ.Сотрудник КАК Сотрудник,
    |	ВТ.Подразделение КАК Подразделение,
    |	ВТ.СпособОтраженияЗарплатыВБухучете КАК СпособОтражения
    |ИЗ
    |	ВТКадровыеДанныеСотрудников КАК ВТ";

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

Метод 3. Использование механизма кадровых данных в отчетах на СКД

Посмотрим, как правильно разрабатывать собственные отчеты в Схеме компоновки данных (СКД). Чтобы отчет оставался работоспособным при обновлениях, не следует запрашивать физические таблицы регистров. В тексте запроса набора данных СКД указываются виртуальные таблицы-представления, например Представления_КадровыеДанныеСотрудников.

Затем в модуле объекта отчета в процедуре ПриКомпоновкеРезультата добавляется вызов универсального обработчика источников данных:


Процедура ПриКомпоновкеРезультата(ИнициализаторМакета, СхемаКомпоновки, Настройки, КомпоновщикМакета, МакетКомпоновки, ВыполняемаяИнициализация)
    
    // Функция подменяет таблицы-представления на актуальные алгоритмы выборки
    ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);
    
КонецПроцедуры

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

← На главную