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

Пример контракта сущности — запрос к таблице контракта, которая хранит общие данные

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

В проекте определены два плана обмена: ОбменСоСкладом и ОбменСМагазином. Необходимо отправлять сообщения с изменениями через каждый из этих планов, но способ отправки различается:

  • ОбменСоСкладом формирует файлы сообщений в локальную директорию,
  • ОбменСМагазином отправляет сообщения по HTTP на внешний шлюз.

Чтобы унифицировать вызов отправки, создается контракт сущности УчастникиОбмена, который содержит абстрактный метод ОтправитьДанные() в модуле объекта, свойство ТипСообщения и свойство ТаблицыКонтракта со значением Доступны.

УчастникиОбмена.yaml
ВидЭлемента: КонтрактСущности
ОбластьВидимости: ВПодсистеме
Ид: 014b6f70-04ca-4b80-bcae-d70794633f61
Имя: УчастникиОбмена
ТаблицыКонтракта: Доступны
Свойства:
-
Ид: 7e20f982-94b5-4857-b4c5-b92ab288b38d
Имя: ТипСообщения
Тип: Строка
УчастникиОбмена.Объект.xbsl
абстрактный метод ОтправитьДанные()

Тогда реализация плана обмена ОбменСоСкладом может выглядеть следующим образом:

ОбменСоСкладом.yaml
ВидЭлемента: ПланОбмена
ОбластьВидимости: ВПодсистеме
Ид: aafcb4df-5aaf-44eb-8518-6b3b1f4c1deb
Имя: ОбменСоСкладом
НастройкиТипов:
ПланОбмена.Объект:
Контракты:
- УчастникиОбмена.Объект
Реквизиты:
-
Имя: Наименование
-
Ид: 7bab7eab-afe2-40f0-be8b-b39923c906b8
Имя: ТипСообщения
Тип: Строка
ОбменСоСкладом.Объект.xbsl
@ВПроекте
@Реализация
метод ОтправитьДанные()
// Формирование файла сообщения в локальную папку
;

Аналогичным образом реализуется ОбменСМагазином:

ОбменСМагазином.yaml
ВидЭлемента: ПланОбмена
ОбластьВидимости: ВПодсистеме
Ид: daccf8c6-c182-4a14-bad9-db0e1d388707
Имя: ОбменСМагазином
НастройкиТипов:
ПланОбмена.Объект:
Контракты:
- УчастникиОбмена.Объект
Реквизиты:
-
Имя: Наименование
-
Ид: 33bfe8a8-322c-4975-91bc-bc0b70c238b4
Имя: ТипСообщения
Тип: Строка

ОбменСМагазином.Объект.xbsl
@ВПроекте
@Реализация
метод ОтправитьДанные()
// Отправка через HTTP-шлюз
;

Далее в проект можно добавить общий модуль с методом ОтправитьВсемУчастникам(), который:

  • выбирает из таблицы контракта УчастникиОбмена все объекты, реализующие контракт;
  • для каждого из них вызывает его собственную реализацию ОтправитьДанные().
ОбщийМодуль.xbsl
метод ОтправитьВсемУчастникам(ТипСообщенияДляФильтра: Строка)

пер Запрос = Запрос{
ВЫБРАТЬ
Участники.Ссылка КАК Ссылка
ИЗ
УчастникиОбмена КАК Участники
ГДЕ
Участники.ТипСообщения == %ТипСообщенияДляФильтра
}

для СтрокаРезультата из Запрос.Выполнить()
пер ОбъектУчастника = СтрокаРезультата.Ссылка.ЗагрузитьОбъект()
ОбъектУчастника.ОтправитьДанные()
;
;

При вызове ОтправитьВсемУчастникам("Инвентаризация") «1С:Шина»:

  • найдет все планы обмена, у которых свойство ТипСообщения равно Инвентаризация;
  • для плана обмена ОбменСоСкладом создаст файл сообщения;
  • для плана обмена ОбменСМагазином отправит данные через HTTP.

Таким образом каждый план обмена реализует свой способ передачи данных, но вызывается через единый контракт.

См. также​