При разработке расширений для современных конфигураций на базе БСП (таких как ERP 2.4/2.5, КА 2, УТ 11) часто возникает задача добавить полноценный блок контактной информации (адреса, телефоны, email) для нового справочника, созданного в этом же расширении. Основная сложность заключается в том, что механизмы БСП ожидают наличия предопределенных данных в справочнике ВидыКонтактнойИнформации, а расширения не позволяют добавлять предопределенные элементы в существующие объекты метаданных конфигурации.
В данной статье мы подробно разберем, как обойти это ограничение, правильно настроить метаданные и программно подключить подсистему контактной информации (КИ) так, чтобы она работала стабильно и не вызывала ошибок при обновлении системы.
Прежде всего, проанализируем структуру нашего справочника. Чтобы подсистема БСП могла хранить данные, в наш справочник (созданный в расширении) необходимо добавить табличную часть с именем КонтактнаяИнформация. Важно соблюдать точность имен и типов реквизитов, иначе стандартные методы управления КИ не смогут корректно считать или записать данные. При необходимости работы с табличными частями существующих объектов без изменения основной конфигурации подойдет универсальный механизм добавления табличных частей через расширение.
Создадим табличную часть КонтактнаяИнформация со следующими реквизитами:
ПеречислениеСсылка.ТипыКонтактнойИнформации.СправочникСсылка.ВидыКонтактнойИнформации.Строка, длина 500.Строка (неограниченная длина) или ХранилищеЗначения.Строка, длина 100.Строка, длина 100.Строка, длина 100.Строка, длина 100.Строка, длина 100.Строка, длина 20.Строка, длина 20.Строка (неограниченная длина).Важный нюанс: наличие всех реквизитов зависит от версии БСП, используемой в вашей конфигурации. В последних релизах ERP 2.5 состав реквизитов может быть шире, поэтому рекомендуется подсмотреть структуру табличной части в типовом справочнике Партнеры или Контрагенты основной конфигурации.
Теперь нам нужно сообщить системе, что наш новый справочник является «носителем» контактной информации. Для этого воспользуемся механизмом переопределяемых модулей. В расширении необходимо создать (или добавить в уже существующее) расширение общего модуля УправлениеКонтактнойИнформациейПереопределяемый.
Рассмотрим код, который необходимо добавить в процедуру ПриОпределенииОбъектовСКонтактнойИнформацией. Используем аннотацию &После:
&После("ПриОпределенииОбъектовСКонтактнойИнформацией")
Процедура Расш1_ПриОпределенииОбъектовСКонтактнойИнформацией(Объекты)
// Добавляем наш справочник из расширения в массив объектов КИ
Объекты.Добавить(Метаданные.Справочники.Расш1_МойНовыйСправочник);
КонецПроцедуры
Этот шаг критичен: без него механизмы проверки прав и универсальные обработки КИ не будут «видеть» ваш справочник как валидный объект метаданных.
Как отметил автор вопроса в сообщении №2, при попытке инициализации формы возникает ошибка, так как функция ВидКонтактнойИнформацииПоИмени ищет предопределенный элемент, соответствующий имени справочника. Поскольку мы не можем создать предопределенный элемент в расширении, нам нужно создать его программно при первом запуске или через обработчик обновления.
Выясним причину: БСП ожидает, что в справочнике ВидыКонтактнойИнформации существует группа, имя которой совпадает с именем вашего справочника (например, СправочникРасш1_МойНовыйСправочник). В этой группе должны находиться конкретные виды (Адрес, Телефон и т.д.).
Разберем пример кода для программного создания такой структуры:
Процедура СоздатьВидыКонтактнойИнформацииДляСправочника() Экспорт
ИмяГруппы = "СправочникРасш1_МойНовыйСправочник";
ГруппаСсылка = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию(ИмяГруппы);
Если ГруппаСсылка.Пустая() Тогда
ГруппаОбъект = Справочники.ВидыКонтактнойИнформации.СоздатьГруппу();
ГруппаОбъект.Наименование = "Контактная информация моего справочника";
// ВАЖНО: ИмяПредопределенныхДанных в расширении не задать,
// поэтому БСП ищет по реквизиту "Используется" или через доп. настройки.
ГруппаОбъект.Записать();
ГруппаСсылка = ГруппаОбъект.Ссылка;
КонецЕсли;
// Создаем вид КИ (например, Телефон)
ИмяВидаКИ = "ТелефонМоегоСправочника";
ВидСсылка = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию(ИмяВидаКИ, Ложь, ГруппаСсылка);
Если ВидСсылка.Пустая() Тогда
НовыйВид = Справочники.ВидыКонтактнойИнформации.СоздатьЭлемент();
НовыйВид.Наименование = "Телефон";
НовыйВид.Родитель = ГруппаСсылка;
НовыйВид.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
НовыйВид.Используется = Справочники.ВидыКонтактнойИнформации.НайтиПоИмени("СправочникПартнеры").Используется; // Или укажите метаданные вашего справочника
НовыйВид.Записать();
КонецЕсли;
КонецПроцедуры
После программного создания элементов обязательно вызовите метод УправлениеКонтактнойИнформацией.ОбновитьКэшВидовКонтактнойИнформации(), чтобы система увидела изменения без перезапуска сеанса.
Проанализируем ситуацию с формой справочника. Чтобы КИ отображалась красиво (как в справочнике Партнеры), нам нужно подготовить контейнер на форме и вызвать методы инициализации.
ГруппаКонтактнаяИнформация.ПриСозданииНаСервере, добавьте стандартный код подключения БСП:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.КонтактнаяИнформация
ДополнительныеПараметрыКИ = УправлениеКонтактнойИнформацией.ПараметрыКонтактнойИнформации();
ДополнительныеПараметрыКИ.Вставить("ИмяЭлементаДляРазмещения", "ГруппаКонтактнаяИнформация");
ДополнительныеПараметрыКИ.Вставить("ПоложениеЗаголовкаКИ", ПоложениеЗаголовкаЭлементаФормы.Лево);
// Если справочник создается "с нуля", полезно включить отложенную инициализацию для ускорения
ДополнительныеПараметрыКИ.Вставить("ОтложеннаяИнициализация", Истина);
УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтаФорма, Объект, ДополнительныеПараметрыКИ);
// Конец СтандартныеПодсистемы.КонтактнаяИнформация
КонецПроцедуры
Посмотрим на важный момент: если вы используете отложенную инициализацию, вам необходимо добавить в форму обработчик события ПриАктивизацииСтраницы (если КИ находится на отдельной вкладке) или вызвать УправлениеКонтактнойИнформацией.ПриЧтенииНаСервере, чтобы данные отобразились при открытии.
Для того чтобы введенные данные сохранялись в табличную часть, необходимо подключить обработчики записи в модуле формы. Проанализируем необходимые вызовы:
&НаСервере
Процедура Расш1_ПриЧтенииНаСервере(ТекущийОбъект)
// Чтение данных КИ из объекта в форму
УправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры
&НаСервере
Процедура Расш1_ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Перенос данных из элементов формы обратно в табличную часть объекта
УправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры
Эти процедуры гарантируют, что динамически созданные элементы формы (поля ввода адресов и телефонов) будут синхронизированы с данными информационной базы.
Мы рассмотрели полный цикл подключения контактной информации в расширении. Подведем итоги:
ПриОпределенииОбъектовСКонтактнойИнформацией обязательно для корректной работы серверных модулей.ИмяЭлементаДляРазмещения в параметрах.Помните, что 1С часто обновляет БСП. Старайтесь использовать минимальное количество переопределений (&Вместо) и отдавайте предпочтение &После, чтобы ваше расширение оставалось работоспособным после обновления основной конфигурации (ERP, УТ или КА). Для более глубокого изучения стандартных подсистем можно использовать интерактивный справочник по методам БСП с примерами кода.