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

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

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

В проекте есть подсистема ПодсистемаРасчетЗарплаты. К ней за данными обращаются другие подсистемы. Для этого они используют контракт APIРасчетаЗарплаты, который объявлен в подсистеме.

Реализация этого контракта находится в этой же подсистеме в общем модуле РасчетЗарплаты.

Разработчики зарплаты могут менять реализацию своей подсистемы от версии к версии, но контракт остается неизменным, что позволяет не изменять остальной проект.

Контракт будет иметь единственную реализацию, поэтому свойство контракта Множественный имеет значение Ложь.

ВидЭлемента: КонтрактСервиса
Ид: 090080db-f78f-4d6e-b4e5-0ed5dc39c6e4
ОбластьВидимости: ВПроекте
Имя: APIРасчетаЗарплаты
Окружение: КлиентИСервер
Обязательный: Истина
Множественный: Ложь

Значение свойства Обязательный равное Истина говорит о том, что одна реализация у этого контракта обязана быть. Это позволяет упростить использование этого контракта и не проверять перед использованием, существует ли его реализация.

Модуль контракта APIРасчетаЗарплаты.xbsl выглядит следующим образом.

// Импорт подсистемы Главная, чтобы к справочникам
// Организации и НачислениеЗарплаты обращаться по неквалифицированному имени.
импорт Главная

// Объявление типов, использующихся в параметрах методов.
структура СтруктураЗаписи
пер Поле1: Строка
пер Поле2: Число
;

структура СтруктураПоказателей
пер Поле1: Строка
пер Поле2: Число
;

структура СтруктураЗаработка
пер Поле1: Строка
пер Поле2: Число
;

// Регистрирует значения оперативных показателей расчета зарплаты.
абстрактный метод ЗаписатьЗначенияОперативныхПоказателей(
Движения: Массив<СтруктураЗаписи>,
Организация: Организации.Ссылка,
ОперативныеПоказатели: СтруктураПоказателей,
ЗаписыватьДвижения = Ложь
)

// Регистрирует данные о сдельном заработке.
абстрактный метод ЗарегистрироватьСдельныйЗаработок(
Движения: Массив<СтруктураЗаписи>,
Организация: Организации.Ссылка,
СдельныйЗаработок: СтруктураЗаработка
)

// Возвращает ссылку на заполненный документ начисления зарплаты
// или создает новый.
абстрактный метод ДокументНачисленияЗарплаты(
МесяцНачисления: ДатаВремя,
Организация: Организации.Ссылка,
Подразделение: Неопределено
): НачислениеЗарплаты.Ссылка?

// Процедура предназначена для создания документа отражения в бухучете
// из обработки РасчетЗарплаты.
абстрактный метод СоздатьДокументОтраженияВБухучете(
Организация: Организации.Ссылка,
МесяцНачисления: ДатаВремя,
СтандартнаяОбработка: Булево
)

В нем объявлены четыре метода, из которых и состоит API подсистемы:

  • ЗаписатьЗначенияОперативныхПоказателей();
  • ЗарегистрироватьСдельныйЗаработок();
  • ДокументНачисленияЗарплаты();
  • СоздатьДокументОтраженияВБухучете().

Также в нем объявлены три типа данных, СтруктураЗаписи, СтруктураПоказателей и СтруктураЗаработка, которые используются в параметрах этих методов.

Описание общего модуля РасчетЗарплаты.yaml, который реализует контракт, выглядит следующим образом.

ВидЭлемента: ОбщийМодуль
Ид: d417a5cc-a09a-403f-9c39-0c5d0ffeb8a1
ОбластьВидимости: ВПроекте
Имя: РасчетЗарплаты
Окружение: КлиентИСервер
НастройкиТипа:
Контракты:
- APIРасчетаЗарплаты

Общий модуль РасчетЗарплаты.xbsl, в котором находится реализация методов контракта, выглядит следующим образом.

// Импорт подсистемы Главная, чтобы к справочникам 
// Организации и НачислениеЗарплаты обращаться по неквалифицированному имени.
импорт Главная

// Регистрирует значения оперативных показателей расчета зарплаты.
@ВПроекте
@Реализация
метод ЗаписатьЗначенияОперативныхПоказателей(
Движения: Массив<APIРасчетаЗарплаты.СтруктураЗаписи>,
Организация: Организации.Ссылка,
ОперативныеПоказатели: APIРасчетаЗарплаты.СтруктураПоказателей,
ЗаписыватьДвижения = Ложь
)
// Тело метода.
;

// Регистрирует данные о сдельном заработке.
@ВПроекте
@Реализация
метод ЗарегистрироватьСдельныйЗаработок(
Движения: Массив<APIРасчетаЗарплаты.СтруктураЗаписи>,
Организация: Организации.Ссылка,
СдельныйЗаработок: APIРасчетаЗарплаты.СтруктураЗаработка
)
// Тело метода.
;

// Возвращает ссылку на заполненный документ начисления зарплаты
// или создает новый.
@ВПроекте
@Реализация
метод ДокументНачисленияЗарплаты(
МесяцНачисления: ДатаВремя,
Организация: Организации.Ссылка,
Подразделение: Неопределено
): НачислениеЗарплаты.Ссылка?
// Тело метода.
возврат Неопределено
;

// Процедура предназначена для создания документа отражения в бухучете
// из обработки РасчетЗарплаты.
@ВПроекте
@Реализация
метод СоздатьДокументОтраженияВБухучете(
Организация: Организации.Ссылка,
МесяцНачисления: ДатаВремя,
СтандартнаяОбработка: Булево
)
// Тело метода.
;

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

// Импорт подсистемы ПодсистемаРасчетЗарплаты, чтобы к модулю APIРасчетаЗарплаты
// обращаться по неквалифицированному имени.
импорт ПодсистемаРасчетЗарплаты

@НаСервере
метод Алгоритм()

// Заполнить коллекцию движений.
пер КоллекцияДвижений: Массив<APIРасчетаЗарплаты.СтруктураЗаписи>
пер Запись = новый APIРасчетаЗарплаты.СтруктураЗаписи("строка", 2)
КоллекцияДвижений.Добавить(Запись)

// Найти организацию.
пер Организация = Организации.НайтиПоКоду(8)

// Заполнить структуру показателей.
пер ОперативныеПоказатели = новый APIРасчетаЗарплаты.СтруктураПоказателей("показатель", 3)

// Вызвать реализацию метода ЗаписатьЗначенияОперативныхПоказателей().
пер СервисРасчета = APIРасчетаЗарплаты.ПолучитьСервис()
СервисРасчета.ЗаписатьЗначенияОперативныхПоказателей(
КоллекцияДвижений,
Организация,
ОперативныеПоказатели,
Истина
)
;

Чтобы упростить обращения пространство имен подсистемы ПодсистемаРасчетЗарплаты импортируется в модуль.

Для обращения к типам данных, объявленным в контракте, используется имя контракта APIРасчетаЗарплаты.

Для получения реализации контракта используется его метод ПолучитьСервис().

См. также