При работе с адресным классификатором в типовых конфигурациях 1С на базе Библиотеки стандартных подсистем (БСП) пользователи и разработчики часто сталкиваются со следующей проблемой: если в информационную базу загружен адресный классификатор по всей территории РФ, найти небольшой населенный пункт (поселок, деревню, село) стандартным поиском бывает крайне затруднительно. В выпадающем списке автоподбора отображаются только первые результаты по алфавиту, а при попытке сначала указать субъект РФ населенный пункт внутри района все равно не находится без явного выбора самого района.
Разберем детально, почему так происходит на уровне запросов и структуры хранения данных в 1С, а также рассмотрим эффективные практические способы быстрого ввода таких адресов.
Проанализируем структуру адресных сведений и логику работы алгоритмов БСП. В классификаторе адресные объекты разделены по уровням иерархии (например, регион — уровень 1, район — уровень 3, город — уровень 4, населенный пункт — уровень 6). Связь подчиненных объектов строится строго через их непосредственного родителя.
Когда мы выбираем в форме регион и сразу переходим к поиску населенного пункта (уровень 6), типовой запрос БСП проверяет совпадение кодов родительского объекта:
И (ВЫБОР
КОГДА АдресныйОбъект.Уровень = 6
ТОГДА АдресныйОбъект.КодОкруга = РодительскийОбъект.КодОкруга
И АдресныйОбъект.КодРайона = РодительскийОбъект.КодРайона
И АдресныйОбъект.КодГорода = РодительскийОбъект.КодГорода
И АдресныйОбъект.КодВнутригородскогоРайона = РодительскийОбъект.КодВнутригородскогоРайона
И АдресныйОбъект.КодУлицы = 0
И АдресныйОбъект.КодДополнительногоЭлемента = 0
И АдресныйОбъект.КодПодчиненногоЭлемента = 0
Выясним причину ошибки: для объекта шестого уровня (деревня, поселок) непосредственным родителем является район или город, а не сам субъект РФ напрямую. Если район не выбран, значение РодительскийОбъект.КодРайона равно нулю, и условие соединения не срабатывает. В результате список населенных пунктов оказывается пустым.
При этом в общем поле ввода срабатывает ограничение выборки автоподбора (первые 20 или 50 записей по маске ПОДОБНО). Если одноименных поселков по стране десятки (например, поселок Дубки), нужный элемент просто не попадает в выборку из-за алфавитного порядка других областей.
Наиболее надежным и рекомендованным решением является переключение работы классификатора с локальных таблиц на онлайн веб-сервис 1С (в рамках официальной поддержки):
Рассмотрим, как работает встроенный строковый парсер БСП. Вместо последовательного ручного выбора полей иерархии введем адрес одной строкой в формате:
Ярославская обл, Дубки п или Дубки, Ярославский р-н
Парсер адресов БСП автоматически разберет лексемы строки, определит субъект РФ, найдет соответствующий подчиненный район и подставит населенный пункт в соответствующие поля формы.
Если известен почтовый индекс населенного пункта, разберем по шагам быстрый способ ввода:
Иногда возникает идея доработать код запроса БСП, разрешив нулевые значения родителей:
КОГДА АдресныйОбъект.Уровень = 6
ТОГДА (АдресныйОбъект.КодРайона = РодительскийОбъект.КодРайона ИЛИ РодительскийОбъект.КодРайона = 0)
И (АдресныйОбъект.КодГорода = РодительскийОбъект.КодГорода ИЛИ РодительскийОбъект.КодГорода = 0)
Обратите внимание: такое изменение типового механизма крайне не рекомендуется на рабочей базе. Ослабление условий соединения в таблицах адресных объектов объемом в миллионы записей приводит к полному сканированию таблиц (Full Table Scan), критическому падению производительности сервера СУБД и блокировкам при одновременной работе пользователей.
Оптимальной практикой остается хранение локально только ключевых рабочих регионов предприятия, ввод редких адресов через онлайн-сервис или использование разбора полной строки адреса.