Зарисовки на тему оформления кода 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
Для отправки сообщения требуется регистрация/авторизация