При интеграции 1С с высоконагруженными внешними сервисами (биржами, системами телеметрии, трекерами заказов) разработчики часто сталкиваются с задачей отображения данных в режиме реального времени (например, каждые 1–2 секунды). Стандартная связка из фонового задания, записи в регистр сведений и вызова метода Элементы.ДинамическийСписок.Обновить() по таймеру через ПодключитьОбработчикОжидания() приводит к микрозависаниям интерфейса, дерганию скролла и блокировке действий пользователя. Разберем причины такого поведения платформы и рассмотрим эффективные варианты решения этой проблемы.
Проанализируем ключевые факторы, которые вызывают блокировку пользовательского интерфейса при частом обновлении данных:
Обновить() динамического списка инициирует синхронный контекстный вызов сервера. Клиентский поток платформы 1С однопоточен: на время выполнения запроса к СУБД, передачи выборки по сети и перерисовки таблицы интерфейс полностью замораживается и меняется курсор мыши.Для небольших объемов данных (десятки или сотни строк) использование динамического списка избыточно. Гораздо эффективнее использовать реквизит формы типа ТаблицаЗначений. В этом случае мы исключаем тяжелые повторные инициализации списка платформой и обновляем только изменившиеся строки.
Посмотрим на базовую схему работы:
ТаблицаКотировок.ПодключитьОбработчикОжидания() запрашиваем с сервера или внешнего источника только дельту (изменившиеся записи).НайтиСтроки().
&НаКлиенте
Процедура ОбработчикОбновления() Экспорт
// Получаем массив только изменившихся данных
МассивИзменений = ПолучитьОбновленияНаСервере();
Для Каждого СтрДанных Из МассивИзменений Цикл
Отбор = Новый Структура("ВалютнаяПара", СтрДанных.ВалютнаяПара);
НайденныеСтроки = ТаблицаКотировок.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() > 0 Тогда
СтрокаТаблицы = НайденныеСтроки[0];
СтрокаТаблицы.Цена = СтрДанных.Цена;
СтрокаТаблицы.Объем = СтрДанных.Объем;
Иначе
НоваяСтрока = ТаблицаКотировок.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрДанных);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Рассмотрим архитектурное разделение: высокочастотные данные для оперативной работы пользователя не обязательно сразу сохранять в базу данных 1С. Объект HTTPСоединение доступен на клиенте, что позволяет открытой форме получать поток котировок напрямую с API биржи без транзакционной нагрузки на информационную базу.
Если требуется непрерывный поток данных высокой частоты (несколько обновлений в секунду) с мгновенной перерисовкой без участия серверного контекста 1С, наиболее производительным решением является вывод интерфейса через ПолеHTMLДокумента.
Разберем по шагам, как устроена такая схема:
ПолеHTMLДокумента.Если от динамических списков и хранения в регистре отказаться невозможно, обязательным шагом является перевод базы с файлового режима на клиент-серверный вариант (MS SQL Server, PostgreSQL).
В современных СУБД механизм управления версиями строк (уровень изоляции Read Committed Snapshot Isolation в MS SQL или MVCC в PostgreSQL) гарантирует, что операции чтения динамического списка не блокируются фоновыми операциями записи данных в регистр сведений. Это позволяет практически полностью устранить долгие ожидания на блокировках таблиц.