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