Как найти адрес в 1С по идентификатору дома (GUID) в формате ФИАС/ГАР

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

При работе с адресными данными в современных конфигурациях 1С (основанных на Библиотеке стандартных подсистем — БСП) разработчики часто сталкиваются с проблемой: внешняя система присылает уникальный идентификатор (GUID) дома, и по нему нужно мгновенно получить полную строку адреса. Однако структура хранения ФИАС (теперь ГАР) в 1С специфична: данные о домах упакованы в ХранилищеЗначения в регистре сведений ДомаЗданияСтроения. Прямой поиск по этому регистру запросом невозможен, а перебор всех записей с распаковкой хранилища крайне медлителен. Рассмотрим, как решить эту задачу эффективно.

Почему 1С использует ХранилищеЗначения для домов

Для начала проанализируем ситуацию: почему разработчики платформы выбрали такую закрытую структуру? Основная причина кроется в объеме данных. В современном Государственном адресном реестре (ГАР) количество записей о строениях исчисляется десятками миллионов. Если бы каждый дом хранился как отдельная запись с индексированным полем GUID, размер индексов базы данных вырос бы на десятки гигабайт — для этого есть оптимизация и сжатие индексов базы данных. Это сделало бы невозможной работу в файловом режиме и катастрофически замедлило бы типовой сценарий выбора адреса «сверху вниз» (Регион -> Город -> Улица -> Дом).

В текущей реализации БСП данные в регистре ДомаЗданияСтроения сгруппированы по «родительским» объектам (улицам или городам) и сжаты. Это оптимизирует чтение списка домов для конкретной улицы, но делает невозможным обратный поиск по ID дома «в лоб».

Решение 1: Использование программного интерфейса БСП

Самый правильный и поддерживаемый способ — использование встроенных функций модуля АдресныйКлассификатор. В современных версиях БСП предусмотрены методы, которые умеют работать как с локальной базой, так и с внешними сервисами 1С. Рассмотрим метод СведенияОбОбъектеАдресации.

Разберем пример кода, который позволяет получить структуру с данными адреса по идентификатору:


// Идентификатор дома, полученный из сторонней системы
ИдентификаторДома = Новый УникальныйИдентификатор("592070e1-6b21-46d5-943a-7333555239e0");

// Подготовим параметры поиска
ПараметрыПоиска = АдресныйКлассификатор.ПараметрыСведенийОбОбъектеАдресации();
ПараметрыПоиска.Идентификатор = ИдентификаторДома;

// Получаем сведения
Сведения = АдресныйКлассификатор.СведенияОбОбъектеАдресации(ИдентификаторДома, ПараметрыПоиска);

Если Сведения.Свойство("ПолноеНаименование") Тогда
    Сообщить("Найден адрес: " + Сведения.ПолноеНаименование);
КонецЕсли;

Важно помнить: этот метод будет работать эффективно только в том случае, если в базе настроена Интернет-поддержка. В этом случае 1С отправит запрос к веб-сервису (1С:Контрагент или аналогичный — есть готовое автозаполнение адресов через API без 1С:Контрагент), получит данные и вернет их вам, не нагружая локальную базу поиском в гигантских таблицах.

Решение 2: Использование веб-сервисов и внешних API

Если ваша задача требует массовой обработки адресов (например, загрузка тысяч документов из сторонней системы), локальный поиск в 1С может стать «бутылочным горлышком» — для этого подойдёт загрузка и сопоставление данных из внешних систем. В таких случаях целесообразно использовать внешние специализированные REST API (например, DaData или государственные сервисы ГАР).

Преимущества такого подхода:

  1. Экономия места: Вам не нужно загружать в 1С все 60+ Гб адресного классификатора.
  2. Актуальность: Сервисы всегда содержат последние обновления ФИАС/ГАР, включая информацию о переименованиях и сносах домов.
  3. Скорость: Поиск по индексированным GUID на стороне сервиса происходит мгновенно.

Решение 3: Создание собственного вспомогательного индекса

Если использование внешних сервисов невозможно по соображениям безопасности или из-за отсутствия интернета, а искать нужно именно в локальной базе, проанализируем вариант создания «индексного» регистра. Вы можете создать свой регистр сведений ИндексыДомовФИАС со следующей структурой:

При загрузке ФИАС в систему необходимо дописать обработчик, который будет распаковывать ХранилищеЗначения из регистра ДомаЗданияСтроения и записывать в ваш новый регистр соответствие ID дома -> Ссылка на улицу. Это потребует дополнительного дискового пространства, но позволит выполнять поиск запросом:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ИндексыДомовФИАС.Владелец КАК УлицаСсылка
    |ИЗ
    |   РегистрСведений.ИндексыДомовФИАС КАК ИндексыДомовФИАС
    |ГДЕ
    |   ИндексыДомовФИАС.ИдентификаторДома = &ИдентификаторДома";

Запрос.УстановитьПараметр("ИдентификаторДома", ИскомыйGUID);
// После нахождения улицы, восстановить адрес "вверх" по иерархии уже не составит труда.

Нюансы, о которых нужно знать

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

1. Уровень загрузки данных

При настройке ФИАС в 1С часто выбирают опцию «Загружать только города и улицы» для экономии места. В этом случае записей о домах в регистрах ДомаЗданияСтроения просто не будет физически. Убедитесь, что данные по нужному региону загружены полностью.

2. Исторические записи и версии ГАР

В новом формате ГАР один и тот же объект может иметь ID объекта (постоянный) и ID записи (меняется при каждом изменении адреса). Выясните, какой именно тип GUID передает вам внешняя система. Если система передает устаревший ID версии, а в 1С загружены только актуальные данные, поиск не сработает.

3. Диапазоны домов

В старых данных ФИАС иногда встречаются записи не о конкретном доме, а о диапазоне (например, «дома с 10 по 20 по четной стороне»). В этом случае у конкретного дома №14 может не быть собственного GUID в базе — он «спрятан» внутри записи диапазона. Это редкий случай для современных версий ГАР, но его стоит учитывать при работе со старыми классификаторами.

Итоги

Подведем итог: для разовых задач по поиску адреса по ID дома используйте штатные методы БСП АдресныйКлассификатор.СведенияОбОбъектеАдресации с включенной интернет-поддержкой. Для высоконагруженных систем рассмотрите вариант интеграции через внешние API (поможет автозаполнение реквизитов и адресов через DaData) или построение собственного индекса соответствия идентификаторов и адресных ссылок. Помните, что прямая распаковка ХранилищеЗначения в цикле — это крайняя мера, которой стоит избегать.

← На главную