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