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