Разработка и Конфигурация · 10 мин
Как получить страну из адреса в 1С
Как программно получить страну из адреса в 1С: работа с КЛАДР/ФИАС, функции РаботаСАдресами, разбор строки адреса, примеры кода и типичные ошибки.
Адрес в типовых конфигурациях 1С хранится не как простая строка, а как структурированное значение: в формате XML (JSON в новых версиях БСП) внутри контактной информации. Поэтому «вытащить страну» простым поиском подстроки нельзя — нужно либо использовать штатные функции Библиотеки стандартных подсистем (БСП), либо корректно разобрать структуру адреса. Выбор способа зависит от того, где хранится адрес: в регистре «Контактная информация», в строковом реквизите или приходит из внешнего источника.
Ниже разобраны основные сценарии: получение страны через модуль «РаботаСАдресами», разбор XML-структуры контактной информации, обработка адресов в свободной форме и особенности работы с адресным классификатором (ФИАС/ГАР). Примеры кода приведены для управляемых форм и подходят для конфигураций на базе БСП — УТ 11, ERP, Бухгалтерия 3.0, ЗУП 3.1.
Где в 1С хранится страна в адресе
В типовых конфигурациях адреса хранятся в табличной части «КонтактнаяИнформация» справочников (контрагенты, партнёры, физические лица, организации) и дублируются в одноимённом регистре сведений. Физически адрес лежит в поле «ЗначенияПолей» — это XML-строка в формате «Контактная информация» (XDTO-пакет), а для новых версий БСП дополнительно в поле «Значение» в формате JSON.
Страна — отдельный элемент этой структуры. В XML она представлена элементом Страна с атрибутом Значение, например: <Страна Значение="РОССИЯ"/>. Остальные части адреса (регион, город, улица) хранятся внутри элемента Состав. Это важно: страна не входит в иерархию адресного классификатора, поэтому искать её по кодам ФИАС бессмысленно.
Получение страны через модуль «РаботаСАдресами»
Самый надёжный способ — функция СведенияОбАдресе общего модуля РаботаСАдресами (в новых версиях БСП — РаботаСАдресамиКлиентСервер для части операций). Она принимает адрес в виде строки XML/JSON или представления и возвращает структуру со всеми полями, включая страну и её код по ОКСМ.
АдресXML = Контрагент.КонтактнаяИнформация[0].ЗначенияПолей;
Сведения = РаботаСАдресами.СведенияОбАдресе(АдресXML);
Страна = Сведения.Страна; // "РОССИЯ"
КодСтраны = Сведения.КодСтраны; // "643"Если адрес хранится просто как строковое представление («Россия, г. Москва, ул. Ленина, д. 1»), функция тоже справится — она попытается распознать строку. Но качество распознавания зависит от загруженного адресного классификатора: без него часть полей может остаться пустой, а страна определится только если явно присутствует в строке.
Для контактной информации объектов удобнее идти через УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта() — получаете таблицу адресов, а затем для нужной строки вызываете разбор.
Разбор XML контактной информации вручную
Если БСП в конфигурации нет (самописная или сильно доработанная база), XML можно разобрать встроенными средствами платформы через ЧтениеXML или через XDTO. Это даёт полный контроль, но требует аккуратности с пространствами имён.
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ЗначенияПолей);
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента
И ЧтениеXML.Имя = "Страна" Тогда
Страна = ЧтениеXML.ПолучитьАтрибут("Значение");
Прервать;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();Учтите, что у старых адресов (введённых до перехода на ФИАС) структура может отличаться: вместо элемента «Страна» страна может быть указана внутри «Состав» или отсутствовать вовсе — тогда подразумевается страна по умолчанию (обычно Россия, задаётся в настройках программы).
Получение страны из адреса в свободной форме
Адреса, введённые «как текст» без привязки к классификатору, — самый проблемный случай. Если строка пришла из внешней системы (сайт, Excel, обмен), у неё может вообще не быть структуры. Здесь есть три подхода.
Первый — попытаться распознать строку через РаботаСАдресами.СведенияОбАдресе: если в строке есть слово «Россия», «Республика Беларусь» и т.п., функция обычно корректно заполнит поле страны. Второй — сопоставить начало строки со справочником «Страны мира»: перебрать страны и проверить вхождение наименования в начало адреса. Третий — для массовой обработки использовать сервисы нормализации адресов (например, через HTTP-запросы), но это требует передачи данных во внешний сервис.
- 1Проверьте, является ли значение структурой XML/JSON (начинается с "<" или "{"), или обычной строкой
- 2Для XML/JSON вызовите РаботаСАдресами.СведенияОбАдресе() и прочитайте поле «Страна»
- 3Для свободной строки попробуйте ту же функцию — она распознает страну по тексту
- 4Если страна не определилась — сопоставьте начало строки со справочником «Страны мира»
- 5При пустом результате подставьте страну по умолчанию из настроек программы
Страна в адресном классификаторе и справочнике «Страны мира»
Частая путаница: разработчики ищут страну в адресном классификаторе (ФИАС/ГАР). Классификатор содержит только территории одной страны — России. Страны хранятся отдельно, в справочнике «Страны мира», который заполняется по ОКСМ (Общероссийский классификатор стран мира) при первоначальном заполнении ИБ.
Связь работает так: в структуре адреса хранится наименование страны и её код по ОКСМ (например, «643» для России). По этому коду можно найти элемент справочника «Страны мира» и получить дополнительные реквизиты — полное наименование, код альфа-2 (RU), код альфа-3 (RUS), признак участника ЕАЭС. Это нужно, например, для документов ВЭД или отчётности по экспорту.
Запрос = Новый Запрос(
"ВЫБРАТЬ Ссылка, Наименование, КодАльфа2
|ИЗ Справочник.СтраныМира
|ГДЕ Код = &КодОКСМ");
Запрос.УстановитьПараметр("КодОКСМ", Сведения.КодСтраны);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтранаСсылка = Выборка.Ссылка;
КонецЕсли;Типичные ошибки и ограничения
Самая распространённая ошибка — попытка извлечь страну из представления адреса функциями СтрНайти и Лев. Представление формируется по шаблону и зависит от настроек: страна может быть в начале, в конце или вообще не выводиться для адресов внутри основной страны. Такой парсинг ломается при первом же нестандартном адресе.
Вторая ошибка — чтение поля «ЗначенияПолей» напрямую в запросе с последующим разбором строки в запросе. Запросы не умеют работать с XML; правильная схема — выбрать значения, затем в цикле разобрать каждое программно. Для крупных выборок это медленно, поэтому для отчётов лучше заранее материализовать страну в отдельный реквизит или регистр.
Проверка результата и производительность
После реализации проверьте разбор на реальных данных: возьмите выборку контрагентов с адресами разных типов — российский адрес по ФИАС, иностранный адрес, адрес в свободной форме, адрес с пустой страной. Для каждого случая результат должен быть осмысленным: либо корректная страна, либо явно подставленное значение по умолчанию.
Как проверить результат
Страна = «РОССИЯ», код 643
Пустая страна без подстановки значения по умолчанию
Страна из структуры адреса, код по ОКСМ заполнен
Страна определяется как Россия
Страна распознана или явно помечена как неопределённая
Молчаливое подставление России без проверки
Разбор занимает секунды
Каждый адрес разбирается запросом к БД в цикле
По производительности: функция СведенияОбАдресе при распознавании свободных строк обращается к адресному классификатору, что в массовых операциях даёт заметную нагрузку. Если нужно только прочитать уже структурированный XML — это быстро. Если требуется распознавание тысяч строк — делайте это в фоновом задании и сохраняйте результат.
Что важно запомнить
Страна — отдельное поле структуры адреса БСП, а не часть классификатора ФИАС. Получайте её через РаботаСАдресами.СведенияОбАдресе() или разбором XML, обрабатывайте пустое значение как страну по умолчанию и никогда не парсите представление адреса строковыми функциями.
Частые вопросы
Как получить страну из адреса в запросе 1С?
Напрямую в запросе — никак: адрес хранится как XML/JSON-строка, а язык запросов не умеет разбирать эти форматы. Выберите поле «ЗначенияПолей» (или «Значение») запросом, а затем в цикле разберите каждое значение через РаботаСАдресами.СведенияОбАдресе(). Если страна нужна в отчётах постоянно, добавьте отдельный реквизит и заполняйте его при записи адреса.
Почему у российских адресов поле «Страна» пустое?
В типовых конфигурациях для адресов основной страны поле может не заполняться — экономится место и упрощается ввод. Пустое значение трактуется как страна по умолчанию из настроек программы (константа «Основная страна» в БСП). Перед использованием в обменах и печатных формах подставляйте её явно.
Чем отличаются поля «ЗначенияПолей» и «Значение» в контактной информации?
«ЗначенияПолей» — устаревший формат XML, «Значение» — актуальный формат JSON в новых версиях БСП. Оба поля могут сосуществовать для совместимости. Функции БСП сами определяют формат, поэтому при использовании штатных механизмов разница не важна; при ручном разборе проверяйте, какое поле заполнено.
Как получить код страны по ОКСМ или код альфа-2?
Код ОКСМ возвращается в поле «КодСтраны» структуры, которую даёт СведенияОбАдресе(). По этому коду найдите элемент справочника «Страны мира» — там доступны реквизиты «КодАльфа2» (например, RU) и «КодАльфа3» (RUS), а также полное наименование страны.
Что делать, если конфигурация без БСП (самописная)?
Разберите XML встроенными средствами платформы: ЧтениеXML с поиском элемента «Страна» и чтением атрибута «Значение», либо загрузку через XDTO с фабрикой пакета контактной информации. Для адресов-строк без структуры остаётся только сопоставление текста со справочником стран.
Можно ли определить страну по индексу?
Нет, это ненадёжно. Почтовые индексы разных стран могут пересекаться по диапазонам, а формат индекса в структуре адреса не привязан к стране программно. Индекс — вспомогательное поле внутри адреса уже известной страны, а не способ её определения.