Как вытащить адрес проживания из справочника ФизическиеЛица в ЗУП 3.1

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

При разработке отчетов или печатных форм в программе 1С:Зарплата и Управление Персоналом 3.1 часто возникает необходимость программно получить контактную информацию сотрудника, например, адрес его проживания или прописки. Несмотря на кажущуюся простоту задачи, начинающие разработчики часто сталкиваются с тем, что запрос возвращает пустой результат или работает некорректно. В этой статье мы подробно разберем, как правильно извлекать эти данные, проанализируем типичные ошибки и рассмотрим наиболее профессиональные способы решения задачи с использованием встроенного программного интерфейса (API) системы.

Разбор типичной ошибки: Сотрудник vs Физическое лицо

Первая и самая распространенная причина, по которой запрос не возвращает данные, — это путаница между справочниками Сотрудники и ФизическиеЛица. Проанализируем структуру: в ЗУП 3.1 контактная информация (адреса, телефоны, email) хранится в табличной части справочника ФизическиеЛица. Справочник Сотрудники является лишь кадровой оболочкой, которая ссылается на конкретное физическое лицо.

Рассмотрим ситуацию: если вы передаете в запрос параметр СсылкаНаОбъект, который является ссылкой на справочник Сотрудники, и пытаетесь сопоставить его с полем Ссылка или Наименование в справочнике ФизическиеЛица, запрос не найдет совпадений. Выясним, как это исправить в тексте запроса.


// Неправильно: передаем Сотрудника в запрос к Физлицам
Запрос.УстановитьПараметр("ФизическиеЛица", СсылкаНаСотрудника); 

// Правильно: получаем ссылку на Физлицо перед выполнением запроса
Запрос.УстановитьПараметр("ФизическиеЛица", СсылкаНаСотрудника.ФизическоеЛицо);

Метод 1: Получение адреса через прямой запрос

Если нам необходимо составить запрос вручную, важно правильно обратиться к табличной части КонтактнаяИнформация. Рассмотрим пример рабочего запроса, который извлекает представление адреса проживания.


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

Проанализируем этот код. Мы обращаемся напрямую к табличной части. Использование ЛЕВОЕ СОЕДИНЕНИЕ со справочником ФизическиеЛица здесь избыточно, если нам нужно просто получить строку адреса для конкретного человека, так как поле Ссылка в табличной части уже указывает на владельца карточки.

Метод 2: Работа через расширения и проблема функции ЗНАЧЕНИЕ()

Иногда при работе в расширениях использование конструкции ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации...) может вызывать ошибки компиляции или возвращать NULL, особенно если вы добавили свой вид контактной информации в расширение. Разберем, как сделать код более универсальным.

Вместо жесткого прописывания значения в тексте запроса, рекомендуется передавать вид контактной информации через параметр. Это гарантирует стабильную работу кода:


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

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

Результат = Запрос.Выполнить();

Метод 3: Использование программного интерфейса (API) ЗУП 3.1

В современных конфигурациях, таких как ЗУП 3.1, ручное написание запросов к контактной информации считается "плохим тоном", если можно воспользоваться типовыми функциями. В системе есть мощный модуль КадровыйУчет, который позволяет получить любые данные сотрудников одной строчкой кода. Изучить возможности API можно в справочнике методов конфигурации Зарплата и кадры 3.1. Это более надежно, так как учитывает права доступа и особенности хранения данных.

Рассмотрим использование функции КадровыеДанныеФизическихЛиц. Она универсальна и подходит для разных задач, включая контроль срока действия паспортов. Выясним, как получить адрес места проживания и адрес по прописке одновременно:


СписокФизЛиц = Новый Массив;
СписокФизЛиц.Добавить(СсылкаНаФизЛицо);

// Формируем список нужных полей
Поля = "АдресМестаПроживанияПредставление, АдресПоПропискеПредставление";

// Получаем таблицу данных
ТаблицаДанных = КадровыйУчет.КадровыеДанныеФизическихЛиц(Истина, СписокФизЛиц, Поля, ТекущаяДата());

Если ТаблицаДанных.Количество() > 0 Тогда
    СтрокаДанных = ТаблицаДанных[0];
    АдресПроживания = СтрокаДанных.АдресМестаПроживанияПредставление;
    АдресПрописки = СтрокаДанных.АдресПоПропискеПредставление;
КонецЕсли;

Преимущества этого метода:

  1. Универсальность: Вам не нужно знать точное имя предопределенного элемента в справочнике ВидыКонтактнойИнформации.
  2. Производительность: Механизмы БСП оптимизированы для массового получения данных.
  3. Безопасность: Функция проверяет права пользователя на просмотр персональных данных, что критично при подготовке формы согласие на обработку персональных данных.

Важные нюансы: Индекс, Город, Улица

Иногда требуется вытащить не всё Представление (целую строку), а отдельные части адреса (индекс, город и т.д.). Помните, что в поле Представление хранится просто текст. Структурированные данные хранятся в поле Поля (в формате XML или JSON). Для их разбора не используйте текстовый поиск! Вместо этого используйте функции общего модуля УправлениеКонтактнойИнформацией.

Например, для получения структуры адреса можно использовать:


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

Если данных нет, обязательно проверьте, заполнен ли адрес в карточке физического лица на вкладке "Адреса, телефоны". Аналогичную проверку стоит сделать, если не формируется список детей сотрудников на новогодние подарки. Часто разработчики ищут ошибку в коде, когда данные просто не внесены пользователем в базу.

Резюме для разработчика

Подведем итог. При решении задачи по получению адреса в ЗУП 3.1:

  1. Всегда проверяйте, что в качестве ссылки вы передаете Физическое лицо, а не Сотрудника.
  2. При написании запросов передавайте Вид контактной информации через параметры.
  3. Для массового получения данных или для чистоты кода используйте функцию КадровыйУчет.КадровыеДанныеФизическихЛиц.
  4. Если нужно представление адреса (строка), используйте суффикс Представление в именах полей API.
← На главную