Зарисовки на тему оформления кода HTTP-сервиса 3. Провайдер данных

02.07.26

Интеграция - WEB-интеграция

Третья статья на тему взаимосвязей модулей http-сервиса и приемов оформления кода. Модуль отвечающий за доступ к данным: требования и цели, особенности среды. Примеры кода на базе пет-проекта «Управление задачами». Пагинация.

Начало: Слои и модуль СервисаВалидация данных

Поговорим о модуле РаботаСЗадачамиРеализация

Цель модуля - инкапсуляция логики доступа к данным и предоставление единого интерфейса для работы с ними. Считаю, что внедренные подсистемы, являются частью данных, поэтому и доступ к их методам можно включать в этот интерфейс при необходимости.

Требования: никакой бизнес логики, на выходе максимально сырые данные.

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

 

Подходы к доступу к данным

  1. Объектная модель – только примитивы

  2. Табличная модель – основной инструмент

  3. Через программный интерфейс встроенных подсистем, как особенность среды

 

Объектная модель

 
 Использую самую примитивную:

 

Табличная модель

Основной инструмент, но объем выборки должен быть ограничен (фильтры, пагинация). А на выходе только: выгрузки, выборки или агрегированные данные, никаких преобразований.

Пример выгрузки списка задач. Поддерживаю два способа пагинации: страничный и курсором. И фильтр.

 
 Функция СписокЗадачВыгрузка(НастройкиПолученияЗадач, ФильтрЗадач, ЗадачНаСтраницу) Экспорт

 

Конструкторы для настроек (и необходимые константы), которые принимает метод, также являются частью интерфейса. Настройки заполняются извне, сервисом.

 
 Конструкторы и константы

 

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

 
 Функция НовыйЗапросПакетСпискаЗадачСПагинацией(Пагинация, Фильтр, ЗадачНаСтраницу)

 

Пример, получения агрегированных данных с наложением фильтра

 
 Функция СписокЗадачКоличество(Фильтр) Экспорт

 

Пример, выборки с ограничением

 
 Функция ФайлыЗадачВыборка(Ссылки) Экспорт

 

Программный интерфейс встроенных подсистем

 
 От простого – получение константы или вызова преобразований
 
 До специального

 

Как выносить логику

В начале обработчика каждого запроса модуля сервиса присутствуют проверки:

// Модуль сервиса РаботаСЗадачами
Функция ПолучитьЗадачи(Запрос)
    
    Если РаботаСЗадачамиHTTP.ЗаблокированоОбновлением() Тогда Возврат ОтветЗаблокированоОбновлением() КонецЕсли;
    
    Заголовки = Новый Соответствие;
    Если РаботаСЗадачамиHTTP.ПревышеноЧислоЗапросов(Заголовки) Тогда
        
        Возврат ОтветПревышеноЧислоЗапросов(Заголовки)
    КонецЕсли;

    // ...

Нас интересует реализация РаботаСЗадачамиHTTP.ПревышеноЧислоЗапросов(Заголовки)

Это защита нашего сервиса от большого числа запросов в какую-то определенную единицу времени. Мы фиксируем (в регистре сведений) время каждого запроса и при каждом очередном запросе сверяем с установленным допустимым максимумом. Если максимум не достигнут, то выполняем запрос, достигнут – формируем ответ с соответствующими заголовками и прерываем выполнение.

Максимально неверная реализация:

// ОМ РаботаСЗадачамиHTTP
Функция ПревышеноЧислоЗапросов(РезультатЗаголовки) Экспорт
    
    Если РаботаСЗадачамиРеализация.ПревышеноЧислоЗапросов() Тогда
        
        РезультатЗаголовки.Вставить("Retry-After", 20); // какое-то число сек. ожидания
        Возврат Истина
    КонецЕсли;
        
    Возврат Ложь
КонецФункции

// ОМ РаботаСЗадачамиРеализация
Функция ПревышеноЧислоЗапросов() Экспорт
    
    // какие-то магические числа
    МаксимумЗапросов = 2;
    ВремяОжидания = 20;
    
    ТекущееВремя = ТекущаяУниверсальнаяДатаВМиллисекундах();

    Граница = ТекущееВремя - ВремяОжидания * 1000;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   КОЛИЧЕСТВО(СчетчикЗапросовHTTP.ВремяЗапросаВМиллисекундах) КАК КоличествоЗапросов
        |ИЗ
        |   РегистрСведений.СчетчикЗапросовHTTP КАК СчетчикЗапросовHTTP
        |ГДЕ
        |   СчетчикЗапросовHTTP.ВремяЗапросаВМиллисекундах > &ВремяЗапросаВМиллисекундах";
    
    Запрос.УстановитьПараметр("ВремяЗапросаВМиллисекундах", Граница);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    
    // логика, которую не контролирует контроллер
    Если Выборка.КоличествоЗапросов > МаксимумЗапросов Тогда
        Возврат Истина;
    КонецЕсли;
    
    // логика, которую не контролирует контроллер
    Запись = РегистрыСведений.СчетчикЗапросовHTTP.СоздатьМенеджерЗаписи();
    Запись.ВремяЗапросаВМиллисекундах = ТекущееВремя;
    Запись.Записать();
    
    Возврат Ложь;
КонецФункции

Корректируем:

  1. ВремяОжидания и МаксимумЗапросов, о них должен знать контроллер, оформим пока в виде функций-констант, потенциально это значения объектов-констант, чтобы иметь возможность менять динамически, не модифицируя код.
  2. Метод ОМ РаботаСЗадачамиРеализация ПревышеноЧислоЗапросов() разобъем на два метода: ЧислоЗапросов(Граница) – возвращает количество сделанных запросов от Граница и ЗафиксироватьВремяЗапроса(ТекущееВремя) – зафиксировать время очередного запроса.

Таким образом мы позволим Контроллеру взять контроль над ситуацией)

// ОМ РаботаСЗадачамиHTTP
Функция ПревышеноЧислоЗапросов(РезультатЗаголовки) Экспорт
    
    ТекущееВремя = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ВремяОжидания = КонтрольЗапросовВремя();
    
    Граница = ТекущееВремя - ВремяОжидания * 1000;
    
    УстановитьПривилегированныйРежим(Истина);
    
    Если РаботаСЗадачамиРеализация.ЧислоЗапросов(Граница) > КонтрольЗапросовМаксимум() Тогда
        
        РезультатЗаголовки.Вставить("Retry-After", ВремяОжидания);
        Возврат Истина
    КонецЕсли;
    
    РаботаСЗадачамиРеализация.ЗафиксироватьВремяЗапроса(ТекущееВремя);
    
    Возврат Ложь
КонецФункции

Функция КонтрольЗапросовМаксимум()

    Возврат 2
КонецФункции

Функция КонтрольЗапросовВремя()

    Возврат 20
КонецФункции

// ОМ РаботаСЗадачамиРеализация
#Область УправлениеЧисломЗапросов

Функция ЧислоЗапросов(Граница) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   КОЛИЧЕСТВО(СчетчикЗапросовHTTP.ВремяЗапросаВМиллисекундах) КАК КоличествоЗапросов
        |ИЗ
        |   РегистрСведений.СчетчикЗапросовHTTP КАК СчетчикЗапросовHTTP
        |ГДЕ
        |   СчетчикЗапросовHTTP.ВремяЗапросаВМиллисекундах > &ВремяЗапросаВМиллисекундах";
    
    Запрос.УстановитьПараметр("ВремяЗапросаВМиллисекундах", Граница);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    
    Возврат Выборка.КоличествоЗапросов
КонецФункции

Процедура ЗафиксироватьВремяЗапроса(ТекущееВремя) Экспорт

    Запись = РегистрыСведений.СчетчикЗапросовHTTP.СоздатьМенеджерЗаписи();
    
    Запись.ВремяЗапросаВМиллисекундах = ТекущееВремя;
    Запись.Записать();
КонецПроцедуры

#КонецОбласти

 

Новые объекты

При создании объектов удобно использовать метод Заполнить() объекта, который принимает параметры заполнения. Для подготовки параметров заполнения создаем специальный метод интерфейса провайдера данных, который возьмет их из менеджера объекта (если они там предложены) или подготовит с нуля.

 
 Функция ЗадачаСотрудникаПараметрыЗаполнения() Экспорт

 

Модификация объектов

К счастью, сервис моего пет-проекта не содержим методов по изменению объектов. Если они были, то пришлось бы задуматься о следующем:

  1. Объект, который необходимо изменить, заблокирован
  2. Перед изменением целевой объект необходимо заблокировать
  3. Целевой объект изменен ранее, возможно, запрос устарел?

 

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

 

 

Критикуйте, делитесь, предлагайте.

Всем успехов в проектировании http-сервисов!

Вступайте в нашу телеграмм-группу Инфостарт

HTTP-сервис Архитектура Слои Провайдер данных Пагинация

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

42700 руб.

03.08.2020    24702    38    26    

29

WEB-интеграция Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Расширение для автоматизации передачи данных между сервисом Vetmanager с 1С: Бухгалтерия 3.0. Решение позволяет загружать документы и справочники из Ветменеджер в 1С:Бухгалтерию, сокращая время на ручной ввод данных и минимизируя ошибки.

24000 руб.

02.02.2021    23404    73    52    

44

WEB-интеграция Программист Бизнес-аналитик 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17568 руб.

20.12.2024    6666    28    4    

30

WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена по API между конфигурацией 1С:Альфа-Авто 6 и порталом LogicStar. Позволяет работать с несколькими обменами LogicStar разных брендов (CHERY, OMODA, JAECOO, EXEED, TENET) в одной информационной базе в ручном и автоматическом режиме. Поддерживается выгрузка заказ-нарядов, реализаций товаров и товарных остатков.

20740 руб.

13.05.2025    2356    2    0    

5
Для отправки сообщения требуется регистрация/авторизация