Как подключить контактную информацию БСП к документу в расширении?

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

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

В этой статье мы подробно разберем, почему возникает эта ошибка, и рассмотрим четыре эффективных способа ее обхода в зависимости от версии используемой вами платформы 1С:Предприятие.

Выясняем причину: почему возникает ошибка определяемого типа?

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

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

Решение 1. Официальный метод для платформ 1С:Предприятие 8.3.20 и выше

Если у вас есть возможность обновить платформу и поднять режим совместимости, эту проблему можно решить самым простым и штатным путем. Начиная с версии платформы 8.3.20.1549, разработчики 1С добавили полноценную поддержку расширения определяемых типов.

Рассмотрим по шагам, как это настроить:

  1. Убедитесь, что режим совместимости вашей основной конфигурации и расширения установлен в значение 8.3.20 или выше.
  2. Заимствуйте определяемый тип ВладелецКонтактнойИнформации в ваше расширение.
  3. Добавьте ваш новый объект (документ или справочник), созданный в расширении, в состав типов заимствованного определяемого типа.
  4. Сохраните изменения. Платформа успешно объединит составы типов без генерации ошибок.

Решение 2. Использование штатной подписки БСП для документов

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

Проанализируем этот механизм подробнее:

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

Решение 3. Программная инициализация и динамическая настройка формы (для старых платформ)

Рассмотрим подробнее обходной путь, который работает на любой версии платформы (включая 8.3.13, 8.3.15 и 8.3.18). Мы можем внедрить интерфейс работы с адресами и телефонами полностью вручную, обходя ограничения метаданных.

Разберем процесс внедрения по шагам:

Шаг 1. Создание табличной части в документе расширения

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

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

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

Шаг 3. Программный вызов инициализации БСП

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


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

Решение 4. Перехват проверок БСП с помощью аннотации &Вместо

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

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

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


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

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

Решение 5. Автономное хранение контактной информации в JSON/XML

Если вам не требуется глубокая интеграция со всей базой данных БСП (например, сквозные аналитические отчеты по адресам или рассылки), можно применить самый безопасный и независимый подход.

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

← На главную