Сервис доступа к данным 1С для внешних систем
Жёлтый мост
Практика · Программисту 1С

OData отваливается по таймауту на больших выборках

Запрос к публикации 1С по OData висит и обрывается, стоит попросить чуть больше данных. Разбираем, почему так и как забирать большие объемы без обрывов.

Задача

OData настроили, публикация работает, мелкие запросы отвечают. Но стоит попросить выгрузку за квартал или список номенклатуры целиком - запрос висит минуту и обрывается по таймауту. Иногда падает не сразу, а на второй-третьей странице, и тогда непонятно, сколько данных вы на самом деле получили.

Знакомая картина: на тестовой базе все летает, на рабочей отваливается.

Как это решают обычно

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

Резать выборку руками. Просить данные кусками через $top и $skip. Работает, но со сдвигом есть подвох: если во время выгрузки в базе появляются новые записи, страницы начинают ехать, и часть строк вы прочитаете дважды, а часть пропустите.

Выгружать ночью. Рабочий компромисс, если данные нужны раз в сутки. Для живого приложения не годится.

Считать агрегаты на своей стороне. Скачать все движения и сложить у себя. Худший вариант по нагрузке: база отдает десятки тысяч строк ради одной цифры.

Как быстрее

Путь данных: тяжелую работу делает база, наружу уходит результат
1С: ваша базадокументы, остатки, движения
Обработка Жёлтого мостаоткрытый код, считает запрос внутри базы
Шлюз onecdatalink.ruпорции, ключи, маскировка
ИИ-ассистент или ваше приложениепривычный ИИ-чат, свой код, дашборд

Разница не в скорости сети, а в том, где выполняется работа. При OData вы забираете строки и считаете сами. Через обработку запрос выполняется внутри базы на языке запросов 1С: доступны виртуальные таблицы остатков и оборотов, группировки и итоги. Из базы уходит уже посчитанный результат, а не сырье.

Свод, который по OData требовал выгрузить двадцать тысяч движений, превращается в запрос с ИТОГИ и десяток строк ответа. Тяжелых выборок просто не возникает.

Большие объемы, когда они действительно нужны, берутся порциями: у ответа есть признак, что данные не кончились, и продолжение запрашивается смещением. Для выгрузок есть отдельный режим с файлом, чтобы не держать базу занятой все время чтения.

Так выглядит ответ на сводный запрос: вместо двадцати тысяч строк движений - итог по складам
СкладПозицийОстатокСумма
Основной1 28442 1608 415 000
Транзитный961 240386 000
Брак185422 400

Как это сделать

1. Зарегистрируйтесь в кабинете и получите ключ, скачайте обработку.

2. Откройте обработку в базе, вставьте ключ, включите обмен.

3. Перепишите тяжелые выборки в запросы с отбором и итогами: считать должна база.

4. Там, где нужны именно строки, берите их порциями и следите за признаком продолжения.

Что стоит знать заранее

Если база вам недоступна для установки обработки - например, 1С:Фреш, - OData остается единственным путем, и тогда помогают отборы, срезы последних и агрегатные запросы самого OData вместо чтения всех строк.

Запросы к одной базе выполняются по очереди, по одному: дорогой запрос задержит следующие. Отбор по периоду и ограничение строк - не формальность, а способ не занять базу надолго.

И честно про предел: если запрос тяжелый сам по себе, быстрее он не станет ни по OData, ни через обработку. Разница в том, что через обработку вы можете попросить у базы итог, а не сырые строки.

Не уверены, как подключается именно ваша база - в 1С:Фреш, в аренде, своя серверная или файловая? Выберите свой случай на главной: покажем, что мешает и что меняет мост.

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