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

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

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

Как программно получить страну из адреса в 1С: работа с КЛАДР/ФИАС, функции РаботаСАдресами, разбор строки адреса, примеры кода и типичные ошибки.

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

Ниже разобраны основные сценарии: получение страны через модуль «РаботаСАдресами», разбор XML-структуры контактной информации, обработка адресов в свободной форме и особенности работы с адресным классификатором (ФИАС/ГАР). Примеры кода приведены для управляемых форм и подходят для конфигураций на базе БСП — УТ 11, ERP, Бухгалтерия 3.0, ЗУП 3.1.

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

В типовых конфигурациях адреса хранятся в табличной части «КонтактнаяИнформация» справочников (контрагенты, партнёры, физические лица, организации) и дублируются в одноимённом регистре сведений. Физически адрес лежит в поле «ЗначенияПолей» — это XML-строка в формате «Контактная информация» (XDTO-пакет), а для новых версий БСП дополнительно в поле «Значение» в формате JSON.

Страна — отдельный элемент этой структуры. В XML она представлена элементом Страна с атрибутом Значение, например: <Страна Значение="РОССИЯ"/>. Остальные части адреса (регион, город, улица) хранятся внутри элемента Состав. Это важно: страна не входит в иерархию адресного классификатора, поэтому искать её по кодам ФИАС бессмысленно.

Получение страны через модуль «РаботаСАдресами»

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

bsl
АдресXML = Контрагент.КонтактнаяИнформация[0].ЗначенияПолей;
Сведения = РаботаСАдресами.СведенияОбАдресе(АдресXML);
Страна = Сведения.Страна;          // "РОССИЯ"
КодСтраны = Сведения.КодСтраны;   // "643"

Если адрес хранится просто как строковое представление («Россия, г. Москва, ул. Ленина, д. 1»), функция тоже справится — она попытается распознать строку. Но качество распознавания зависит от загруженного адресного классификатора: без него часть полей может остаться пустой, а страна определится только если явно присутствует в строке.

Для контактной информации объектов удобнее идти через УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта() — получаете таблицу адресов, а затем для нужной строки вызываете разбор.

Разбор XML контактной информации вручную

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

bsl
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ЗначенияПолей);
Пока ЧтениеXML.Прочитать() Цикл
    Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента
       И ЧтениеXML.Имя = "Страна" Тогда
        Страна = ЧтениеXML.ПолучитьАтрибут("Значение");
        Прервать;
    КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();

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

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

Адреса, введённые «как текст» без привязки к классификатору, — самый проблемный случай. Если строка пришла из внешней системы (сайт, Excel, обмен), у неё может вообще не быть структуры. Здесь есть три подхода.

Первый — попытаться распознать строку через РаботаСАдресами.СведенияОбАдресе: если в строке есть слово «Россия», «Республика Беларусь» и т.п., функция обычно корректно заполнит поле страны. Второй — сопоставить начало строки со справочником «Страны мира»: перебрать страны и проверить вхождение наименования в начало адреса. Третий — для массовой обработки использовать сервисы нормализации адресов (например, через HTTP-запросы), но это требует передачи данных во внешний сервис.

Порядок действий для строкового адреса
  1. 1
    Проверьте, является ли значение структурой XML/JSON (начинается с "<" или "{"), или обычной строкой
  2. 2
    Для XML/JSON вызовите РаботаСАдресами.СведенияОбАдресе() и прочитайте поле «Страна»
  3. 3
    Для свободной строки попробуйте ту же функцию — она распознает страну по тексту
  4. 4
    Если страна не определилась — сопоставьте начало строки со справочником «Страны мира»
  5. 5
    При пустом результате подставьте страну по умолчанию из настроек программы

Страна в адресном классификаторе и справочнике «Страны мира»

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

Связь работает так: в структуре адреса хранится наименование страны и её код по ОКСМ (например, «643» для России). По этому коду можно найти элемент справочника «Страны мира» и получить дополнительные реквизиты — полное наименование, код альфа-2 (RU), код альфа-3 (RUS), признак участника ЕАЭС. Это нужно, например, для документов ВЭД или отчётности по экспорту.

bsl
Запрос = Новый Запрос(
"ВЫБРАТЬ Ссылка, Наименование, КодАльфа2
|ИЗ Справочник.СтраныМира
|ГДЕ Код = &КодОКСМ");
Запрос.УстановитьПараметр("КодОКСМ", Сведения.КодСтраны);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    СтранаСсылка = Выборка.Ссылка;
КонецЕсли;

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

Самая распространённая ошибка — попытка извлечь страну из представления адреса функциями СтрНайти и Лев. Представление формируется по шаблону и зависит от настроек: страна может быть в начале, в конце или вообще не выводиться для адресов внутри основной страны. Такой парсинг ломается при первом же нестандартном адресе.

Вторая ошибка — чтение поля «ЗначенияПолей» напрямую в запросе с последующим разбором строки в запросе. Запросы не умеют работать с XML; правильная схема — выбрать значения, затем в цикле разобрать каждое программно. Для крупных выборок это медленно, поэтому для отчётов лучше заранее материализовать страну в отдельный реквизит или регистр.

Типичные ошибки
01
Парсинг представления адреса строковыми функциями — ломается на адресах без страны в представлении
02
Поиск страны в адресном классификаторе ФИАС — страны там нет, классификатор охватывает только РФ
03
Игнорирование пустого поля «Страна» — для адресов РФ оно часто пустое, нужно подставлять страну по умолчанию
04
Разбор XML в запросе через ПОДСТРОКА — запросы не работают с XML, разбор делается в коде после выборки
05
Использование устаревшего поля «ЗначенияПолей» без проверки — в новых БСП основное хранилище может быть в поле «Значение» (JSON)

Проверка результата и производительность

После реализации проверьте разбор на реальных данных: возьмите выборку контрагентов с адресами разных типов — российский адрес по ФИАС, иностранный адрес, адрес в свободной форме, адрес с пустой страной. Для каждого случая результат должен быть осмысленным: либо корректная страна, либо явно подставленное значение по умолчанию.

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

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

Адрес РФ по классификатору
Норма

Страна = «РОССИЯ», код 643

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

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

Иностранный адрес
Норма

Страна из структуры адреса, код по ОКСМ заполнен

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

Страна определяется как Россия

Адрес свободной строкой
Норма

Страна распознана или явно помечена как неопределённая

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

Молчаливое подставление России без проверки

Скорость обработки 1000 адресов
Норма

Разбор занимает секунды

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

Каждый адрес разбирается запросом к БД в цикле

По производительности: функция СведенияОбАдресе при распознавании свободных строк обращается к адресному классификатору, что в массовых операциях даёт заметную нагрузку. Если нужно только прочитать уже структурированный XML — это быстро. Если требуется распознавание тысяч строк — делайте это в фоновом задании и сохраняйте результат.

Итог

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

Страна — отдельное поле структуры адреса БСП, а не часть классификатора ФИАС. Получайте её через РаботаСАдресами.СведенияОбАдресе() или разбором XML, обрабатывайте пустое значение как страну по умолчанию и никогда не парсите представление адреса строковыми функциями.

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

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

Напрямую в запросе — никак: адрес хранится как XML/JSON-строка, а язык запросов не умеет разбирать эти форматы. Выберите поле «ЗначенияПолей» (или «Значение») запросом, а затем в цикле разберите каждое значение через РаботаСАдресами.СведенияОбАдресе(). Если страна нужна в отчётах постоянно, добавьте отдельный реквизит и заполняйте его при записи адреса.

Почему у российских адресов поле «Страна» пустое?

В типовых конфигурациях для адресов основной страны поле может не заполняться — экономится место и упрощается ввод. Пустое значение трактуется как страна по умолчанию из настроек программы (константа «Основная страна» в БСП). Перед использованием в обменах и печатных формах подставляйте её явно.

Чем отличаются поля «ЗначенияПолей» и «Значение» в контактной информации?

«ЗначенияПолей» — устаревший формат XML, «Значение» — актуальный формат JSON в новых версиях БСП. Оба поля могут сосуществовать для совместимости. Функции БСП сами определяют формат, поэтому при использовании штатных механизмов разница не важна; при ручном разборе проверяйте, какое поле заполнено.

Как получить код страны по ОКСМ или код альфа-2?

Код ОКСМ возвращается в поле «КодСтраны» структуры, которую даёт СведенияОбАдресе(). По этому коду найдите элемент справочника «Страны мира» — там доступны реквизиты «КодАльфа2» (например, RU) и «КодАльфа3» (RUS), а также полное наименование страны.

Что делать, если конфигурация без БСП (самописная)?

Разберите XML встроенными средствами платформы: ЧтениеXML с поиском элемента «Страна» и чтением атрибута «Значение», либо загрузку через XDTO с фабрикой пакета контактной информации. Для адресов-строк без структуры остаётся только сопоставление текста со справочником стран.

Можно ли определить страну по индексу?

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