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

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

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

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

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

Рассмотрим пошагово этот процесс:

  1. Сначала мы запрашиваем саму контактную информацию (в данном случае — юридический адрес) для конкретной организации.
  2. Проверяем, заполнена ли информация, чтобы избежать ошибок при попытке обращения к пустым данным.
  3. Разбираем полученное значение в структуру СведенияОбАдресе.
  4. Выделяем город из этой структуры.

Посмотрим на пример кода, реализующий эту логику:


// СсылкаНаОрганизацию - ссылка на справочник Организации
// Получаем таблицу контактной информации
ДанныеАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаОрганизацию, Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации, ТекущаяДатаСеанса, Ложь);

Если ДанныеАдреса.Количество() = 0 Тогда 
    // Если адрес не заполнен, возвращаем пустую строку
    Возврат ""; 
КонецЕсли;

// Преобразуем строковое представление адреса в структуру
СтруктураАдреса = РаботаСАдресами.СведенияОбАдресе(ДанныеАдреса[0].Значение); 

// Пытаемся получить наименование города через специализированную функцию
Город = РаботаСАдресами.ГородАдресаКонтактнойИнформации(ДанныеАдреса[0].Значение);

Важный момент: Функция РаботаСАдресами.ГородАдресаКонтактнойИнформации хорошо работает, если в адресе явно указан город в классическом понимании (например, "г. Самара"). Однако в случае с Москвой или Севастополем результат может оказаться неожиданным.

Способ 2: Обработка городов федерального значения

Выясним причину, по которой стандартные функции иногда возвращают пустую строку для столичных адресов. Согласно административно-территориальному делению РФ, Москва, Санкт-Петербург и Севастополь являются регионами (субъектами федерации). В структуре ФИАС или ГАР поле "Город" для них часто остается пустым, так как название города совпадает с названием региона.

Проанализируем ситуацию: если мы хотим получить универсальную функцию, которая вернет "Москва" для московских адресов и "Новосибирск" для новосибирских, нам нужно реализовать проверку нескольких полей структуры СведенияОбАдресе.

Разберем пример более продвинутой функции:


Функция ПолучитьГородОрганизации(Организация)
    
    // Получаем данные КИ
    ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
    ДанныеАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(Организация, ВидАдреса);
    
    Если ДанныеАдреса.Количество() = 0 Тогда
        Возврат "";
    КонецЕсли;
    
    // Разбираем JSON/XML внутреннее представление адреса в структуру
    С = РаботаСАдресами.СведенияОбАдресе(ДанныеАдреса[0].Значение);
    
    // 1. Проверяем наличие города
    Если С.Свойство("Город") И ЗначениеЗаполнено(С.Город) Тогда
        Возврат С.Город;
    КонецЕсли;
    
    // 2. Если города нет, проверяем НаселенныйПункт
    Если С.Свойство("НаселенныйПункт") И ЗначениеЗаполнено(С.НаселенныйПункт) Тогда
        Возврат С.НаселенныйПункт;
    КонецЕсли;
    
    // 3. Если и населенного пункта нет (случай городов федерального значения), 
    // берем название региона
    Если С.Свойство("Регион") И ЗначениеЗаполнено(С.Регион) Тогда
        Возврат С.Регион;
    КонецЕсли;
    
    Возврат "";
    
КонецФункции

Такой подход обеспечивает корректную работу кода практически для любого адреса на территории РФ. Мы последовательно переходим от частного к общему: Город -> НаселенныйПункт -> Регион.

Особенности работы с ГАР (Государственным адресным реестром)

В новых версиях 1С (начиная с БСП 3.1) произошел переход к формату ГАР. Теперь адрес может быть представлен как в административно-территориальном, так и в муниципальном делении. Это добавляет новые поля в структуру, такие как МуниципальныйРайон или СельскоеПоселение.

Если ваша конфигурация использует актуальные версии БСП, рекомендуется использовать метод УправлениеКонтактнойИнформацией.ДетализироватьАдрес. Этот метод позволяет получить объект, свойства которого автоматически сопоставлены с актуальным адресным классификатором.

Рассмотрим, как это выглядит в коде:


ЗначениеАдреса = ДанныеАдреса[0].Значение;
ТипАдреса = "АдресРФ"; // Указываем ожидаемый тип

// Используем современный метод детализации
Детализация = УправлениеКонтактнойИнформацией.ДетализироватьАдрес(ЗначениеАдреса, ТипАдреса);

// Теперь мы можем обращаться к свойствам объекта напрямую
Если ЗначениеЗаполнено(Детализация.Город) Тогда
    Результат = Детализация.Город;
ИначеЕсли ЗначениеЗаполнено(Детализация.НаселенныйПункт) Тогда
    Результат = Детализация.НаселенныйПункт;
КонецЕсли;

Рекомендации для стабильной работы

При реализации механизмов извлечения города советуем придерживаться следующих правил:

  1. Всегда проверяйте наличие данных: Перед обращением к индексу ДанныеАдреса[0] убедитесь, что в таблице есть записи, иначе система выдаст ошибку "Индекс находится за границами массива".
  2. Очищайте типы (сокращения): Функции БСП могут возвращать город вместе с сокращением (например, "г. Москва"). Если вам нужно только название, используйте функции строковых операций или ищите соответствующие свойства в структуре (например, ГородНаименование и ГородСокращение).
  3. Учитывайте исторические данные: Контактная информация хранится на определенную дату. Если вы вызываете КонтактнаяИнформацияОбъекта, всегда передавайте дату (например, ТекущаяДатаСеанса), чтобы получить актуальные сведения.
  4. Прямой разбор JSON: В крайнем случае, если типовые методы не подходят, вы можете распарсить содержимое поля Значение как JSON. Поле города обычно соответствует ключу "city" в структуре JSON.

Подводя итог, можно сказать, что наиболее надежным и "правильным" с точки зрения архитектуры 1С является использование цепочки проверок полей структуры, полученной через РаботаСАдресами.СведенияОбАдресе. Это гарантирует, что ваш код будет работать корректно и для маленьких поселков, и для крупных мегаполисов.

← На главную