Пример контракта сущности — запрос к таблице контракта, которая хранит общие данные
Цель примера — отбирать по определенному критерию участников их разных справочников и опов ещать их одинаковым образом, при условии того что для участников каждого справочника предусмотрен индивидуальный способ оповещения.
В проекте есть справочники Сотрудники, Клиенты и Контрагенты. Есть необходимость отбирать людей, перечисленных в этих справочниках, по городу проживания и оповещать их о встрече, которая будет проходить в этом городе. У каждого вида сущности свой способ оповещения (сотрудникам оповещения приходят по СМС, клиентам — через личный кабинет, контрагентам — по электронной почте). Процедура оповещения у каждого из них находится в модуле объекта.
Чтобы оповещать всех участников единообразно, создается контракт УчастникиОповещений, в котором есть абстрактный метод Оповестить()
и свойство Город. Файл описания контракта УчастникиОповещений.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 реализация метода Оповестить() рассылает приглашения на электронную почту или на почтовый адрес.
@ВПроекте
@Реализация
метод Оповестить()
// Отослать приглашение на электронную почту
// или на почтовый адрес.
;
Далее в проект можно добавить метод ОповеститьУчастников()
, в который передается массив городов. В методе при помощи языка запросов из таблицы контракта выбираются нужные экземпляры сущности, после чего у каждой из них вызывается собственный метод Оповестить()
:
метод ОповеститьУчастников(Город: Строка)
// Задать текст запроса.
пер Запрос = Запрос{ВЫБРАТЬ
Участники.Ссылка КАК Ссылка
ИЗ
УчастникиОповещений КАК Участники
ГДЕ
Участники.Город == %Город}
// Обойти результат запроса и обработать его.
для СтрокаРезультата из Запрос.Выполнить()
// Загрузить объект
пер УчастникОбъект = СтрокаРезультата.Ссылка.ЗагрузитьОбъект()
// Вызывать у объекта метод Оповестить().
УчастникОбъект.Оповестить()
;
;