Как выбрать район из адресного классификатора в 1С?

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

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

Использование штатных форм БСП для выбора адреса

В типовых конфигурациях 1С для работы с адресами применяется встроенная подсистема «Адресный классификатор» из БСП. Вместо написания собственной логики выбора и хранения текстовых строк рекомендуется использовать стандартные механизмы подсистемы.

Разберем основные варианты работы со стандартными формами:

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

Программный получение списка районов из регистра классификатора

Если на форме расположен реквизит с типом Строка и требуется заполнить список выбора только районами выбранного региона, выполним запрос к регистру сведений адресных объектов.

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


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

Запрос.УстановитьПараметр("ИдентификаторРегиона", ИдентификаторВыбранногоРегиона);

// В ГАР районы могут иметь разный уровень (муниципальный район, городской округ и т.д.)
МассивУровней = Новый Массив;
МассивУровней.Добавить(2); // Муниципальный район
МассивУровней.Добавить(3); // Городской округ
Запрос.УстановитьПараметр("УровниРайонов", МассивУровней);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

СписокРайонов = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
    ОфициальноеНаименование = Выборка.Наименование + " " + Выборка.ТипОбъекта;
    СписокРайонов.Добавить(Выборка.Идентификатор, ОфициальноеНаименование);
КонецЦикла;

Организация выбора на форме

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

  1. В обработчике события НачалоВыбора для элемента формы установим свойство СтандартнаяОбработка = Ложь.
  2. Сформируем список районов на сервере с помощью запроса к регистру АдресныеОбъекты.
  3. Покажем пользователю выпадающий список для выбора с помощью метода ПоказатьВыборИзСписка.

Посмотрим на пример кода в модуле формы:


&НаКлиенте
Процедура РайонНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    СписокРайонов = ПолучитьСписокРайоновНаСервере(Объект.Регион);
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораРайона", ЭтотОбъект);
    ПоказатьВыборИзСписка(Оповещение, СписокРайонов, Элемент);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораРайона(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        Объект.Район = ВыбранныйЭлемент.Представление;
        // Рекомендуется также сохранять УИД объекта: ВыбранныйЭлемент.Значение
    КонецЕсли;
КонецПроцедуры

Важные нюансы работы с классификатором

Проанализируем возможные особенности при реализации данной задачи:

1. Загрузка классификатора: Убедитесь, что в программе загружены данные классификатора по нужному региону или настроено подключение к веб-сервису «1С:Контрагент» / сервису адресов.

2. Формат классификатора: В устаревших конфигурациях на базе КЛАДР данные хранятся в РегистрСведений.АдресныйКлассификатор, а структура кода содержит регион и район в текстовом коде адреса. В современных версиях с ГАР используются уникальные идентификаторы (GUID).

3. Сохранение данных: Сохранение исключительно наименования района в виде строки может привести к дублированию или рассинхронизации при переименовании объектов. Для надежности рекомендуется сохранять Уникальный Идентификатор (UUID) адресного объекта ФИАС/ГАР в отдельном реквизите.

← На главную