При разработке и кастомизации отчетов или печатных форм в программе «1С:Зарплата и управление персоналом 3.1» часто возникает задача разделения адреса организации или физического лица на отдельные составляющие: индекс, регион, город, улица, дом и офис. Попытки сделать это простым текстовым поиском или разбором строки по запятым быстро приводят к ошибкам, так как адреса могут быть записаны в свободной форме или содержать разное количество элементов.
В этой статье мы подробно разберем, как устроено хранение контактной информации в современных конфигурациях 1С, выясним причину популярной ошибки при разборе адреса и рассмотрим готовые программные методы для получения структуры адреса (включая улицу) как для старых, так и для актуальных релизов ЗУП 3.1.
Рассмотрим классическую ситуацию, с которой столкнулся автор темы. Для получения юридического адреса организации использовался следующий код:
АдресаОрганизаций = УправлениеКонтактнойИнформациейЗарплатаКадры.АдресаОрганизаций(Выборка.Организация);
ОписаниеЮридическогоАдреса = УправлениеКонтактнойИнформациейЗарплатаКадры.АдресОрганизации(
АдресаОрганизаций,
Выборка.Организация,
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации
);
// Попытка разбора, которая возвращает пустую структуру или ошибку:
СтруктураАдресаОрганизации = ЗарплатаКадры.СтруктураАдресаИзXML(
ОписаниеЮридическогоАдреса.Представление,
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации
);
Улица = СтруктураАдресаОрганизации.Улица;
При выполнении этого кода переменная Улица останется пустой. Проанализируем ситуацию: функция ЗарплатаКадры.СтруктураАдресаИзXML ожидает на вход структурированную XML-строку, содержащую сериализованные данные адреса. Передав в нее ОписаниеЮридическогоАдреса.Представление, мы передаем обычную текстовую строку (например, "123456, г. Москва, ул. Ленина, д. 10"). Естественно, парсер XML не может обработать обычный текст и возвращает пустую структуру адреса.
Чтобы успешно получить улицу и другие составляющие адреса, необходимо использовать специальное XML-представление контактной информации. В 1С:ЗУП 3.1 эти данные хранятся в табличной части КонтактнаяИнформация соответствующего объекта (организации, контрагента или физического лица) в реквизите ЗначенияПолей.
Давайте посмотрим на исправленный и полностью рабочий вариант кода:
// Получаем соответствие со всеми адресами организации
АдресаОрганизаций = УправлениеКонтактнойИнформациейЗарплатаКадры.АдресаОрганизаций(Выборка.Организация);
// Извлекаем структуру конкретного юридического адреса
ОписаниеЮридическогоАдреса = УправлениеКонтактнойИнформациейЗарплатаКадры.АдресОрганизации(
АдресаОрганизаций,
Выборка.Организация,
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации
);
// Передаем на разбор именно XML-данные (ЗначенияПолей) вместо Представления!
СтруктураАдресаОрганизации = ЗарплатаКадры.СтруктураАдресаИзXML(
ОписаниеЮридическогоАдреса.ЗначенияПолей,
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации
);
// Теперь мы можем безопасно обращаться к свойствам полученной структуры
Если СтруктураАдресаОрганизации.Свойство("Улица") Тогда
Улица = СтруктураАдресаОрганизации.Улица;
Иначе
Улица = "";
КонецЕсли;
В данном случае свойство ЗначенияПолей содержит валидную XML-сериализованную структуру адреса, сформированную по стандартам ФИАС/ГАР. Функция ЗарплатаКадры.СтруктураАдресаИзXML успешно преобразует этот XML в стандартную структуру 1С, откуда мы можем легко получить Улица, Дом, Корпус, Квартира и другие реквизиты.
Если вы работаете в современных релизах «1С:Зарплата и управление персоналом 3.1» (на базе БСП 3.x), использование конфигурационных функций общего модуля ЗарплатаКадры считается устаревшим подходом (deprecated). Платформа 1С предлагает единый универсальный программный интерфейс для работы с адресами через общий модуль РаботаСАдресами.
Современный механизм поддерживает работу как со старыми XML-структурами (поле ЗначенияПолей), так и с новым форматом JSON (поле Значение), который стал основным для хранения контактной информации.
Разберем по шагам, как получить улицу, используя актуальный программный интерфейс БСП:
// Шаг 1. Получаем данные контактной информации напрямую из табличной части организации
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОрганизацииКонтактнаяИнформация.Значение КАК ЗначениеJSON,
| ОрганизацииКонтактнаяИнформация.ЗначенияПолей КАК ЗначениеXML
|ИЗ
| Справочник.Организации.КонтактнаяИнформация КАК ОрганизацииКонтактнаяИнформация
|ГДЕ
| ОрганизацииКонтактнаяИнформация.Ссылка = &Организация
| И ОрганизацииКонтактнаяИнформация.Вид = &ВидКИ";
Запрос.УстановитьПараметр("Организация", Выборка.Организация);
Запрос.УстановитьПараметр("ВидКИ", Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации);
ВыборкаАдреса = Запрос.Выполнить.Выбрать();
Если ВыборкаАдреса.Следующий() Тогда
// Определяем, какое поле заполнено (в новых релизах приоритет у JSON-строки "Значение")
СтрокаАдреса = ?(ЗначениеЗаполнено(ВыборкаАдреса.ЗначениеJSON), ВыборкаАдреса.ЗначениеJSON, ВыборкаАдреса.ЗначениеXML);
Если ЗначениеЗаполнено(СтрокаАдреса) Тогда
// Шаг 2. Вызываем универсальную функцию БСП для разбора адреса
СведенияОбАдресе = РаботаСАдресами.СведенияОбАдресе(СтрокаАдреса);
// Шаг 3. Извлекаем нужные поля из полученной структуры
Улица = "";
Если СведенияОбАдресе.Свойство("Улица") Тогда
Улица = СведенияОбАдресе.Улица; // Например: "Ленина"
КонецЕсли;
ТипУлицы = "";
Если СведенияОбАдресе.Свойство("УлицаТип") Тогда
ТипУлицы = СведенияОбАдресе.УлицаТип; // Например: "ул"
КонецЕсли;
// Формируем красивое представление улицы с типом
ПредставлениеУлицы = СокрЛП(ТипУлицы + " " + Улица);
КонецЕсли;
КонецЕсли;
Использование современного API РаботаСАдресами предоставляет разработчику целый ряд преимуществ:
СведенияОбАдресе учитывает эти нюансы и возвращает корректную структуру полей в любом случае.Таким образом, для решения проблемы разбора адреса на структуру в конфигурации 1С:ЗУП 3.1 всегда следует использовать структурированные форматы хранения КИ (XML/JSON) из полей ЗначенияПолей или Значение, полностью отказавшись от попыток парсинга обычного строкового представления.