Извлечение наименования города из адресной информации организации или контрагента является частой задачей в системах 1С:Предприятие. В конфигурации 1С:Управление торговлей 11.4 (УТ 11.4) адреса хранятся не просто как произвольные текстовые строки, а в структурированном виде, что значительно упрощает программный доступ к отдельным компонентам адреса, таким как город, улица или дом. Однако могут возникать ситуации, когда адрес представлен в неструктурированном формате, требующем иного подхода.
Рассмотрим несколько способов получения города из адреса, начиная с наиболее предпочтительного — использования встроенных механизмов и функций Библиотеки стандартных подсистем (БСП), а также альтернативные решения для сложных случаев.
В большинстве современных конфигураций 1С, включая УТ 11.4, адреса организаций и контрагентов хранятся в специальном формате контактной информации, который может быть представлен в виде XML или, что чаще, JSON-строки. Это позволяет программно разобрать адрес на компоненты (страна, регион, город, улица и т.д.) и получить нужную информацию. Если адрес уже хранится в таком виде, мы можем использовать стандартные функции БСП для его обработки.
Давайте рассмотрим подробнее функцию, которая позволяет получить наименование города из такой структурированной строки адреса:
// Функция - Город адреса контактной информации
//
// Параметры:
// Адрес - Адрес в формате JSON или XML (строка) или структура
//
// Возвращаемое значение:
// - наименование города в удобочитаемом формате, к примеру, г. Ростов-на-Дону
//
Функция ГородАдресаКонтактнойИнформации(Знач Адрес)
Если ТипЗнч(Адрес) = Тип("Строка") Тогда
Если ПустаяСтрока(Адрес) Тогда
Возврат "";
КонецЕсли;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Адрес) Тогда
Адрес = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес);
КонецЕсли;
Адрес = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес);
ИначеЕсли ТипЗнч(Адрес) <> Тип("Структура") Тогда
ВызватьИсключение НСтр("ru = 'Невозможно определить город, ожидается адрес.'");
КонецЕсли;
Регион = СокрЛП(Адрес.Area + " " + Адрес.AreaType);
Если РаботаСАдресами.ЭтоГородФедеральногоЗначения(Регион) Тогда
Возврат СокрЛП(Адрес.AreaType + ". " + Адрес.Area);
КонецЕсли;
Если ЗначениеЗаполнено(Адрес.City) Тогда
Город = СокрЛП(Адрес.CityType + ". " + Адрес.City);
ИначеЕсли ЗначениеЗаполнено(Адрес.Locality) Тогда //если не указан город, выводим населенный пункт в формате: Ростовская область, Азовский р-н, пос. Овощной
Город = Регион;
Если ЗначениеЗаполнено(Адрес.District) Тогда
Город = Город + ", " + Адрес.District + ?(ЗначениеЗаполнено(Адрес.DistrictType), " " + Адрес.DistrictType, "");
КонецЕсли;
Город = Город + ", " + ?(ЗначениеЗаполнено(Адрес.LocalityType), Адрес.LocalityType + ". ", "") + Адрес.Locality;
КонецЕсли;
Возврат Город;
КонецФункции
Теперь давайте пошагово разберем, как работает эта функция и какие принципы она использует:
Адрес, который может быть строкой (JSON/XML) или уже разобранной структурой.ТипЗнч(Адрес). Если это строка, начинается процесс её преобразования. Если это уже структура, мы сразу переходим к извлечению данных.УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Адрес) для определения, является ли строка XML-представлением адреса.УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес). Это стандартизирует формат для дальнейшей обработки.УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес).Адрес.Area (Название региона)Адрес.AreaType (Тип региона, например, "область")Адрес.City (Название города)Адрес.CityType (Тип города, например, "г.")Адрес.Locality (Название населенного пункта, если это не город)Адрес.LocalityType (Тип населенного пункта, например, "пос.")Адрес.District (Название района)Адрес.DistrictType (Тип района, например, "р-н")РаботаСАдресами.ЭтоГородФедеральногоЗначения(Регион). Если это так, возвращаем наименование региона как город.Адрес.City заполнено, мы формируем полное наименование города, добавляя его тип (например, "г. Ростов-на-Дону").Адрес.City не заполнено (что означает, что адрес находится не в городе, а, например, в поселке или деревне), функция пытается вывести населенный пункт. Она собирает полный путь к населенному пункту, включая регион, район и само наименование населенного пункта с его типом. Например: "Ростовская область, Азовский р-н, пос. Овощной".Эта функция является мощным инструментом для работы с адресами, так как она использует стандартные механизмы 1С и учитывает особенности адресной системы.
Бывают случаи, когда адрес хранится в виде произвольной текстовой строки, которая не соответствует формату JSON или XML. Это может произойти при импорте данных из внешних систем, ручном вводе без использования адресного классификатора или в старых конфигурациях. В таких ситуациях приведенная выше функция работать не будет, и нам потребуется другой подход.
Библиотека стандартных подсистем (БСП) предоставляет ряд функций для работы с адресами, которые могут помочь в стандартизации и разборе неструктурированных адресных строк. Эти функции стремятся привести произвольную строку адреса к структурированному виду, используя данные Государственного адресного реестра (ГАР), ранее известного как ФИАС/КЛАДР. Для упрощения работы с программным интерфейсом платформы полезно иметь под рукой справочник по методам БСП с примерами кода.
Для работы с такими адресами вам могут понадобиться:
УправлениеКонтактнойИнформацией и РаботаСАдресами БСП есть методы, которые могут попытаться разобрать произвольную строку. Например, может существовать функция, которая на основе строки адреса пытается получить структуру полей, подобную той, что используется в первом подходе.Преимущество использования БСП заключается в том, что это встроенное решение, которое работает в рамках платформы 1С и не требует дополнительных интеграций с внешними системами, при условии, что все необходимые данные и сервисы настроены и доступны.
В случаях, когда адресная строка сильно загрязнена, содержит ошибки, или внутренние средства 1С не справляются с её разбором, оптимальным решением может стать обращение к внешним геокодирующим сервисам. Эти сервисы специализируются на разборе и стандартизации адресных данных, предоставляя высокоточную информацию. Для автоматического разбора и заполнения таких данных в 1С можно использовать расширение для интеграции с сервисом DaData.ru.
Наиболее популярные сервисы для этих целей:
Механизм работы с внешними сервисами обычно следующий:
Важный момент: Интеграция с внешними сервисами требует навыков работы с HTTP-запросами в 1С (объекты HTTPЗапрос, HTTPСоединение, JSONЧтение) и понимания структуры ответов конкретного API. Многие такие сервисы имеют ограничения на количество бесплатных запросов или требуют оплату за использование.
При работе с адресами и извлечении города, рекомендуем учитывать следующие аспекты:
Адрес.Locality и Адрес.District.Таким образом, для надежного получения города из адреса в УТ 11.4 следует максимально использовать встроенные механизмы БСП, работать со структурированными данными адреса и, при необходимости, прибегать к внешним геокодирующим сервисам для обработки самых сложных и неструктурированных случаев.