OData отваливается по таймауту на больших выборках
Запрос к публикации 1С по OData висит и обрывается, стоит попросить чуть больше данных. Разбираем, почему так и как забирать большие объемы без обрывов.
Задача
OData настроили, публикация работает, мелкие запросы отвечают. Но стоит попросить выгрузку за квартал или список номенклатуры целиком - запрос висит минуту и обрывается по таймауту. Иногда падает не сразу, а на второй-третьей странице, и тогда непонятно, сколько данных вы на самом деле получили.
Знакомая картина: на тестовой базе все летает, на рабочей отваливается.
Как это решают обычно
Поднять таймауты. Первое, что делают: увеличивают время ожидания на веб-сервере и в клиенте. Иногда помогает, но чаще просто растягивает ожидание: тяжелый запрос от этого легче не становится, а база все это время занята.
Резать выборку руками. Просить данные кусками через $top и $skip. Работает, но со сдвигом есть подвох: если во время выгрузки в базе появляются новые записи, страницы начинают ехать, и часть строк вы прочитаете дважды, а часть пропустите.
Выгружать ночью. Рабочий компромисс, если данные нужны раз в сутки. Для живого приложения не годится.
Считать агрегаты на своей стороне. Скачать все движения и сложить у себя. Худший вариант по нагрузке: база отдает десятки тысяч строк ради одной цифры.
Как быстрее
Разница не в скорости сети, а в том, где выполняется работа. При OData вы забираете строки и считаете сами. Через обработку запрос выполняется внутри базы на языке запросов 1С: доступны виртуальные таблицы остатков и оборотов, группировки и итоги. Из базы уходит уже посчитанный результат, а не сырье.
Свод, который по OData требовал выгрузить двадцать тысяч движений, превращается в запрос с ИТОГИ и десяток строк ответа. Тяжелых выборок просто не возникает.
Большие объемы, когда они действительно нужны, берутся порциями: у ответа есть признак, что данные не кончились, и продолжение запрашивается смещением. Для выгрузок есть отдельный режим с файлом, чтобы не держать базу занятой все время чтения.
| Склад | Позиций | Остаток | Сумма |
|---|---|---|---|
| Основной | 1 284 | 42 160 | 8 415 000 |
| Транзитный | 96 | 1 240 | 386 000 |
| Брак | 18 | 54 | 22 400 |
Как это сделать
1. Зарегистрируйтесь в кабинете и получите ключ, скачайте обработку.
2. Откройте обработку в базе, вставьте ключ, включите обмен.
3. Перепишите тяжелые выборки в запросы с отбором и итогами: считать должна база.
4. Там, где нужны именно строки, берите их порциями и следите за признаком продолжения.
Что стоит знать заранее
Если база вам недоступна для установки обработки - например, 1С:Фреш, - OData остается единственным путем, и тогда помогают отборы, срезы последних и агрегатные запросы самого OData вместо чтения всех строк.
Запросы к одной базе выполняются по очереди, по одному: дорогой запрос задержит следующие. Отбор по периоду и ограничение строк - не формальность, а способ не занять базу надолго.
И честно про предел: если запрос тяжелый сам по себе, быстрее он не станет ни по OData, ни через обработку. Разница в том, что через обработку вы можете попросить у базы итог, а не сырые строки.
Не уверены, как подключается именно ваша база - в 1С:Фреш, в аренде, своя серверная или файловая? Выберите свой случай на главной: покажем, что мешает и что меняет мост.