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

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

При внедрении подсистемы «Контактная информация» из Библиотеки стандартных подсистем (БСП) часто возникает задача упростить интерфейс ввода адреса для определенных справочников. Например, для юридических лиц или складов требуется вводить адрес только до уровня здания/строения, полностью исключив поле «Квартира» («Помещение»), чтобы пользователи не путались при заполнении.

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

Почему не работают стандартные механизмы (подписки и функциональные опции)

При попытке быстро скрыть лишний элемент формы разработчики часто рассматривают следующие варианты, которые в случае с контактной информацией БСП оказываются неэффективными:

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

Решение через расширение конфигурации

Наиболее надежный и поддерживаемый способ скрыть поле квартиры без снятия конфигурации с поддержки — использование механизма расширений.

Разберем реализацию по шагам:

  1. Добавление формы в расширение: найдем в дереве метаданных обработку РасширенныйВводКонтактнойИнформации, выберем форму ВводАдреса и добавим ее в расширение.
  2. Перехват события создания формы: в модуле формы расширения переопределим процедуру ПриСозданииНаСервере с помощью аннотации &После. Это гарантирует, что типовой код БСП уже завершил программную генерацию элементов формы.
  3. Проверка контекста вызова: чтобы скрыть квартиру только для конкретного справочника или конкретного вида контактной информации, проанализируем параметры, переданные в форму (например, Параметры.ВидКонтактнойИнформации или Параметры.Объект).
  4. Управление видимостью элемента: найдем программно созданный элемент или группу элементов, отвечающую за помещение/квартиру, и установим свойство видимости в значение Ложь.

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


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

Альтернативный вариант: передача дополнительного параметра

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


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("СкрыватьКвартиру", Истина);
// Заполнение остальных стандартных параметров БСП...

ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВводАдреса", ПараметрыФормы, ЭтотОбъект);

В модуле формы ввода адреса останется только прочитать данный флаг из коллекции Параметры и отключить видимость соответствующих элементов.

Корректность сохранения данных в формате ФИАС / ГАР

Важно отметить, что скрытие поля квартиры на форме никак не нарушает валидность данных контактной информации в формате XML/JSON. В классификаторах ФИАС и ГАР уровень помещений является необязательным: сериализатор контактной информации БСП сформирует корректный адрес, завершив иерархию на уровне дома, корпуса или строения.

← На главную