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

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

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

В этой статье мы подробно разберем, как решить эти проблемы «идеологически правильно» с точки зрения стандартов БСП, не прибегая к «костылям» и прямому изменению данных в обход программного интерфейса (API) библиотеки. Мы изучим механизмы работы с группами контактной информации, регистрацию обработчиков обновления ИБ и предоставим пошаговый чек-лист интеграции контактной информации в любой произвольный справочник конфигурации.

Причина проблемы: Почему не выбирается тип контактной информации?

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

Когда конфигурация «достается в наследство» или переносится некорректно, связь между реквизитом и перечислением может нарушиться на уровне метаданных, либо в модуле формы ФормаЭлемента справочника переопределяется поведение при создании на сервере. Давайте убедимся, что:

  1. Реквизит Тип справочника ВидыКонтактнойИнформации имеет тип ПеречислениеСсылка.ТипыКонтактнойИнформации.
  2. В самом перечислении присутствуют стандартные значения (Адрес, Телефон, Email, Skype, ВебСтраница, АдресЭлектроннойПочты, Другое).
  3. В форме элемента справочника в процедуре ПриСозданииНаСервере не заблокирована доступность элементов управления из-за некорректно определенных прав или параметров сеанса.

Идеологически верное управление группами КИ в БСП

Часто разработчики пытаются включить использование созданных групп или элементов КИ «в лоб», получая объект справочника через метод ПолучитьОбъект() и принудительно записывая значение Используется = Истина. Рассмотрим, почему это плохая практика. Прямая запись нарушает внутренние кэши БСП и может привести к тому, что при очередном обновлении конфигурации или запуске обработчиков обновления ваши настройки будут сброшены.

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

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


// Создание или обновление параметров группы контактной информации
ПараметрыГруппы = УправлениеКонтактнойИнформацией.ПараметрыГруппыВидаКонтактнойИнформации();
ПараметрыГруппы.Имя = "Справочник_Контрагенты"; // Идентификатор группы (обычно ИмяТаблицы)
ПараметрыГруппы.Наименование = НСтр("ru='Контактная информация контрагентов'");

// Метод автоматически создаст группу (или найдет существующую) и установит Используется = Истина
ГруппаВКИ = УправлениеКонтактнойИнформацией.УстановитьСвойстваГруппыВидаКонтактнойИнформации(ПараметрыГруппы);

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


// Настройка конкретного вида КИ внутри созданной группы
ПараметрыВида = УправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Адрес);
ПараметрыВида.Вид = "ФактическийАдресКонтрагента"; // Уникальное имя вида КИ
ПараметрыВида.Наименование = НСтр("ru='Фактический адрес'");
ПараметрыВида.Группа = ГруппаВКИ; // Привязка к нашей группе
ПараметрыВида.Используется = Истина;
ПараметрыВида.МожноИзменятьСпособРедактирования = Истина;

УправлениеКонтактнойИнформацией.УстановитьСвойстваВидаКонтактнойИнформации(ParаметрыВида);

Регистрация программной настройки в обработчиках обновления ИБ

Выясним, где именно должен располагаться данный код, чтобы конфигурация автоматически инициализировала контактную информацию при первом запуске или обновлении релиза. Для этого в БСП применяется подсистема «Обновление информационной базы». В сценариях с большим количеством информационных баз для запуска этого процесса применяется автоматизированное пакетное обновление и архивирование 1С в тихом режиме.

Проанализируем шаги для интеграции нашего кода в общий цикл обновления:

  1. Найдем в нашей конфигурации специализированный общий модуль, отвечающий за обновление (обычно он называется ОбновлениеИнформационнойБазы_ВашПрефикс).
  2. В процедуре ПриДобавленииОбработчиковОбновления(Обработчики) зарегистрируем новый обработчик, указав для него признак начального заполнения.

Рассмотрим пример регистрации такого обработчика обновления:


Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт

    Обработчик = Обработчики.Добавить();
    Обработчик.Версия = "1.0.0.1"; // Укажите текущую версию вашей конфигурации
    Обработчик.НачальноеЗаполнение = Истина;
    Обработчик.Процедура = "ОбновлениеИнформационнойБазы_ВашПрефикс.ОбновитьПредопределенныеВидыКонтактнойИнформации";
    
КонецПроцедуры

Теперь создадим саму процедуру обновления в этом же общем модуле. Обратите внимание, что процедура обязательно должна быть экспортной:


// Процедура для первоначальной инициализации видов и групп КИ
Процедура ОбновитьПредопределенныеВидыКонтактнойИнформации() Экспорт
    
    // 1. Инициализация группы для нашего справочника (например, Справочник "Претензии")
    ПараметрыГруппы = УправлениеКонтактнойИнформацией.ПараметрыГруппыВидаКонтактнойИнформации();
    ПараметрыГруппы.Имя = "Справочник_Претензии";
    ПараметрыГруппы.Наименование = НСтр("ru='Контактная информация по претензиям'");
    ГруппаПретензий = УправлениеКонтактнойИнформацией.УстановитьСвойстваГруппыВидаКонтактнойИнформации(ПараметрыГруппы);
    
    // 2. Создание вида КИ - Телефон заявителя
    ПараметрыВида = УправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Телефон);
    ПараметрыВида.Вид = "ТелефонЗаявителя";
    ПараметрыВида.Наименование = НСтр("ru='Телефон заявителя'");
    ПараметрыВида.Группа = ГруппаПретензий;
    ПараметрыВида.Используется = Истина;
    УправлениеКонтактнойИнформацией.УстановитьСвойстваВидаКонтактнойИнформации(ПараметрыВида);
    
КонецПроцедуры

Современные стандарты БСП: Отказ от физических предопределенных элементов

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

Это нововведение решает сразу несколько серьезных проблем:

СсылкаНаВидКИ = УправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("ТелефонЗаявителя");

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

УправлениеКонтактнойИнформацией.СнятьПризнакПредопределенныйДляВидовКонтактнойИнформации();

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

Полный пошаговый чек-лист подключения КИ к новому справочнику

Рассмотрим весь процесс интеграции контактной информации «с нуля» для нового справочника (например, создадим справочник ДоговорыКонтрагентов и добавим к нему КИ). Весь процесс состоит из трех ключевых этапов.

Шаг 1. Изменение структуры метаданных в конфигураторе

Для того чтобы объект мог хранить контактную информацию, нам необходимо подготовить его структуру метаданных:

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

Шаг 2. Размещение элементов на управляемой форме

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

  1. Откроем управляемую форму элемента нашего справочника.
  2. Добавим в дерево элементов формы новую группу. Тип группы должен быть Обычная группа (или Страница панели страниц), а имя группы обязательно установим в ГруппаКонтактнаяИнформация.
  3. В модуле формы пропишем стандартные вызовы обработчиков БСП. Перенаправим ключевые события формы в программный интерфейс КИ:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Инициализация полей КИ на форме
    УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "ГруппаКонтактнаяИнформация");
    
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    // Чтение контактной информации при открытии карточки
    УправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
    
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    // Подготовка данных КИ к записи
    УправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
    
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    
    // Обновление состояния элементов КИ после записи объекта в базу
    УправлениеКонтактнойИнформацией.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
    
КонецПроцедуры

Шаг 3. Инициализация видов контактной информации

Последним шагом зарегистрируем обработчик обновления информационной базы (как подробно описано в предыдущем разделе), создав группу видов КИ для нашего справочника ДоговорыКонтрагентов и наполнив её нужными видами (например, «Адрес доставки по договору», «Телефон курьера»).

Резервный сценарий: Быстрое исправление признака «Используется» для групп КИ

Бывают ситуации, когда база данных уже находится в промышленной эксплуатации, и из-за прошлых некорректных обновлений группы в справочнике ВидыКонтактнойИнформации оказались отключены (флаг Используется = Ложь). В этом случае контактная информация по объектам перестает отображаться на формах.

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


&НаСервере
Процедура ВосстановитьИспользованиеГруппНаСервере()
    
    Выборка = Справочники.ВидыКонтактнойИнформации.Выбрать();
    Пока Выборка.Следующий() Цикл
        
        // Нас интересуют только группы справочника
        Если Выборка.ЭтоГруппа Тогда
            
            // Если использование отключено, включаем его программно
            Если Не Выборка.Используется Тогда
                ОбъектГруппы = Выборка.ПолучитьОбъект();
                ОбъектГруппы.Используется = Истина;
                
                Попытка
                    ОбъектГруппы.Записать();
                    Сообщить("Успешно активирована группа КИ: " + Выборка.Наименование);
                Исключение
                    ЗаписьЖурналаРегистрации("ОшибкиКИ", УровеньЖурналаРегистрации.Ошибка,,, 
                        ОписаниеОшибки());
                    Сообщить("Не удалось записать группу: " + Выборка.Наименование);
                КонецПопытки;
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

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

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

← На главную