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

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

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

В проекте есть справочники Сотрудники, Клиенты и Контрагенты. Есть необходимость отбирать людей, перечисленных в этих справочниках, по городу проживания и оповещать их о встрече, которая будет проходить в этом городе. У каждого вида сущности свой способ оповещения (сотрудникам оповещения приходят по СМС, клиентам — через личный кабинет, контрагентам — по электронной почте). Процедура оповещения у каждого из них находится в модуле объекта.

Чтобы оповещать всех участников единообразно, создается контракт УчастникиОповещений, в котором есть абстрактный метод Оповестить() и свойство Город. Файл описания контракта УчастникиОповещений.yaml может выглядеть следующим образом:

ВидЭлемента: КонтрактСущности
Ид: cb011e96-79cf-4f7a-b2fa-6ba010d2b4a7
Имя: УчастникиОповещений
ОбластьВидимости: ВПроекте
Свойства:
-
Ид: 21e49337-0bf0-4270-8685-14133d807dfb
Имя: Город
Тип: Строка
ТолькоЧтение: Истина
-
Ид: 62fcacf6-8899-4b96-a52d-b4b0b5551361
Имя: Код
Тип: Строка
ТолькоЧтение: Истина

Чтобы добавить модуль объекта у контракта, следует кликнуть правой кнопкой мыши на контракт УчастникиОповещений и выбрать НовыйМодульМодуль объекта. У объекта УчастникиОповещений будет создан модуль УчастникиОповещений.Объект.xbsl. Его содержание в данном примере может выглядеть следующим образом:

абстрактный метод Оповестить()

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

ВидЭлемента: Справочник
Ид: e1c4aa2b-90eb-4246-b557-bc9f31bb4908
Имя: Сотрудники
ОбластьВидимости: ВПодсистеме
Представление: Код
Интерфейс:
ПредставлениеОбъекта: Сотрудники
НастройкиТипов:
Справочник.Объект:
Контракты:
- УчастникиОповещений.Объект
Реквизиты:
-
Имя: Код
Тип: Строка
-
Ид: 7f0730cc-b626-43f3-9ed8-18db80207c12
Имя: Фамилия
Тип: Строка
-
Ид: 65dc1b7e-bd9c-4176-9ff6-c14bfbd5f689
Имя: Имя
Тип: Строка
-
Ид: ff467efc-f5c0-4a42-af3c-8df5a6fb8d6d
Имя: Город
Тип: Строка
-
Ид: 625868cd-5ad4-47ff-84e9-5a100051f780
Имя: Телефон
Тип: Строка

Для каждого справочника следует создать модуль объекта <ИмяСправочника>.Объект.xbsl, в котором будет прописан метод Оповестить(), индивидуальный для каждого справочника. Чтобы создать модуль объекта, следует правой кнопкой мыши кликнуть на справочник, после чего выбрать НовыйМодульМодуль объекта.

Модуль объекта справочника Сотрудники.Объект.xbsl выглядит следующим образом:

@ВПроекте
@Реализация
метод Оповестить()
// Отослать приглашение по СМС.
;

В нем находится реализация метода Оповестить(), которая рассылает приглашения по СМС, т. к. мобильные телефоны всех сотрудников имеются.

В модуле объекта справочника Клиенты.Объект.xbsl реализация метода Оповестить() рассылает приглашения в клиентские личные кабинеты:

@ВПроекте
@Реализация
метод Оповестить()
// Отослать приглашение
// в личные кабинеты клиентов.
;

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

@ВПроекте
@Реализация
метод Оповестить()
// Отослать приглашение на электронную почту
// или на почтовый адрес.
;

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

метод ОповеститьУчастников(Город: Строка)

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

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

См. также