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