Пример контракта сервиса
Цель примера — изолировать код подсистемы от других частей приложения.
В проекте есть подсистема ПодсистемаРасчетЗарплаты. К ней за данными обращаются другие подсистемы. Для этого они используют контракт 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РасчетаЗарплаты.
Для получения реализации контракта используется его метод ПолучитьСервис().