Как получить город из адреса организации или контрагента в 1С:Управление торговлей 11.4?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей
← На главную

Извлечение наименования города из адресной информации организации или контрагента является частой задачей в системах 1С:Предприятие. В конфигурации 1С:Управление торговлей 11.4 (УТ 11.4) адреса хранятся не просто как произвольные текстовые строки, а в структурированном виде, что значительно упрощает программный доступ к отдельным компонентам адреса, таким как город, улица или дом. Однако могут возникать ситуации, когда адрес представлен в неструктурированном формате, требующем иного подхода.

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

Подход 1: Извлечение города из структурированного адреса (JSON/XML)

В большинстве современных конфигураций 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;
    КонецЕсли;
    
    Возврат Город;
    
КонецФункции

Теперь давайте пошагово разберем, как работает эта функция и какие принципы она использует:

  1. Входной параметр и его проверка:
    • Функция принимает параметр Адрес, который может быть строкой (JSON/XML) или уже разобранной структурой.
    • Мы проверяем ТипЗнч(Адрес). Если это строка, начинается процесс её преобразования. Если это уже структура, мы сразу переходим к извлечению данных.
    • Если передана пустая строка, функция сразу возвращает пустую строку, избегая лишних преобразований.
    • В случае, если тип параметра не соответствует ожидаемому (ни строка, ни структура), функция вызывает исключение, сообщая об ошибке.
  2. Преобразование XML в JSON:
    • Современные механизмы контактной информации в 1С предпочитают формат JSON. Однако, в некоторых случаях, адрес может быть сохранен в устаревшем формате XML.
    • Мы используем функцию УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Адрес) для определения, является ли строка XML-представлением адреса.
    • Если это XML, тогда строка преобразуется в JSON с помощью УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес). Это стандартизирует формат для дальнейшей обработки.
  3. Разбор JSON-строки в структуру полей:
    • Ключевым шагом является преобразование JSON-строки адреса в удобочитаемую структуру с полями. За это отвечает функция УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес).
    • Эта функция возвращает стандартную структуру, которая содержит различные компоненты адреса в отдельных полях, таких как:
      • Адрес.Area (Название региона)
      • Адрес.AreaType (Тип региона, например, "область")
      • Адрес.City (Название города)
      • Адрес.CityType (Тип города, например, "г.")
      • Адрес.Locality (Название населенного пункта, если это не город)
      • Адрес.LocalityType (Тип населенного пункта, например, "пос.")
      • Адрес.District (Название района)
      • Адрес.DistrictType (Тип района, например, "р-н")
      • и другие поля (улица, дом, индекс и т.д.).
  4. Определение города и населенного пункта:
    • После получения структуры мы можем напрямую обращаться к нужным полям.
    • Города федерального значения: Сначала проверяем, является ли регион городом федерального значения (например, Москва, Санкт-Петербург, Севастополь). Для этого используется функция РаботаСАдресами.ЭтоГородФедеральногоЗначения(Регион). Если это так, возвращаем наименование региона как город.
    • Основной город: Если поле Адрес.City заполнено, мы формируем полное наименование города, добавляя его тип (например, "г. Ростов-на-Дону").
    • Населенный пункт: Если поле Адрес.City не заполнено (что означает, что адрес находится не в городе, а, например, в поселке или деревне), функция пытается вывести населенный пункт. Она собирает полный путь к населенному пункту, включая регион, район и само наименование населенного пункта с его типом. Например: "Ростовская область, Азовский р-н, пос. Овощной".

Эта функция является мощным инструментом для работы с адресами, так как она использует стандартные механизмы 1С и учитывает особенности адресной системы.

Подход 2: Обработка неструктурированных (произвольных) адресных строк

Бывают случаи, когда адрес хранится в виде произвольной текстовой строки, которая не соответствует формату JSON или XML. Это может произойти при импорте данных из внешних систем, ручном вводе без использования адресного классификатора или в старых конфигурациях. В таких ситуациях приведенная выше функция работать не будет, и нам потребуется другой подход.

Использование функций Библиотеки стандартных подсистем (БСП)

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

Для работы с такими адресами вам могут понадобиться:

  1. Актуальный адресный классификатор: Убедитесь, что в вашей базе данных загружены и актуализированы данные ГАР (ФИАС). Это критически важно для корректного распознавания адресных компонентов.
  2. Функции разбора адресов: В модулях УправлениеКонтактнойИнформацией и РаботаСАдресами БСП есть методы, которые могут попытаться разобрать произвольную строку. Например, может существовать функция, которая на основе строки адреса пытается получить структуру полей, подобную той, что используется в первом подходе.
  3. Сервисы проверки и форматирования адресов 1С: В БСП предусмотрена интеграция с интернет-сервисами 1С, например, через функциональность 1С:Контрагент. Эти сервисы могут по произвольной строке адреса определить его компоненты, исправить ошибки, дополнить недостающие данные и вернуть стандартизированное представление. После получения стандартизированного адреса, вы сможете использовать подходы, описанные в разделе 1, для извлечения города.

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

Интеграция с внешними геокодирующими сервисами

В случаях, когда адресная строка сильно загрязнена, содержит ошибки, или внутренние средства 1С не справляются с её разбором, оптимальным решением может стать обращение к внешним геокодирующим сервисам. Эти сервисы специализируются на разборе и стандартизации адресных данных, предоставляя высокоточную информацию. Для автоматического разбора и заполнения таких данных в 1С можно использовать расширение для интеграции с сервисом DaData.ru.

Наиболее популярные сервисы для этих целей:

  1. DaData.ru: (Как упоминается в сообщениях 6 и 8) Один из наиболее популярных сервисов для стандартизации и обогащения данных. DaData предоставляет API, через которое можно отправить произвольную строку адреса и получить структурированный ответ с разложенными по компонентам адресом, включая город, регион, улицу и даже координаты.
  2. Яндекс.Карты API / Google Maps API: (Упоминается в сообщении 7) Эти сервисы также предоставляют геокодирующие API, позволяющие преобразовывать текстовые адреса в географические координаты и наоборот. В ответе обычно содержится структурированная информация о компонентах адреса.

Механизм работы с внешними сервисами обычно следующий:

  1. Формирование HTTP-запроса: Мы отправляем HTTP-запрос на API внешнего сервиса, передавая ему строку адреса в качестве параметра.
  2. Получение ответа: Сервис возвращает ответ, как правило, в формате JSON или XML, который содержит структурированные данные о распознанном адресе.
  3. Парсинг ответа: Нам потребуется написать код для разбора (парсинга) полученного JSON/XML ответа и извлечения из него нужной информации, в данном случае — наименования города или ближайшего населенного пункта.

Важный момент: Интеграция с внешними сервисами требует навыков работы с HTTP-запросами в 1С (объекты HTTPЗапрос, HTTPСоединение, JSONЧтение) и понимания структуры ответов конкретного API. Многие такие сервисы имеют ограничения на количество бесплатных запросов или требуют оплату за использование.

Общие рекомендации и важные моменты

При работе с адресами и извлечении города, рекомендуем учитывать следующие аспекты:

  1. Приоритет использования стандартных механизмов: Всегда старайтесь максимально использовать встроенные средства 1С и функции БСП. Они наиболее надежны, поддерживаются разработчиком и интегрированы в систему.
  2. Актуальность адресных данных: Для корректной работы с адресами через БСП критически важна актуальность загруженного Государственного адресного реестра (ГАР/ФИАС). Регулярно обновляйте эти данные.
  3. Обработка случаев без города: Не каждый адрес расположен в городе. Многие организации и контрагенты могут находиться в поселках, деревнях, селах. Важно, чтобы ваша логика могла корректно идентифицировать и выводить ближайший по иерархии населенный пункт, если поле "Город" отсутствует. Функция из первого подхода прекрасно справляется с этой задачей, используя поля Адрес.Locality и Адрес.District.
  4. Производительность: Массовая обработка большого количества неструктурированных адресов через внешние геокодирующие сервисы может занимать значительное время и создавать нагрузку на сеть. Планируйте такую обработку в фоновом режиме или в нерабочее время.
  5. Лицензирование и ограничения внешних сервисов: Большинство внешних сервисов имеют ограничения на количество бесплатных запросов в сутки/месяц, а для промышленного использования могут потребовать платную подписку. Обязательно ознакомьтесь с условиями использования выбранного сервиса.
  6. Качество исходных данных: Чем чище и полнее исходная строка адреса, тем выше вероятность успешного и точного распознавания города любым из методов.

Таким образом, для надежного получения города из адреса в УТ 11.4 следует максимально использовать встроенные механизмы БСП, работать со структурированными данными адреса и, при необходимости, прибегать к внешним геокодирующим сервисам для обработки самых сложных и неструктурированных случаев.

← На главную