При разработке функционала на платформе 1С часто возникает задача подбора определенного адресного элемента — например, наименования района в конкретном регионе. Рассмотрим, как правильно реализовать интерактивный выбор или программное получение района из адресного классификатора с использованием Библиотеки Стандартных Подсистем (БСП).
В типовых конфигурациях 1С для работы с адресами применяется встроенная подсистема «Адресный классификатор» из БСП. Вместо написания собственной логики выбора и хранения текстовых строк рекомендуется использовать стандартные механизмы подсистемы.
Разберем основные варианты работы со стандартными формами:
ОбщаяФорма.ВводАдреса, где выбор региона, района, города и улицы реализован автоматически со всеми необходимыми проверками.ОбщаяФорма.ВыборАдресногоОбъекта. Ей передаются параметры отбора по родителю (региону) и уровню адресного объекта.Если на форме расположен реквизит с типом Строка и требуется заполнить список выбора только районами выбранного региона, выполним запрос к регистру сведений адресных объектов.
В современных конфигурациях 1С адресные данные хранятся в формате ГАР (Государственный адресный реестр) в регистре сведений РегистрСведений.АдресныеОбъекты. Проанализируем пример запроса для получения всех районов, входящих в состав определенного региона:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.ТипОбъекта КАК ТипОбъекта,
| АдресныеОбъекты.Идентификатор КАК Идентификатор
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
|ГДЕ
| АдресныеОбъекты.РодительскийИдентификатор = &ИдентификаторРегиона
| И АдресныеОбъекты.Уровень в (&УровниРайонов)";
Запрос.УстановитьПараметр("ИдентификаторРегиона", ИдентификаторВыбранногоРегиона);
// В ГАР районы могут иметь разный уровень (муниципальный район, городской округ и т.д.)
МассивУровней = Новый Массив;
МассивУровней.Добавить(2); // Муниципальный район
МассивУровней.Добавить(3); // Городской округ
Запрос.УстановитьПараметр("УровниРайонов", МассивУровней);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
СписокРайонов = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
ОфициальноеНаименование = Выборка.Наименование + " " + Выборка.ТипОбъекта;
СписокРайонов.Добавить(Выборка.Идентификатор, ОфициальноеНаименование);
КонецЦикла;
Рассмотрим пошагово, как связать полученный список с полем ввода на управляемой форме:
НачалоВыбора для элемента формы установим свойство СтандартнаяОбработка = Ложь.АдресныеОбъекты.ПоказатьВыборИзСписка.Посмотрим на пример кода в модуле формы:
&НаКлиенте
Процедура РайонНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СписокРайонов = ПолучитьСписокРайоновНаСервере(Объект.Регион);
Оповещение = Новый ОписаниеОповещения("ПослеВыбораРайона", ЭтотОбъект);
ПоказатьВыборИзСписка(Оповещение, СписокРайонов, Элемент);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораРайона(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент <> Неопределено Тогда
Объект.Район = ВыбранныйЭлемент.Представление;
// Рекомендуется также сохранять УИД объекта: ВыбранныйЭлемент.Значение
КонецЕсли;
КонецПроцедуры
Проанализируем возможные особенности при реализации данной задачи:
1. Загрузка классификатора: Убедитесь, что в программе загружены данные классификатора по нужному региону или настроено подключение к веб-сервису «1С:Контрагент» / сервису адресов.
2. Формат классификатора: В устаревших конфигурациях на базе КЛАДР данные хранятся в РегистрСведений.АдресныйКлассификатор, а структура кода содержит регион и район в текстовом коде адреса. В современных версиях с ГАР используются уникальные идентификаторы (GUID).
3. Сохранение данных: Сохранение исключительно наименования района в виде строки может привести к дублированию или рассинхронизации при переименовании объектов. Для надежности рекомендуется сохранять Уникальный Идентификатор (UUID) адресного объекта ФИАС/ГАР в отдельном реквизите.