Как правильно получить номер телефона сотрудника в ЗУП 3.1 запросом?

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

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

Разбор причин отсутствия данных

Основная сложность заключается в архитектуре хранения контактной информации в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП). Рассмотрим ключевые моменты, которые необходимо учитывать:

  1. Разделение справочников: В системе есть два отдельных справочника — Сотрудники и ФизическиеЛица. Справочник Сотрудники хранит данные о трудовой деятельности, а контактная информация (телефоны, почта, адреса) жестко привязана к ФизическомуЛицу. Прямое обращение к контактной информации через ссылку на сотрудника не сработает — нужно переходить к его физическому лицу.
  2. Структура табличной части: Табличная часть КонтактнаяИнформация является универсальной. В ней хранятся записи всех типов (телефоны, адреса, email). Чтобы найти номер телефона, необходимо в запросе фильтровать данные не только по владельцу, но и по типу контактной информации.

Вариант 1: Использование запроса к табличной части

Если вы все же предпочитаете использовать классический Запрос, важно правильно выстроить связь. Рассмотрим пример того, как это должно выглядеть программно:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    КонтактнаяИнформация.Представление
    |ИЗ
    |    Справочник.ФизическиеЛица.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |    КонтактнаяИнформация.Ссылка = &ФизическоеЛицо
    |    И КонтактнаяИнформация.Вид = &ВидКонтакта";

// Важно получить ссылку на физлицо, а не на сотрудника
ФизическоеЛицо = СсылкаНаОбъект.Сотрудник.ФизическоеЛицо;
Запрос.УстановитьПараметр("ФизическоеЛицо", ФизическоеЛицо);
Запрос.УстановитьПараметр("ВидКонтакта", Справочники.ВидыКонтактнойИнформации.ТелефонСотрудника);

Важное замечание: При такой схеме мы используем параметр Сотрудник.ФизическоеЛицо. Если вы передаете просто Сотрудника, запрос ничего не найдет.

Вариант 2: Использование типовых методов БСП (Рекомендуемый подход)

Самый правильный и надежный способ работы с контактной информацией — использование функций общего модуля УправлениеКонтактнойИнформацией. Это избавляет вас от необходимости писать сложные запросы, обрабатывать XML-структуры или делать вложенные циклы.

Рассмотрим, как это выглядит в коде:


// Получаем контактную информацию с помощью стандартного метода
// Это предпочтительный путь для любого разработчика
Телефон = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
    СсылкаНаОбъект.Сотрудник.ФизическоеЛицо, 
    Справочники.ВидыКонтактнойИнформации.ТелефонСотрудника
);

// Телефон теперь содержит готовое значение (строку)

Почему использование функций лучше прямого запроса?

Разберем преимущества использования методов БСП перед запросами:

В ходе анализа мы выяснили, что попытки обхода данных через многократные вложенные циклы в ТабличнойЧасти являются крайне трудоемким и неоптимальным решением. Старайтесь всегда использовать Сотрудник.ФизическоеЛицо при обращении к персональным данным и отдавайте приоритет типовым методам, предоставляемым платформой и библиотеками 1С.

← На главную