Пример контракта типа — справочники

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

В проекте есть справочники Сотрудники, Партнеры и Контрагенты. Есть мероприятия, на которые приглашаются люди, перечисленные в этих справочниках.

Человек вручную составляет список приглашенных на мероприятие. В проекте существует алгоритм, который рассылает приглашения всем людям из списка. Приглашение состоит из кода регистрации и текста приглашения.

Код регистрации уникальный, алгоритм рассылки приглашений формирует его случайным образом. Код нужно хранить вместе с элементом справочника до тех пор, пока человек не зарегистрируется, чтобы:

  • повторно пригласить человека, если он до сих пор не зарегистрировался;
  • повторно отослать приглашение, если человек его потерял.

Чтобы одинаковым образом работать с элементами разных справочников, в проекте есть контракт КонтрактМероприятий. Файл его описания КонтрактМероприятий.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 реализация метода Пригласить() рассылает приглашения на электронную почту или на почтовый адрес.

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

Сигнатура метода Записать() в контракте совпадает с сигнатурой системного метода объекта справочника имя-справочника.Объект.Записать(). Поэтому его реализацией является сам этот системный метод.

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

Алгоритм рассылки приглашений в общем модуле выглядит следующим образом.

@НаСервере
метод РассылкаПриглашений(МассивУчастников: Массив<КонтрактМероприятий>)
    для Участник из МассивУчастников
        Участник.КодРегистрации = ПолучитьКодРегистрации()
        Участник.Записать()
        Участник.Пригласить()
    ;
;

@НаСервере
метод ПолучитьКодРегистрации(): Строка
    // Получить уникальный код регистрации.
    возврат ""
;

Метод получает список сотрудников, партнеров и контрагентов, сформированный человеком. Это массив экземпляров Сотрудники.Объект, Партнеры.Объект, Контрагенты.Объект).

Для экземпляра:

  • В свойство КодРегистрации устанавливает уникальный код;
  • Вызывает метод Записать(), чтобы сохранить эти данные;
  • Вызывает метод Пригласить(), чтобы отослать приглашение.