Как настроить отображение и ввод адреса в подсистеме контактной информации БСП?

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

При внедрении подсистемы «Контактная информация» из Библиотеки стандартных подсистем (БСП) разработчики регулярно сталкиваются с нюансами вывода и обработки адресных сведений. Рассмотрим три наиболее распространенные задачи: почему адрес отображается в виде синей гиперссылки со словом «Заполнить» вместо привычного поля ввода, как исключить необходимость указания номера квартиры и каким образом программно извлечь уникальный идентификатор дома (ФИАС / ГАР).

1. Переключение отображения адреса с гиперссылки на поле ввода

Проанализируем причину, по которой адрес на форме контрагента или физического лица может выглядеть как гиперссылка (поле надписи). В типовой подсистеме БСП поведение генерации элементов формы зависит от настроек конкретного элемента справочника ВидыКонтактнойИнформации.

В общем модуле УправлениеКонтактнойИнформацией логика инициализации реквизитов формы опирается на следующий алгоритм:


Если ЗаполнятьЗначениеРеквизита И Не ЭтоРеквизитТабличнойЧасти Тогда
    Если СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес 
       И СтрокаКИ.РедактированиеТолькоВДиалоге 
       И ПустаяСтрока(СтрокаКИ.Представление) Тогда
        Форма[СтрокаКИ.ИмяРеквизита] = УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки;
    Иначе
        Форма[СтрокаКИ.ИмяРеквизита] = СтрокаКИ.Представление;
    КонецЕсли;
КонецЕсли;

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

  1. Откроем справочник ВидыКонтактнойИнформации в режиме «1С:Предприятие» или через предопределенные элементы в конфигураторе.
  2. Найдем нужный адресный реквизит (например, «Юридический адрес» или «Фактический адрес»).
  3. Снимем флаг Редактировать только в диалоге. Именно этот реквизит определяет вид генерируемого элемента формы: при включенном флаге пустой адрес выводится как ПолеНадписи (гиперссылка «Заполнить»), а при снятом — как полнофункциональное ПолеВвода.

Если в конфигурации используется статическое (ручное) размещение полей на форме без динамического создания элементов кодом БСП, создадим на форме реквизит строкового типа, свяжем его с элементом ПолеВвода и подключим типовые обработчики событий (НачалоВыбора, Очистка), вызвав соответствующие методы модуля УправлениеКонтактнойИнформациейКлиент (например, Подключаемый_КонтактнаяИнформацияНачалоВыбора).

2. Как убрать ввод квартиры и помещения из формы адреса

Выясним ситуацию с детализацией адреса: штатной параметрической настройки, позволяющей одним флажком скрыть ввод номеров квартир, комнат или офисов, в справочнике ВидыКонтактнойИнформации нет. Форма диалога ввода адреса едина для всей конфигурации. Однако снимать конфигурацию с поддержки не требуется — рассмотрим два корректных пути решения задачи.

Вариант А: Использование расширения конфигурации

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


&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Отключаем видимость полей квартиры/помещения
    Если Элементы.Найти("Квартира") <> Неопределено Тогда
        Элементы.Квартира.Видимость = Ложь;
    КонецЕсли;
    Если Элементы.Найти("Помещение") <> Неопределено Тогда
        Элементы.Помещение.Видимость = Ложь;
    КонецЕсли;
КонецПроцедуры

При необходимости видимость элементов можно регулировать с учетом переданных в форму параметров, проверяя конкретный вид контактной информации.

Вариант Б: Программная постобработка и очистка сведений

Если требуется гарантировать отсутствие данных о квартире в итоговом представлении и XML/JSON структуре перед сохранением объекта, выполним очистку программно:

  1. Преобразуем сохраненные данные контактной информации в структуру с помощью функции РаботаСАдресами.СведенияОбАдресе или РаботаСАдресамиКлиентСервер.СведенияОбАдресе.
  2. Очистим свойства, отвечающие за помещение (Квартира, Помещение, flat).
  3. Переформируем строковое представление адреса с помощью вызова УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПредставлениеАдреса или УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации.

3. Получение уникального идентификатора дома (GUID ФИАС / ГАР)

Рассмотрим способы извлечения идентификатора дома. В зависимости от того, как был введен адрес и подключена ли интернет-поддержка, применим один из следующих подходов.

Способ 1: Чтение из уже сохраненной структуры адреса

Если адрес уже был корректно выбран пользователем через классификатор, идентификатор дома содержится непосредственно внутри сериализованных данных контактной информации (в реквизите ЗначенияПолей формата XML или Значение формата JSON табличной части КонтактнаяИнформация). В этом случае обращаться к классификатору заново не нужно:


Сведения = РаботаСАдресами.СведенияОбАдресе(СтрокаКИ.ЗначенияПолей);
ИдентификаторДома = Неопределено;

Если Сведения.Свойство("Дом") И ТипЗнч(Сведения.Дом) = Тип("Структура") Тогда
    Сведения.Дом.Свойство("Идентификатор", ИдентификаторДома);
КонецЕсли;

Способ 2: Использование адресного классификатора

Если требуется определить коды и идентификаторы по имеющемуся представлению или неполным данным, обратимся к методам подсистемы адресного классификатора. В ранних версиях БСП для этих целей использовалась процедура АдресныйКлассификатор.ИдентификаторыАдреса, которой передавался адрес в формате XML (получить XML по текстовому представлению можно функцией УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению).

Обратим внимание на важный нюанс: начиная с версии БСП 3.0 метод ИдентификаторыАдреса объявлен устаревшим. В актуальных версиях библиотеки для получения сведений следует вызывать метод АдресныйКлассификатор.КодыАдреса:


ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("Адрес", СтрокаXMLИлиJSON);
ПараметрыПоиска.Вставить("ИсточникДанных", "ЗагруженныеДанные"); // Поиск по локальным таблицам

Результат = АдресныйКлассификатор.КодыАдреса(ПараметрыПоиска);
ИдентификаторДома = Результат.ИдентификаторДома;

Важное замечание: если адресные базы соответствующего региона предварительно загружены в информационную базу (в регистры подсистемы, такие как АдресныеОбъекты и ДомаЗданияСтроения), поиск идентификатора происходит локально без обращения к интернету. Если же классификатор локально не загружен, для получения сведений о домах потребуется активное подключение к интернет-поддержке и доступ к веб-сервисам 1С:ИТС.

← На главную