Как быстро ввести адрес населенного пункта в 1С при загруженном классификаторе БСП

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

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

Разберем детально, почему так происходит на уровне запросов и структуры хранения данных в 1С, а также рассмотрим эффективные практические способы быстрого ввода таких адресов.

Причина поведения подсистемы адресного классификатора

Проанализируем структуру адресных сведений и логику работы алгоритмов БСП. В классификаторе адресные объекты разделены по уровням иерархии (например, регион — уровень 1, район — уровень 3, город — уровень 4, населенный пункт — уровень 6). Связь подчиненных объектов строится строго через их непосредственного родителя.

Когда мы выбираем в форме регион и сразу переходим к поиску населенного пункта (уровень 6), типовой запрос БСП проверяет совпадение кодов родительского объекта:


И (ВЫБОР
    КОГДА АдресныйОбъект.Уровень = 6
        ТОГДА АдресныйОбъект.КодОкруга = РодительскийОбъект.КодОкруга
            И АдресныйОбъект.КодРайона = РодительскийОбъект.КодРайона
            И АдресныйОбъект.КодГорода = РодительскийОбъект.КодГорода
            И АдресныйОбъект.КодВнутригородскогоРайона = РодительскийОбъект.КодВнутригородскогоРайона
            И АдресныйОбъект.КодУлицы = 0
            И АдресныйОбъект.КодДополнительногоЭлемента = 0
            И АдресныйОбъект.КодПодчиненногоЭлемента = 0

Выясним причину ошибки: для объекта шестого уровня (деревня, поселок) непосредственным родителем является район или город, а не сам субъект РФ напрямую. Если район не выбран, значение РодительскийОбъект.КодРайона равно нулю, и условие соединения не срабатывает. В результате список населенных пунктов оказывается пустым.

При этом в общем поле ввода срабатывает ограничение выборки автоподбора (первые 20 или 50 записей по маске ПОДОБНО). Если одноименных поселков по стране десятки (например, поселок Дубки), нужный элемент просто не попадает в выборку из-за алфавитного порядка других областей.

Способ 1. Использование веб-сервиса 1С вместо локального классификатора

Наиболее надежным и рекомендованным решением является переключение работы классификатора с локальных таблиц на онлайн веб-сервис 1С (в рамках официальной поддержки):

  1. Откроем раздел администрирования и найдем пункт Интернет-поддержка и сервисы — Адресный классификатор.
  2. Включим опцию использования веб-сервиса 1С для работы с адресными сведениями без полной загрузки классификатора в локальную информационную базу.
  3. Проверим ввод адреса. Поисковый механизм веб-сервиса использует полнотекстовое ранжирование и морфологический разбор, за счет чего выдает точные совпадения даже для сложных названий с привязкой к региону.

Способ 2. Интеллектуальный ввод адреса одной строкой

Рассмотрим, как работает встроенный строковый парсер БСП. Вместо последовательного ручного выбора полей иерархии введем адрес одной строкой в формате:

Ярославская обл, Дубки п или Дубки, Ярославский р-н

Парсер адресов БСП автоматически разберет лексемы строки, определит субъект РФ, найдет соответствующий подчиненный район и подставит населенный пункт в соответствующие поля формы.

Способ 3. Поиск через почтовый индекс

Если известен почтовый индекс населенного пункта, разберем по шагам быстрый способ ввода:

  1. Введем шестизначный почтовый индекс в поле адреса.
  2. Классификатор однозначно свяжет индекс с регионом, районом и конкретным населенным пунктом.
  3. После автоматического заполнения структуры останется только указать улицу и номер дома.

Рекомендации разработчикам по оптимизации адресных запросов

Иногда возникает идея доработать код запроса БСП, разрешив нулевые значения родителей:


КОГДА АдресныйОбъект.Уровень = 6
    ТОГДА (АдресныйОбъект.КодРайона = РодительскийОбъект.КодРайона ИЛИ РодительскийОбъект.КодРайона = 0)
        И (АдресныйОбъект.КодГорода = РодительскийОбъект.КодГорода ИЛИ РодительскийОбъект.КодГорода = 0)

Обратите внимание: такое изменение типового механизма крайне не рекомендуется на рабочей базе. Ослабление условий соединения в таблицах адресных объектов объемом в миллионы записей приводит к полному сканированию таблиц (Full Table Scan), критическому падению производительности сервера СУБД и блокировкам при одновременной работе пользователей.

Оптимальной практикой остается хранение локально только ключевых рабочих регионов предприятия, ввод редких адресов через онлайн-сервис или использование разбора полной строки адреса.

← На главную