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