Как правильно разложить адрес на структуру и получить улицу в 1С:ЗУП 3.1

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

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

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

В чем суть проблемы и почему возникает ошибка?

Рассмотрим классическую ситуацию, с которой столкнулся автор темы. Для получения юридического адреса организации использовался следующий код:


АдресаОрганизаций = УправлениеКонтактнойИнформациейЗарплатаКадры.АдресаОрганизаций(Выборка.Организация);

ОписаниеЮридическогоАдреса = УправлениеКонтактнойИнформациейЗарплатаКадры.АдресОрганизации(
    АдресаОрганизаций, 
    Выборка.Организация, 
    Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации
);

// Попытка разбора, которая возвращает пустую структуру или ошибку:
СтруктураАдресаОрганизации = ЗарплатаКадры.СтруктураАдресаИзXML(
    ОписаниеЮридическогоАдреса.Представление, 
    Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации
);

Улица = СтруктураАдресаОрганизации.Улица;

При выполнении этого кода переменная Улица останется пустой. Проанализируем ситуацию: функция ЗарплатаКадры.СтруктураАдресаИзXML ожидает на вход структурированную XML-строку, содержащую сериализованные данные адреса. Передав в нее ОписаниеЮридическогоАдреса.Представление, мы передаем обычную текстовую строку (например, "123456, г. Москва, ул. Ленина, д. 10"). Естественно, парсер XML не может обработать обычный текст и возвращает пустую структуру адреса.

Решение проблемы: правильный разбор 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. Отказоустойчивость: функция автоматически определяет формат входных данных (XML это, JSON или даже готовый XDTO-объект) и корректно парсит его без падения системы в аварийный режим.
  2. Поддержка ГАР (Государственного адресного реестра): современные адреса могут быть записаны как по административно-территориальному делению, так и по муниципальному. Функция СведенияОбАдресе учитывает эти нюансы и возвращает корректную структуру полей в любом случае.
  3. Дополнительные сведения: структура, возвращаемая модулем, содержит не только текстовые названия, но и коды ФИАС / ГАР (GUID адресных объектов и домов), коды ОКАТО, ОКТМО и почтовые индексы.

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

← На главную