Перейти к основному содержимому

Пример контракта сущности — ссылочный тип, который можно использовать в хранимых полях

Цель примера — возможность указывать в реквизите ПланыОбмена элементы из разных планов обмена, в том числе из тех, которые могут появиться в будущем.

В проекте есть справочник ИнформационныеСистемы, у которого есть реквизит-коллекция ПланыОбмена. Участниками обмена в информационной системе могут быть различные планы обмена: ОбменСоСкладом, ОбменСМагазином, ОбменСКонтрагентами и т. д. В будущем список может расширяться, например, добавится ОбменСКурьерскойСлужбой.

Чтобы иметь возможность в этом реквизите выбрать элемент из разных планов обмена, создается контракт сущности УчастникиОбмена.

УчастникиОбмена.yaml
ВидЭлемента: КонтрактСущности
Ид: 6e43f224-a09e-442b-9d33-927de7973678
Имя: УчастникиОбмена
ОбластьВидимости: ВПодсистеме
Свойства:
-
Ид: c2a2572a-79dd-4aa0-ab38-e0a6cce636c9
Имя: Идентификатор
Тип: Строка

Контракт реализуют планы обмена: ОбменСоСкладом, ОбменСМагазином, ОбменСКонтрагентами. Реквизит ПланыОбмена справочника ИнформационныеСистемы имеет тип Массив<УчастникиОбмена.Ссылка?>. Соответственно, элемент любого из этих планов обмена можно выбрать в качестве участника обмена в информационной системе. Тогда реквизит ПланыОбмена справочника ИнформационныеСистемы может выглядеть следующим образом:

Реквизиты:
-
Ид: db128bf9-b682-463b-ba99-be95344d095a
Имя: ПланыОбмена
Тип: Массив<УчастникиОбмена.Ссылка?>

Когда появится план обмена ОбменСКурьерскойСлужбой, для него нужно указать, что он реализует контракт УчастникиОбмена. И тогда элементы этого плана обмена смогут участвовать в этой же механике. Описание плана обмена ОбменСКурьерскойСлужбой может выглядеть следующим образом:

ОбменСКурьерскойСлужбой.yaml
ВидЭлемента: ПланОбмена
ОбластьВидимости: ВПодсистеме
Ид: b41dd165-0f59-4756-885b-6ffb72e5ac1b
Имя: ОбменСКурьерскойСлужбой
Представление: Идентификатор
НастройкиТипов:
ПланОбмена.Объект:
Контракты:
- УчастникиОбмена.Объект
Реквизиты:
-
Имя: Наименование
-
Ид: 4dc48b4f-2c4d-4e3b-b871-210f885b55a7
Имя: Идентификатор
Тип: Строка
# ...

Если бы не было контракта сущности, то для того, чтобы реализовать аналогичный механизм, нужно было бы делать составной тип у реквизита ПланыОбмена, включающий типы ОбменСоСкладом.Ссылка, ОбменСМагазином.Ссылка, ОбменСКонтрагентами.Ссылка. А когда появится план обмена ОбменСКурьерскойСлужбой, его нужно было бы включить в составной тип этого реквизита. А если таких реквизитов несколько, то можно легко забыть про какой-нибудь из них, в результате чего возникнет ошибка.

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

См. также​