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