При работе с Библиотекой стандартных подсистем (БСП) разработчики часто сталкиваются с необходимостью внедрения или доработки подсистемы «Контактная информация». Одной из распространенных проблем является ситуация, когда в справочнике ВидыКонтактнойИнформации невозможно выбрать тип контактной информации, либо созданные группы и элементы КИ не отображаются на управляемых формах объектов.
В этой статье мы подробно разберем, как решить эти проблемы «идеологически правильно» с точки зрения стандартов БСП, не прибегая к «костылям» и прямому изменению данных в обход программного интерфейса (API) библиотеки. Мы изучим механизмы работы с группами контактной информации, регистрацию обработчиков обновления ИБ и предоставим пошаговый чек-лист интеграции контактной информации в любой произвольный справочник конфигурации.
Если при попытке интерактивного добавления нового элемента в справочник ВидыКонтактнойИнформации поле выбора типа остается заблокированным или пустым, в первую очередь проанализируем тип реквизита Тип этого справочника. В типовой БСП данный реквизит жестко связан с системным перечислением ПеречислениеСсылка.ТипыКонтактнойИнформации.
Когда конфигурация «достается в наследство» или переносится некорректно, связь между реквизитом и перечислением может нарушиться на уровне метаданных, либо в модуле формы ФормаЭлемента справочника переопределяется поведение при создании на сервере. Давайте убедимся, что:
Тип справочника ВидыКонтактнойИнформации имеет тип ПеречислениеСсылка.ТипыКонтактнойИнформации.Адрес, Телефон, Email, Skype, ВебСтраница, АдресЭлектроннойПочты, Другое).ПриСозданииНаСервере не заблокирована доступность элементов управления из-за некорректно определенных прав или параметров сеанса.Часто разработчики пытаются включить использование созданных групп или элементов КИ «в лоб», получая объект справочника через метод ПолучитьОбъект() и принудительно записывая значение Используется = Истина. Рассмотрим, почему это плохая практика. Прямая запись нарушает внутренние кэши БСП и может привести к тому, что при очередном обновлении конфигурации или запуске обработчиков обновления ваши настройки будут сброшены.
Для правильного создания и инициализации групп контактной информации в БСП предусмотрен специальный программный интерфейс (API) в общем модуле УправлениеКонтактнойИнформацией. Давайте разберем, как использовать эти функции для программного включения и создания групп. Для поиска процедур и примеров вызовов функций библиотеки можно использовать интерактивный справочник по методам БСП.
Вместо ручного редактирования мы должны использовать функции ПараметрыГруппыВидаКонтактнойИнформации() и УстановитьСвойстваГруппыВидаКонтактнойИнформации(). Посмотрим на практический пример кода, который необходимо выполнять при обновлении информационной базы:
// Создание или обновление параметров группы контактной информации
ПараметрыГруппы = УправлениеКонтактнойИнформацией.ПараметрыГруппыВидаКонтактнойИнформации();
ПараметрыГруппы.Имя = "Справочник_Контрагенты"; // Идентификатор группы (обычно ИмяТаблицы)
ПараметрыГруппы.Наименование = НСтр("ru='Контактная информация контрагентов'");
// Метод автоматически создаст группу (или найдет существующую) и установит Используется = Истина
ГруппаВКИ = УправлениеКонтактнойИнформацией.УстановитьСвойстваГруппыВидаКонтактнойИнформации(ПараметрыГруппы);
После того как группа создана и ссылка на нее получена в переменную ГруппаВКИ, мы можем привязать к ней конкретные виды контактной информации (например, телефон или адрес), также используя штатный программный интерфейс БСП:
// Настройка конкретного вида КИ внутри созданной группы
ПараметрыВида = УправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Адрес);
ПараметрыВида.Вид = "ФактическийАдресКонтрагента"; // Уникальное имя вида КИ
ПараметрыВида.Наименование = НСтр("ru='Фактический адрес'");
ПараметрыВида.Группа = ГруппаВКИ; // Привязка к нашей группе
ПараметрыВида.Используется = Истина;
ПараметрыВида.МожноИзменятьСпособРедактирования = Истина;
УправлениеКонтактнойИнформацией.УстановитьСвойстваВидаКонтактнойИнформации(ParаметрыВида);
Выясним, где именно должен располагаться данный код, чтобы конфигурация автоматически инициализировала контактную информацию при первом запуске или обновлении релиза. Для этого в БСП применяется подсистема «Обновление информационной базы». В сценариях с большим количеством информационных баз для запуска этого процесса применяется автоматизированное пакетное обновление и архивирование 1С в тихом режиме.
Проанализируем шаги для интеграции нашего кода в общий цикл обновления:
ОбновлениеИнформационнойБазы_ВашПрефикс).ПриДобавленииОбработчиковОбновления(Обработчики) зарегистрируем новый обработчик, указав для него признак начального заполнения.Рассмотрим пример регистрации такого обработчика обновления:
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "1.0.0.1"; // Укажите текущую версию вашей конфигурации
Обработчик.НачальноеЗаполнение = Истина;
Обработчик.Процедура = "ОбновлениеИнформационнойБазы_ВашПрефикс.ОбновитьПредопределенныеВидыКонтактнойИнформации";
КонецПроцедуры
Теперь создадим саму процедуру обновления в этом же общем модуле. Обратите внимание, что процедура обязательно должна быть экспортной:
// Процедура для первоначальной инициализации видов и групп КИ
Процедура ОбновитьПредопределенныеВидыКонтактнойИнформации() Экспорт
// 1. Инициализация группы для нашего справочника (например, Справочник "Претензии")
ПараметрыГруппы = УправлениеКонтактнойИнформацией.ПараметрыГруппыВидаКонтактнойИнформации();
ПараметрыГруппы.Имя = "Справочник_Претензии";
ПараметрыГруппы.Наименование = НСтр("ru='Контактная информация по претензиям'");
ГруппаПретензий = УправлениеКонтактнойИнформацией.УстановитьСвойстваГруппыВидаКонтактнойИнформации(ПараметрыГруппы);
// 2. Создание вида КИ - Телефон заявителя
ПараметрыВида = УправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Телефон);
ПараметрыВида.Вид = "ТелефонЗаявителя";
ПараметрыВида.Наименование = НСтр("ru='Телефон заявителя'");
ПараметрыВида.Группа = ГруппаПретензий;
ПараметрыВида.Используется = Истина;
УправлениеКонтактнойИнформацией.УстановитьСвойстваВидаКонтактнойИнформации(ПараметрыВида);
КонецПроцедуры
В актуальных версиях БСП разработчикам настоятельно рекомендуется отказаться от создания предопределенных элементов справочника ВидыКонтактнойИнформации непосредственно в дереве метаданных конфигуратора. Вместо этого все виды КИ создаются исключительно программно с помощью описанного выше API в момент обновления информационной базы.
Это нововведение решает сразу несколько серьезных проблем:
СсылкаНаВидКИ = УправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("ТелефонЗаявителя");
Если в вашей конфигурации остались старые физические предопределенные элементы, и вы хотите перевести их на современные рельсы, в БСП существует специальная процедура для безопасного отключения связи с метаданными конфигуратора:
УправлениеКонтактнойИнформацией.СнятьПризнакПредопределенныйДляВидовКонтактнойИнформации();
После вызова этого метода элементы становятся обычными (не предопределенными в конфигураторе), и управление ими полностью передается программному коду БСП.
Рассмотрим весь процесс интеграции контактной информации «с нуля» для нового справочника (например, создадим справочник ДоговорыКонтрагентов и добавим к нему КИ). Весь процесс состоит из трех ключевых этапов.
Для того чтобы объект мог хранить контактную информацию, нам необходимо подготовить его структуру метаданных:
ДоговорыКонтрагентов) и добавим табличную часть с именем КонтактнаяИнформация.Контрагенты или Пользователи). В ней должны быть реквизиты: Тип, Вид, Представление, ЗначенияПолей, Страна, Регион, Город, АдресЭП, ДоменноеИмяПолнотекстовыйПоиск, НомерТелефона, НомерТелефонаБезКодов.ВладелецКонтактнойИнформации и добавим наш справочник в список типов. Это критически важно, так как подсистема КИ проверяет типы владельцев на соответствие этому определяемому типу.Теперь настроим форму элемента справочника для отображения полей ввода адресов, телефонов и других данных:
ГруппаКонтактнаяИнформация.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализация полей КИ на форме
УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "ГруппаКонтактнаяИнформация");
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Чтение контактной информации при открытии карточки
УправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Подготовка данных КИ к записи
УправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
// Обновление состояния элементов КИ после записи объекта в базу
УправлениеКонтактнойИнформацией.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
Последним шагом зарегистрируем обработчик обновления информационной базы (как подробно описано в предыдущем разделе), создав группу видов КИ для нашего справочника ДоговорыКонтрагентов и наполнив её нужными видами (например, «Адрес доставки по договору», «Телефон курьера»).
Бывают ситуации, когда база данных уже находится в промышленной эксплуатации, и из-за прошлых некорректных обновлений группы в справочнике ВидыКонтактнойИнформации оказались отключены (флаг Используется = Ложь). В этом случае контактная информация по объектам перестает отображаться на формах.
Для быстрого и безопасного восстановления работы в аварийных ситуациях мы можем воспользоваться внешней обработкой, которая программно включит признак использования для всех групп справочника. Рассмотрим код серверной процедуры такой обработки:
&НаСервере
Процедура ВосстановитьИспользованиеГруппНаСервере()
Выборка = Справочники.ВидыКонтактнойИнформации.Выбрать();
Пока Выборка.Следующий() Цикл
// Нас интересуют только группы справочника
Если Выборка.ЭтоГруппа Тогда
// Если использование отключено, включаем его программно
Если Не Выборка.Используется Тогда
ОбъектГруппы = Выборка.ПолучитьОбъект();
ОбъектГруппы.Используется = Истина;
Попытка
ОбъектГруппы.Записать();
Сообщить("Успешно активирована группа КИ: " + Выборка.Наименование);
Исключение
ЗаписьЖурналаРегистрации("ОшибкиКИ", УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки());
Сообщить("Не удалось записать группу: " + Выборка.Наименование);
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот скрипт обойдет дерево видов контактной информации, найдет все группы и установит для них флаг Используется в значение Истина. Это мгновенно вернет отображение связанных полей на управляемые формы объектов конфигурации.
Подведем итог. Мы рассмотрели архитектуру подсистемы КИ в БСП, научились корректно работать с группами видов КИ через программный интерфейс, разобрали механизмы создания обработчиков обновления информационной базы и изучили современный подход БСП, исключающий необходимость создания предопределенных элементов в конфигураторе. Следование этим стандартам гарантирует стабильную работу вашей конфигурации и отсутствие проблем при последующих обновлениях БСП.