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

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

При разработке печатных форм, таких как личная карточка Т-2 или специфические кадровые приказы, часто возникает задача вывести почтовый индекс отдельно, а остальную часть адреса — без него. Начинающие разработчики часто сталкиваются с проблемой: при попытке "разобрать" строку адреса стандартными функциями данные перемешиваются. Например, если в адресе отсутствует район или корпус, в поле Индекс может ошибочно попасть название страны или города.

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

Анализ основной ошибки: Представление vs Структурированные данные

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


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

Причина неудачи: Функция ПредставлениеКонтактнойИнформацииОбъекта возвращает уже готовую "человекочитаемую" строку (например, "123456, г. Москва, ул. Ленина, д. 1"). В то же время функция РаботаСАдресами.СведенияОбАдресе (и аналогичные ей) ожидает на вход внутренний формат хранения адреса (XML или JSON).

Когда вы передаете обычную строку в парсер, предназначенный для структурированных данных, он пытается угадать части адреса по разделителям. Если каких-то полей не хватает, алгоритм "сдвигается", и вы получаете некорректные данные. Чтобы этого избежать, нам нужно работать не с текстом, а с данными из хранилища.

Правильный способ №1: Получение данных через структуру КИ

Рассмотрим наиболее надежный метод. Вместо получения готового представления мы запросим у системы структурированные данные объекта. Проанализируем правильный алгоритм:

  1. Получаем данные контактной информации в виде структуры.
  2. Извлекаем поле Значение, которое содержит адрес в формате XML или JSON.
  3. Используем это значение для получения детальных сведений.

Посмотрим на пример кода:


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

// 2. Проверяем, есть ли данные
Если ДанныеКИ <> Неопределено Тогда
    // Поле "Значение" содержит XML/JSON
    ЗначениеАдреса = ДанныеКИ.Значение;
    
    // 3. Разбираем структурированный адрес
    СтруктураАдреса = РаботаСАдресами.СведенияОбАдресе(ЗначениеАдреса);
    
    // Теперь индекс будет получен гарантированно правильно
    Индекс = СтруктураАдреса.Индекс;
    
    // Для получения адреса без индекса можно воспользоваться функцией БСП
    АдресБезИндекса = РаботаСАдресами.ПредставлениеАдреса(ЗначениеАдреса, Ложь);
КонецЕсли;

Правильный способ №2: Использование специализированных функций БСП

В современных версиях ЗУП 3.1 (на базе БСП) существуют еще более простые методы. Если нам нужно именно представление без индекса, мы можем использовать функцию ПредставлениеАдресаБезИндекса.

Выясним, как это реализовать на практике:


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

// Получаем индекс отдельно
Индекс = РаботаСАдресами.ИндексИзАдреса(ЗначениеАдреса);

// Получаем всё остальное без индекса
АдресТекст = УправлениеКонтактнойИнформацией.ПредставлениеАдресаБезИндекса(ЗначениеАдреса);

Важный нюанс: Функция ПредставлениеАдресаБезИндекса корректно обрабатывает пустые поля. Даже если в адресе нет улицы или региона, она не "сломается", так как работает с четко определенными полями структуры XML/JSON, а не просто удаляет первые 6 цифр из строки.

Почему не стоит использовать "ручной" разбор строки

Проанализируем ситуацию, когда программист решает просто отрезать первые символы от строки представления. Это плохая практика по нескольким причинам:

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

Резюме для реализации в печатной форме

Для решения задачи в печатной форме (например, аналог Т-2) выполните следующие шаги:

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

Таким образом, ваш код станет надежным, устойчивым к отсутствию отдельных адресных элементов и будет полностью соответствовать стандартам разработки на платформе 1С:Предприятие 8.3.

← На главную