Пример контракта типа — справочники
Цель примера — одинаковым образом обрабатывать элементы разных справочников.
В проекте есть справочники Сотрудники, Партнеры и Контрагенты. Есть мероприятия, на которые приглашаются люди, перечисленные в этих справочниках.
Человек вручную составляет список приглашенных на мероприятие. В проекте существует алгоритм, который рассылает приглашения всем людям из списка. Приглашение состоит из кода регистрации и текста приглашения.
Код регистрации уникальный, алгоритм рассылки приглашений формирует его случайным образом. Код нужно хранить вместе с элементом справочника до тех пор, пока человек не зарегистрируется, чтобы:
- повторно пригласить человека, если он до сих пор не зарегистрировался;
- повторно отослать приглашение, если человек его потерял.
Чтобы одинаковым образом работать с элементами разных справочников, в проекте есть контракт КонтрактМероприятий. Файл его описания КонтрактМероприятий.yaml выглядит следующим образом:
ВидЭлемента: КонтрактТипа
Ид: 016c238c-2461-47e9-a379-398e16b2ffb2
ОбластьВидимости: ВПодсистеме
Имя: КонтрактМероприятий
Окружение: КлиентИСервер
Свойства:
-
Имя: КодРегистрации
Тип: Строка
В нем объявлено свойство КодРегистрации типа Строка. В этом свойстве будет храниться код регистрации элемента справочника.
Модуль контракта КонтрактМероприятий.xbsl выглядит следующим образом.
абстрактный метод Записать()
абстрактный метод Пригласить()
В нем объявлены два метода:
- Записать() — для записи элемента системным методом (имя-справочника.Объект.Записать());
- Пригласить() — для отсылки приглашения на мероприятие.
Реализация этого контракта находится в справочниках Сотрудники, Партнеры и Контрагенты — три реализации.
У каждого из этих справочников есть реквизит КодРегистрации типа Строка, чтобы хранить код регистрации вместе с элементом.
Например, описание справочника Сотрудники.yaml выглядит следующим образом.
ВидЭлемента: Справочник
Имя: Сотрудники
Ид: b8da6c4d-0929-4241-98ad-17aa8d5e4522
ОбластьВидимости: ВПодсистеме
ИспользоватьВПолнотекстовомПоиске: Истина
КонтрольДоступа:
Создание: РазрешеноАдминистраторам
Чтение: РазрешеноАдминистраторам
Изменение: РазрешеноАдминистраторам
Удаление: РазрешеноАдминистраторам
НастройкиТипов:
Справочник.Объект:
Контракты:
- КонтрактМероприятий
Реквизиты:
-
Имя: Код
Тип: Строка
СерииНумерации:
- Префикс
- Постфикс
-
Ид: 6e9e044b-0d34-4dc3-9241-e7082874e2c9
Имя: КодРегистрации
Тип: Строка
ИспользоватьВПолнотекстовомПоиске: Ложь
-
Ид: 982dccd4-57e2-4eda-92db-f547ab85126a
Имя: Имя
Тип: Строка
Модуль объекта справочника Сотрудники.Объект.xbsl выглядит следующим образом:
@ВПроекте
@Реализация
метод Пригласить()
// Отослать приглашение по СМС.
;
В нем находится реализация метода Пригласить(), которая рассылает приглашения по СМС, т. к. мобильные телефоны всех сотрудников имеются.
В модуле объекта справочника Партнеры.Объект.xbsl реализация метода Пригласить() рассылает приглашения в личные кабинеты партнерского сервиса, т. к. все партнеры подключены к этому сервису.
@ВПроекте
@Реализация
метод Пригласить()
// Отослать приглашение
// в личный кабинет партнерского сервиса.
;
В модуле объекта справочника Контрагенты.Объект.xbsl реализация метода Пригласить() рассылает приглашения на электронную почту или на почтовый адрес.
@ВПроекте
@Реализация
метод Пригласить()
// Отослать приглашение на электронную почту
// или на почтовый адрес.
;
Сигнатура метода Записать() в контракте совпадает с сигнатурой системного метода объекта справочника имя-справочника.Объект.Записать(). Поэтому его реализацией является сам этот системный метод.
абстрактный метод Записать()
Алгоритм рассылки приглашений в общем модуле выглядит следующим образом.
@НаСервере
метод РассылкаПриглашений(МассивУчастников: Массив<КонтрактМероприятий>)
для Участник из МассивУчастников
Участник.КодРегистрации = ПолучитьКодРегистрации()
Участник.Записать()
Участник.Пригласить()
;
;
@НаСервере
метод ПолучитьКодРегистрации(): Строка
// Получить уникальный код регистрации.
возврат ""
;
Метод получает список сотрудников, партнеров и контрагентов, сформированный человеком. Это массив экземпляров Сотрудники.Объект, Партнеры.Объект, Контрагенты.Объект).
Для экземпляра:
- В свойство КодРегистрации устанавливает уникальный код;
- Вызывает метод Записать(), чтобы сохранить эти данные;
- Вызывает метод Пригласить(), чтобы отослать приглашение.