Пример контракта сущности — запрос к таблице контракта, которая хранит общие данные
Цель примера — организовать отправку данных из разных планов обмена по единому правилу, при этом каждый план обмена использует собственный механизм передачи сообщений.
В проекте определены два плана обмена: ОбменСоСкладом и ОбменСМагазином. Необходимо отправлять сообщения с изменениями через каждый из этих планов, но способ отправки различается:
- ОбменСоСкладом формирует файлы сообщений в локальную директорию,
- ОбменСМагазином отправляет сообщения по HTTP на внешний шлюз.
Чтобы унифицировать вызов отправки, создается контракт сущности УчастникиОбмена, который содержит абстрактный метод ОтправитьДанные() в модуле объекта, свойство ТипСообщения и свойство ТаблицыКонтракта со значением Доступны.
ВидЭлемента: КонтрактСущности
ОбластьВидимости: ВПодсистеме
Ид: 014b6f70-04ca-4b80-bcae-d70794633f61
Имя: УчастникиОбмена
ТаблицыКонтракта: Доступны
Свойства:
-
Ид: 7e20f982-94b5-4857-b4c5-b92ab288b38d
Имя: ТипСообщения
Тип: Строка
абстрактный метод ОтправитьДанные()
Тогда реализация плана обмена ОбменСоСкладом может выглядеть следующим образом:
ВидЭлемента: ПланОбмена
ОбластьВидимости: ВПодсистеме
Ид: aafcb4df-5aaf-44eb-8518-6b3b1f4c1deb
Имя: ОбменСоСкладом
НастройкиТипов:
ПланОбмена.Объект:
Контракты:
- УчастникиОбмена.Объект
Реквизиты:
-
Имя: Наименование
-
Ид: 7bab7eab-afe2-40f0-be8b-b39923c906b8
Имя: ТипСообщения
Тип: Строка
@ВПроекте
@Реализация
метод ОтправитьДанные()
// Формирование файла сообщения в локальную папку
;
Аналогичным образом реализуется ОбменСМагазином:
ВидЭлемента: ПланОбмена
ОбластьВидимости: ВПодсистеме
Ид: daccf8c6-c182-4a14-bad9-db0e1d388707
Имя: ОбменСМагазином
НастройкиТипов:
ПланОбмена.Объект:
Контракты:
- УчастникиОбмена.Объект
Реквизиты:
-
Имя: Наименование
-
Ид: 33bfe8a8-322c-4975-91bc-bc0b70c238b4
Имя: ТипСообщения
Тип: Строка
@ВПроекте
@Реализация
метод ОтправитьДанные()
// Отправка через HTTP-шлюз
;
Далее в проект можно добавить общий модуль с методом ОтправитьВсемУчастникам(), который:
- выбирает из таблицы контракта УчастникиОбмена все объекты, реализующие контракт;
- для каждого из них вызывает его собственную реализацию
ОтправитьДанные().
метод ОтправитьВсемУчастникам(ТипСообщенияДляФильтра: Строка)
пер Запрос = Запрос{
ВЫБРАТЬ
Участники.Ссылка КАК Ссылка
ИЗ
УчастникиОбмена КАК Участники
ГДЕ
Участники.ТипСообщения == %ТипСообщенияДляФильтра
}
для СтрокаРезультата из Запрос.Выполнить()
пер ОбъектУчастника = СтрокаРезультата.Ссылка.ЗагрузитьОбъект()
ОбъектУчастника.ОтправитьДанные()
;
;
При вызове ОтправитьВсемУчастникам("Инвентаризация") «1С:Шина»:
- найдет все планы обмена, у которых свойство ТипСообщения равно Инвентаризация;
- для плана обмена ОбменСоСкладом создаст файл сообщения;
- для плана обмена ОбменСМагазином отправит данные через HTTP.
Таким образом каждый план обмена реализует свой способ передачи данных, но вызывается через единый контракт.