19 марта, 2024

REST сервис для 1С 7.7 продолжение

После нескольких недель работы с базой через http-сервис хочу поделиться несколькими замечаниями относительно особенностей работы с 1С — и самой по себе и как с COM-объектом.

Рабочий код текущей версии сервиса и пример модуля 1С можно посмотреть на GitHub: REST service for 1C77 application. Используемое Андроид-приложение: Помощник.

Напомню упрощенную схему взаимодействия:

Основная проблема — таймаут ожидания ответа. Если выполнение выборки данных занимает более 4-5 секунд, с большой вероятностью линк оборвется и Андроид уже начнет посылать повторные запросы, а Томкат еще будет ждать ответ на первый. Увеличение таймаута на стороне андроид-приложения не намного спасает ситуацию, пока что для меня до конца непонятно, в какой момент происходит разрыв. В текущей реализации на стороне 1С все выборки максимально упрощены и минимизированы:

  • в выборку документов попадают только последние 100 элементов
  • при выборке содержимого документа передаются только первые 300 строк
  • для ускорения выборки справочника в конфигурации добавлен реквизит «ОтборПоРодителю» который предварительно заполнен — в нем указан код непосредственного родителя элемента, это дает возможность отобрать элементы внутри определенной группы, но не выбирать вложенные подгруппы, как это происходит при использовании встроенного механизма иерархии «ИспользоватьРодителя»
  • поиск по справочнику работает только по полному коду товара, как оказалось, поиск «по первым символам» в наименовании часто сильно «подвешивает» базу

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

Получается, что если запрос поступает в тот момент когда 1С уже занята выборкой данных, возвращается пустой ответ. Возможно, следует вернуть сообщение о том что база данных недоступна и обработать это на стороне клиента, но пока что в моем проекте нагрузка небольшая и такие случаи происходят редко.

Последнее. Вместо описанной ранее структуры сервиса я переписал всё по принципу однотипный запрос — однотипный ответ. В сервисе только один ресурс, на который можно делать POST запросы, тело запроса одной структуры: JSON документ с полями userID, type, data. Поле type содержит тип запроса-команды, поле data — данные для обработки. Аналогично ответ всегда имеет один набор полей: result, data, message, token. Результат «ok/error», выборка данных, сообщение в случае ошибки. Такое решение позволяет обойти ограничения передачи кириллицы в параметрах, как это было в случае GET запросов.