Как реализовать контактную информацию для своего справочника в расширении 1С

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

При разработке расширений для современных конфигураций на базе БСП (таких как ERP 2.4/2.5, КА 2, УТ 11) часто возникает задача добавить полноценный блок контактной информации (адреса, телефоны, email) для нового справочника, созданного в этом же расширении. Основная сложность заключается в том, что механизмы БСП ожидают наличия предопределенных данных в справочнике ВидыКонтактнойИнформации, а расширения не позволяют добавлять предопределенные элементы в существующие объекты метаданных конфигурации.

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

Шаг 1. Подготовка структуры метаданных в расширении

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

Создадим табличную часть КонтактнаяИнформация со следующими реквизитами:

  1. Тип — Тип: ПеречислениеСсылка.ТипыКонтактнойИнформации.
  2. Вид — Тип: СправочникСсылка.ВидыКонтактнойИнформации.
  3. Представление — Тип: Строка, длина 500.
  4. ЗначенияПолей — Тип: Строка (неограниченная длина) или ХранилищеЗначения.
  5. Страна — Тип: Строка, длина 100.
  6. Регион — Тип: Строка, длина 100.
  7. Город — Тип: Строка, длина 100.
  8. АдресЭП — Тип: Строка, длина 100.
  9. ДоменноеИмяСервера — Тип: Строка, длина 100.
  10. НомерТелефона — Тип: Строка, длина 20.
  11. НомерТелефонаБезКодов — Тип: Строка, длина 20.
  12. Значение — Тип: Строка (неограниченная длина).

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

Шаг 2. Регистрация справочника в подсистеме БСП

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

Рассмотрим код, который необходимо добавить в процедуру ПриОпределенииОбъектовСКонтактнойИнформацией. Используем аннотацию &После:


&После("ПриОпределенииОбъектовСКонтактнойИнформацией")
Процедура Расш1_ПриОпределенииОбъектовСКонтактнойИнформацией(Объекты)
    // Добавляем наш справочник из расширения в массив объектов КИ
    Объекты.Добавить(Метаданные.Справочники.Расш1_МойНовыйСправочник);
КонецПроцедуры

Этот шаг критичен: без него механизмы проверки прав и универсальные обработки КИ не будут «видеть» ваш справочник как валидный объект метаданных.

Шаг 3. Решение проблемы «Поле объекта не обнаружено» и создание видов КИ

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

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

Разберем пример кода для программного создания такой структуры:


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

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

Шаг 4. Настройка управляемой формы

Проанализируем ситуацию с формой справочника. Чтобы КИ отображалась красиво (как в справочнике Партнеры), нам нужно подготовить контейнер на форме и вызвать методы инициализации.

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

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

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

Шаг 5. Обеспечение сохранения данных

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


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

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

Эти процедуры гарантируют, что динамически созданные элементы формы (поля ввода адресов и телефонов) будут синхронизированы с данными информационной базы.

Резюме и рекомендации

Мы рассмотрели полный цикл подключения контактной информации в расширении. Подведем итоги:

Помните, что 1С часто обновляет БСП. Старайтесь использовать минимальное количество переопределений (&Вместо) и отдавайте предпочтение &После, чтобы ваше расширение оставалось работоспособным после обновления основной конфигурации (ERP, УТ или КА). Для более глубокого изучения стандартных подсистем можно использовать интерактивный справочник по методам БСП с примерами кода.

← На главную