При работе с адресными данными в современных конфигурациях 1С (основанных на Библиотеке стандартных подсистем — БСП) разработчики часто сталкиваются с проблемой: внешняя система присылает уникальный идентификатор (GUID) дома, и по нему нужно мгновенно получить полную строку адреса. Однако структура хранения ФИАС (теперь ГАР) в 1С специфична: данные о домах упакованы в ХранилищеЗначения в регистре сведений ДомаЗданияСтроения. Прямой поиск по этому регистру запросом невозможен, а перебор всех записей с распаковкой хранилища крайне медлителен. Рассмотрим, как решить эту задачу эффективно.
Для начала проанализируем ситуацию: почему разработчики платформы выбрали такую закрытую структуру? Основная причина кроется в объеме данных. В современном Государственном адресном реестре (ГАР) количество записей о строениях исчисляется десятками миллионов. Если бы каждый дом хранился как отдельная запись с индексированным полем GUID, размер индексов базы данных вырос бы на десятки гигабайт — для этого есть оптимизация и сжатие индексов базы данных. Это сделало бы невозможной работу в файловом режиме и катастрофически замедлило бы типовой сценарий выбора адреса «сверху вниз» (Регион -> Город -> Улица -> Дом).
В текущей реализации БСП данные в регистре ДомаЗданияСтроения сгруппированы по «родительским» объектам (улицам или городам) и сжаты. Это оптимизирует чтение списка домов для конкретной улицы, но делает невозможным обратный поиск по ID дома «в лоб».
Самый правильный и поддерживаемый способ — использование встроенных функций модуля АдресныйКлассификатор. В современных версиях БСП предусмотрены методы, которые умеют работать как с локальной базой, так и с внешними сервисами 1С. Рассмотрим метод СведенияОбОбъектеАдресации.
Разберем пример кода, который позволяет получить структуру с данными адреса по идентификатору:
// Идентификатор дома, полученный из сторонней системы
ИдентификаторДома = Новый УникальныйИдентификатор("592070e1-6b21-46d5-943a-7333555239e0");
// Подготовим параметры поиска
ПараметрыПоиска = АдресныйКлассификатор.ПараметрыСведенийОбОбъектеАдресации();
ПараметрыПоиска.Идентификатор = ИдентификаторДома;
// Получаем сведения
Сведения = АдресныйКлассификатор.СведенияОбОбъектеАдресации(ИдентификаторДома, ПараметрыПоиска);
Если Сведения.Свойство("ПолноеНаименование") Тогда
Сообщить("Найден адрес: " + Сведения.ПолноеНаименование);
КонецЕсли;
Важно помнить: этот метод будет работать эффективно только в том случае, если в базе настроена Интернет-поддержка. В этом случае 1С отправит запрос к веб-сервису (1С:Контрагент или аналогичный — есть готовое автозаполнение адресов через API без 1С:Контрагент), получит данные и вернет их вам, не нагружая локальную базу поиском в гигантских таблицах.
Если ваша задача требует массовой обработки адресов (например, загрузка тысяч документов из сторонней системы), локальный поиск в 1С может стать «бутылочным горлышком» — для этого подойдёт загрузка и сопоставление данных из внешних систем. В таких случаях целесообразно использовать внешние специализированные REST API (например, DaData или государственные сервисы ГАР).
Преимущества такого подхода:
Если использование внешних сервисов невозможно по соображениям безопасности или из-за отсутствия интернета, а искать нужно именно в локальной базе, проанализируем вариант создания «индексного» регистра. Вы можете создать свой регистр сведений ИндексыДомовФИАС со следующей структурой:
ИдентификаторДома (Тип: УникальныйИдентификатор).Владелец (Тип: Ссылка на адресный объект в АдресныеОбъекты).При загрузке ФИАС в систему необходимо дописать обработчик, который будет распаковывать ХранилищеЗначения из регистра ДомаЗданияСтроения и записывать в ваш новый регистр соответствие ID дома -> Ссылка на улицу. Это потребует дополнительного дискового пространства, но позволит выполнять поиск запросом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИндексыДомовФИАС.Владелец КАК УлицаСсылка
|ИЗ
| РегистрСведений.ИндексыДомовФИАС КАК ИндексыДомовФИАС
|ГДЕ
| ИндексыДомовФИАС.ИдентификаторДома = &ИдентификаторДома";
Запрос.УстановитьПараметр("ИдентификаторДома", ИскомыйGUID);
// После нахождения улицы, восстановить адрес "вверх" по иерархии уже не составит труда.
Проанализируем возможные причины, по которым поиск может не дать результата даже при наличии верного GUID:
1. Уровень загрузки данных
При настройке ФИАС в 1С часто выбирают опцию «Загружать только города и улицы» для экономии места. В этом случае записей о домах в регистрах ДомаЗданияСтроения просто не будет физически. Убедитесь, что данные по нужному региону загружены полностью.
2. Исторические записи и версии ГАР
В новом формате ГАР один и тот же объект может иметь ID объекта (постоянный) и ID записи (меняется при каждом изменении адреса). Выясните, какой именно тип GUID передает вам внешняя система. Если система передает устаревший ID версии, а в 1С загружены только актуальные данные, поиск не сработает.
3. Диапазоны домов
В старых данных ФИАС иногда встречаются записи не о конкретном доме, а о диапазоне (например, «дома с 10 по 20 по четной стороне»). В этом случае у конкретного дома №14 может не быть собственного GUID в базе — он «спрятан» внутри записи диапазона. Это редкий случай для современных версий ГАР, но его стоит учитывать при работе со старыми классификаторами.
Подведем итог: для разовых задач по поиску адреса по ID дома используйте штатные методы БСП АдресныйКлассификатор.СведенияОбОбъектеАдресации с включенной интернет-поддержкой. Для высоконагруженных систем рассмотрите вариант интеграции через внешние API (поможет автозаполнение реквизитов и адресов через DaData) или построение собственного индекса соответствия идентификаторов и адресных ссылок. Помните, что прямая распаковка ХранилищеЗначения в цикле — это крайняя мера, которой стоит избегать.