При разработке печатных форм, таких как личная карточка Т-2 или специфические кадровые приказы, часто возникает задача вывести почтовый индекс отдельно, а остальную часть адреса — без него. Начинающие разработчики часто сталкиваются с проблемой: при попытке "разобрать" строку адреса стандартными функциями данные перемешиваются. Например, если в адресе отсутствует район или корпус, в поле Индекс может ошибочно попасть название страны или города.
В этой статье мы подробно разберем, почему возникает эта ошибка и как правильно использовать механизмы Библиотеки стандартных подсистем (БСП) для работы с контактной информацией.
Разберем ситуацию, представленную в обсуждении. Разработчик пытается использовать следующий код:
АдресПоПрописке = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(СсылкаНаОбъект.ФизическоеЛицо,
Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица,, ТекущаяДата());
СтруктураАдреса = РаботаСАдресами.СведенияОбАдресе(АдресПоПрописке);
ПараметрИндекс = СтруктураАдреса.Индекс;
Причина неудачи: Функция ПредставлениеКонтактнойИнформацииОбъекта возвращает уже готовую "человекочитаемую" строку (например, "123456, г. Москва, ул. Ленина, д. 1"). В то же время функция РаботаСАдресами.СведенияОбАдресе (и аналогичные ей) ожидает на вход внутренний формат хранения адреса (XML или JSON).
Когда вы передаете обычную строку в парсер, предназначенный для структурированных данных, он пытается угадать части адреса по разделителям. Если каких-то полей не хватает, алгоритм "сдвигается", и вы получаете некорректные данные. Чтобы этого избежать, нам нужно работать не с текстом, а с данными из хранилища.
Рассмотрим наиболее надежный метод. Вместо получения готового представления мы запросим у системы структурированные данные объекта. Проанализируем правильный алгоритм:
Значение, которое содержит адрес в формате XML или JSON.Посмотрим на пример кода:
// 1. Получаем структуру данных контактной информации
ВидАдреса = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
ДанныеКИ = УправлениеКонтактнойИнформацией.ДанныеКонтактнойИнформацииОбъекта(СсылкаНаОбъект.ФизическоеЛицо, ВидАдреса);
// 2. Проверяем, есть ли данные
Если ДанныеКИ <> Неопределено Тогда
// Поле "Значение" содержит XML/JSON
ЗначениеАдреса = ДанныеКИ.Значение;
// 3. Разбираем структурированный адрес
СтруктураАдреса = РаботаСАдресами.СведенияОбАдресе(ЗначениеАдреса);
// Теперь индекс будет получен гарантированно правильно
Индекс = СтруктураАдреса.Индекс;
// Для получения адреса без индекса можно воспользоваться функцией БСП
АдресБезИндекса = РаботаСАдресами.ПредставлениеАдреса(ЗначениеАдреса, Ложь);
КонецЕсли;
В современных версиях ЗУП 3.1 (на базе БСП) существуют еще более простые методы. Если нам нужно именно представление без индекса, мы можем использовать функцию ПредставлениеАдресаБезИндекса.
Выясним, как это реализовать на практике:
// Получаем структурированное значение (XML/JSON) из регистра или объекта
ЗначениеАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаОбъект.ФизическоеЛицо, ВидАдреса, ТекущаяДата());
// Получаем индекс отдельно
Индекс = РаботаСАдресами.ИндексИзАдреса(ЗначениеАдреса);
// Получаем всё остальное без индекса
АдресТекст = УправлениеКонтактнойИнформацией.ПредставлениеАдресаБезИндекса(ЗначениеАдреса);
Важный нюанс: Функция ПредставлениеАдресаБезИндекса корректно обрабатывает пустые поля. Даже если в адресе нет улицы или региона, она не "сломается", так как работает с четко определенными полями структуры XML/JSON, а не просто удаляет первые 6 цифр из строки.
Проанализируем ситуацию, когда программист решает просто отрезать первые символы от строки представления. Это плохая практика по нескольким причинам:
Использование методов УправлениеКонтактнойИнформацией гарантирует, что программа обращается к первичным данным, которые хранятся в базе в строго типизированном виде.
Для решения задачи в печатной форме (например, аналог Т-2) выполните следующие шаги:
ЗначенияПолей таблицы КонтактнаяИнформация), а не результат функции Представление....РаботаСАдресами.СведенияОбАдресе() для получения структуры, из которой легко забрать Структура.Индекс.РаботаСАдресами.ПредставлениеАдреса(Значение, Ложь), где второй параметр Ложь как раз отвечает за подавление вывода индекса в итоговой строке.Таким образом, ваш код станет надежным, устойчивым к отсутствию отдельных адресных элементов и будет полностью соответствовать стандартам разработки на платформе 1С:Предприятие 8.3.