Как программно получить адрес сотрудника по отдельным полям в 1С:ЗУП 3.1?

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

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

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

Способ 1. Разбор через методы подсистемы «Работа с адресами»

В табличной части КонтактнаяИнформация справочника ФизическиеЛица хранятся поля Представление (строка для пользователя) и ЗначенияПолей (служебная XML- или JSON-строка, содержащая все реквизиты адреса из классификатора ФИАС/ГАР/КЛАДР). Для преобразования строки ЗначенияПолей в структурированные данные используются методы общего модуля РаботаСАдресами и АдресныйКлассификатор.

Рассмотрим пример кода, в котором выполняется получение адреса и извлечение его составных частей:


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

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

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ЗначенияПолей = Выборка.ЗначенияПолей;
    
    // Если адрес заполнен старым форматом или строкой, приводим его к XML при необходимости
    Если Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ЗначенияПолей) Тогда
        ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(
            Выборка.Представление, 
            Перечисления.ТипыКонтактнойИнформации.Адрес
        );
    КонецЕсли;
    
    // Получаем структуру полей адреса
    СтруктураПолей = РаботаСАдресами.АдресВФорматеКЛАДР(ЗначенияПолей);
    КодыАдреса = АдресныйКлассификатор.КодыАдреса(ЗначенияПолей);
    
    // Извлечение конкретных реквизитов
    Город  = СтруктураПолей.Город;
    Улица  = СтруктураПолей.Улица;
    Дом    = СтруктураПолей.Дом;
    Корпус = СтруктураПолей.Корпус;
    Кв     = СтруктураПолей.Квартира;
    
    Если ЗначениеЗаполнено(КодыАдреса.КодКЛАДР) Тогда
        КодКЛАДР = Формат(КодыАдреса.КодКЛАДР, "ЧЦ=21; ЧГ=0");
    КонецЕсли;
КонецЕсли;

Способ 2. Использование универсальной функции «РаботаСАдресами.СведенияОбАдресе»

В современных релизах конфигураций на базе БСП для разбора как старых (XML), так и новых (JSON ФИАС/ГАР) форматов хранения предусмотрена универсальная функция РаботаСАдресами.СведенияОбАдресе. Она избавляет от необходимости вручную проверять тип формата строки.

Посмотрим на пример работы с этим методом:


// ЗначенияПолей получены из ТЧ КонтактнаяИнформация или через модуль УправлениеКонтактнойИнформацией
АдреснаяСтрока = Выборка.ЗначенияПолей;

ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПолучатьКоды", Истина);

СведенияОбАдресе = РаботаСАдресами.СведенияОбАдресе(АдреснаяСтрока, ДополнительныеПараметры);

// СведенияОбАдресе содержит поля:
// Индекс, Регион, Город, НаселенныйПункт, Улица, Дом, Корпус, Строение, Квартира и т.д.
ИндексСотрудника = СведенияОбАдресе.Индекс;
ГородСотрудника  = СведенияОбАдресе.Город;
УлицаСотрудника  = СведенияОбАдресе.Улица;
НомерДома        = СведенияОбАдресе.Дом;

Для точечного получения отдельных элементов (например, только субъекта РФ или только населенного пункта) можно также использовать специализированные функции БСП: РаботаСАдресами.ГородАдресаКонтактнойИнформации(Адрес) и РаботаСАдресами.РегионАдресаКонтактнойИнформации(Адрес).

Способ 3. Пакетное получение данных через механизмы кадрового учета

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

Разберем последовательность действий для пакетной обработки:

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

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

МассивПолей = Новый Массив;
МассивПолей.Добавить("АдресПоПропискеВнутреннееЗначение");
МассивПолей.Добавить("АдресПоПропискеПредставление");

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

Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
    Если ЗначениеЗаполнено(СтрокаДанных.АдресПоПропискеВнутреннееЗначение) Тогда
        Сведения = РаботаСАдресами.СведенияОбАдресе(СтрокаДанных.АдресПоПропискеВнутреннееЗначение);
        // Доступ к полям: Сведения.Город, Сведения.Улица, Сведения.Дом
    КонецЕсли;
КонецЦикла;

Важные рекомендации при работе с адресами

  1. Не используйте разбор строкового представления через запятые: порядок следования элементов адреса зависит от страны (РФ или иностранный адрес), наличия муниципальных делений, районов и строений. Ручной парсинг через СтрЗаменить приводит к смещению реквизитов.
  2. Избегайте вызовов получения КИ в цикле: функции вида УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта выполняют отдельный запрос к базе на каждом шаге. При массовой обработке списка сотрудников следует использовать УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов или методы модуля КадровыйУчет.
  3. Учитывайте неструктурированный ввод: если пользователь внес адрес вручную в виде произвольного текста без сопоставления с классификатором ФИАС/ГАР, поля дома, улицы и города в структуре могут остаться пустыми. В таком случае доступно только общее строковое представление адреса.
← На главную