К статье
Практический материал

Разработка и Конфигурация · 11 мин

1С: как получить индекс из адреса

Как в 1С получить почтовый индекс из адреса: через адресный классификатор (ФИАС/ГАР), функции БСП, запрос к регистру и готовые примеры кода для разработчика.

Почтовый индекс в 1С хранится внутри контактной информации — вместе с регионом, городом, улицей и домом. Извлечь его можно несколькими способами: через стандартные функции Библиотеки стандартных подсистем (БСП), через адресный классификатор ФИАС/ГАР или простым разбором строки, если адрес представлен текстом. Выбор зависит от того, где хранится адрес и в каком формате.

Типичная ситуация: нужно вывести индекс в печатную форму, передать его в обмен с транспортной компанией или проверить корректность заполнения адреса контрагента. Во всех этих случаях данные уже есть в базе — задача сводится к правильному их извлечению.

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

Где в 1С хранится индекс

В типовых конфигурациях (УТ, ERP, БП, ЗУП) адреса контрагентов, организаций и физических лиц хранятся в табличной части «КонтактнаяИнформация». Визуально пользователь видит представление адреса строкой, но физически в базе лежат два поля: «Представление» (читаемый текст) и «Значение» (служебная структура в формате JSON или XML, в зависимости от версии БСП).

Именно в поле «Значение» находится структурированный адрес: тип адреса, страна, регион, город, улица, дом и отдельное поле с индексом. Разбирать «Представление» строковыми функциями — плохая практика: формат вывода может меняться, и код сломается при обновлении конфигурации.

Получение индекса через функции БСП

Основной и рекомендуемый способ — модуль «УправлениеКонтактнойИнформацией» (в некоторых версиях — «РаботаСАдресами»). Функция СведенияОбАдресе() принимает значение адреса (JSON или XML) и возвращает структуру, где среди прочих полей есть «Индекс».

Запрос = Новый Запрос(

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Контрагент,

| КонтрагентыКИ.Значение КАК ЗначениеАдреса

|ИЗ

| Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКИ

|ГДЕ

| КонтрагентыКИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)");

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

Индекс = Сведения.Индекс;

Сообщить(Строка(Выборка.Контрагент) + ": " + Индекс);

КонецЦикла;

Если нужно получить сразу все адреса объекта с представлениями, удобнее функция КонтактнаяИнформацияОбъекта() — она возвращает таблицу, где для каждой строки есть и представление, и значение, которое дальше передаётся в СведенияОбАдресе().

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

Порядок действий
  1. 1
    Найдите нужную строку в табличной части «КонтактнаяИнформация» по виду адреса (юридический, фактический, почтовый)
  2. 2
    Прочитайте поле «Значение» — там JSON или XML со структурой адреса
  3. 3
    Передайте значение в УправлениеКонтактнойИнформацией.СведенияОбАдресе()
  4. 4
    Заберите поле «Индекс» из возвращённой структуры
  5. 5
    Проверьте, что индекс не пустой — поле может быть не заполнено

Получение индекса в запросе без кода

Если задача — вывести индекс в отчёт на СКД или в динамический список, разбирать JSON в запросе нельзя. Здесь два варианта. Первый — использовать представление адреса и вычисляемое поле: индекс в представлении обычно идёт в начале строки до первой запятой, поэтому его можно вырезать функциями языка запросов:

ВЫБРАТЬ

КИ.Представление КАК Адрес,

ВЫБОР

КОГДА ПОДСТРОКА(КИ.Представление, 7, 1) = ","

ТОГДА ПОДСТРОКА(КИ.Представление, 1, 6)

ИНАЧЕ ""

КОНЕЦ КАК Индекс

ИЗ

Справочник.Контрагенты.КонтактнаяИнформация КАК КИ

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

Второй вариант надёжнее: в схеме компоновки данных добавить вычисляемое поле и заполнить его на событии «ПриКомпоновкеРезультата» через ту же функцию СведенияОбАдресе(). Это требует кода, но даёт корректные данные для любых адресов.

Извлечение индекса из произвольной строки адреса

Когда адрес хранится простой строкой (например, загружен из Excel или пришёл из внешней системы), структурированных полей нет. В этом случае индекс ищется как шестизначная цифровая последовательность. В типовых механизмах БСП для разбора строки есть функция УправлениеКонтактнойИнформацией.АдресПоСтроке() в новых версиях, но простой вариант — собственный перебор:

Функция ИндексИзСтроки(СтрокаАдреса)

Части = СтрРазделить(СтрокаАдреса, ",");

Для Каждого Часть Из Части Цикл

Фрагмент = СокрЛП(Часть);

Если СтрДлина(Фрагмент) = 6

И СтрЧислоВхождений("0123456789", Лев(Фрагмент,1)) > 0 Тогда

ЭтоЧисло = Истина;

Для Поз = 1 По 6 Цикл

Если СтрНайти("0123456789", Сред(Фрагмент, Поз, 1)) = 0 Тогда

ЭтоЧисло = Ложь; Прервать;

КонецЕсли;

КонецЦикла;

Если ЭтоЧисло Тогда

Возврат Фрагмент;

КонецЕсли;

КонецЕсли;

КонецЦикла;

Возврат "";

КонецФункции

У строкового способа есть ограничение: шестизначное число может оказаться не индексом, а, например, номером квартиры в нестандартной записи. Поэтому результат обязательно проверяется — лучше всего через адресный классификатор.

Проверка и получение индекса через адресный классификатор

Адресный классификатор (ФИАС/ГАР) в типовых конфигурациях загружается в информационную базу через раздел «Администрирование — Интернет-поддержка и сервисы — Адресный классификатор». Если классификатор загружен, модуль «РаботаСАдресами» позволяет проверить адрес и получить по нему индекс:

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

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

Если РезультатПроверки.ЕстьОшибки Тогда

// адрес не найден в классификаторе — индексу доверять нельзя

КонецЕсли;

Обратная задача — найти индекс по известному адресу — решается через подбор адреса по классификатору: функции поиска возвращают найденные варианты вместе с индексами. Это полезно при массовой загрузке контрагентов, когда индексы во входных данных отсутствуют.

Учтите: классификатор требует периодического обновления, иначе новые улицы и переименованные объекты не будут находиться. Если интернет-поддержка не подключена, классификатор можно загрузить из файлов, полученных с официального источника ФНС.

Сравнение вариантов

СведенияОбАдресе() из БСП

Точный и безопасный способ для типовых конфигураций; требует наличия БСП и заполненного поля «Значение»

Разбор представления в запросе

Быстро для отчётов без кода, но работает только при стандартном формате вывода

Разбор произвольной строки

Единственный вариант для неструктурированных данных; требует обязательной проверки результата

Адресный классификатор ФИАС/ГАР

Даёт проверенный индекс и находит его по адресу; требует загрузки и обновления классификатора

Типичные ошибки и ограничения

Самая частая ошибка — попытка вытащить индекс из поля «Представление» в коде через СтрНайти() и Лев(). Пока формат вывода стандартный, это работает, но после обновления БСП или смены настроек представления адреса код начинает возвращать пустую строку или мусор, причём ошибка проявляется не сразу.

Вторая ошибка — игнорирование пустого значения. Если пользователь ввёл адрес вручную без индекса, поле «Индекс» в структуре будет пустым, и передача его в печатную форму или обмен без проверки приведёт к документам с незаполненным реквизитом.

Третья — использование устаревших данных КЛАДР. Формат КЛАДР снят с поддержки, и адреса, введённые на его основе, могут не проходить проверку по ГАР. При миграции старых баз адреса стоит прогнать через штатную обработку проверки контактной информации.

Типичные ошибки
01
Разбор представления адреса строковыми функциями — код ломается при смене формата вывода
02
Отсутствие проверки на пустой индекс — в печатных формах и обменах появляются пустые реквизиты
03
Принятие любого шестизначного числа за индекс без проверки по классификатору
04
Использование устаревшего классификатора — новые адреса не находятся, индексы не определяются

Как проверить результат

После внедрения кода проверьте его на трёх группах данных: адреса, введённые через стандартный диалог ввода (структурированные); адреса, загруженные из внешних источников строкой; и адреса, перенесённые из старых версий или других программ. Для каждой группы результат должен быть осмысленным: шесть цифр либо явная пустая строка с понятным поведением дальше.

Контрольная точка — сверка с классификатором: адрес, для которого получен индекс, должен проходить штатную проверку без ошибок. Если проверка сообщает о несоответствии, индекс из непроверенного адреса использовать нельзя.

Контрольные точки

Как проверить результат

Формат индекса
Норма

Ровно шесть цифр

Тревожный признак

Пусто, буквы, другое количество символов

Проверка адреса по классификатору
Норма

Адрес найден, ошибок нет

Тревожный признак

Адрес не найден или есть расхождения

Поведение при пустом поле
Норма

Код явно обрабатывает пустой индекс

Тревожный признак

Пустое значение молча уходит в документы

Частые вопросы

Что делать, если функции УправлениеКонтактнойИнформацией нет в конфигурации?

Значит, конфигурация не использует БСП или использует очень старую её версию. Разберите значение адреса вручную: если это JSON — через ЧтениеJSON, если XML — через ЧтениеXML. Структура полей описана в документации к формату контактной информации.

Почему СведенияОбАдресе возвращает пустой индекс, хотя в представлении он есть?

Чаще всего адрес был введён «в свободной форме» — одной строкой, без заполнения структурированных полей. В этом случае индекс существует только в тексте представления, и его придётся извлекать разбором строки либо попросить пользователя ввести адрес заново через стандартный диалог.

Можно ли получить индексы сразу для всех контрагентов?

Да. Выгрузите запросом значения адресов из табличной части контактной информации, в цикле прогоните их через СведенияОбАдресе() и запишите результат в таблицу значений или регистр. Для больших объёмов выполняйте операцию в фоновом задании, чтобы не блокировать работу пользователей.

Как получить индекс, если известен только город и улица?

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

Работает ли этот подход для иностранных адресов?

Частично. Структура адреса БСП поддерживает иностранные адреса, но поле индекса там заполняется по правилам соответствующей страны и может содержать буквы. Адресный классификатор ФИАС/ГАР покрывает только адреса России, поэтому проверка иностранных адресов через него невозможна.

Итог

Что важно запомнить

Индекс в типовых 1С хранится в структурированном значении адреса (JSON/XML) и извлекается функцией УправлениеКонтактнойИнформацией.СведенияОбАдресе(). Разбор строки-представления — запасной вариант для неструктурированных данных, требующий проверки по адресному классификатору. Всегда обрабатывайте ситуацию с пустым индексом и держите классификатор обновлённым.