Создание дашбордов в 1С — это всегда баланс между информативностью и производительностью. Часто разработчики сталкиваются с проблемой: когда в системе меняется статус одной заявки, приходится перегружать всю таблицу или дерево значений на форме. На больших объемах данных это приводит к «замиранию» интерфейса и раздражению пользователей. В этой статье мы подробно разберем, как уйти от полной перезагрузки данных и реализовать по-настоящему «живой» дашборд.
Многие недооценивают возможности стандартного объекта ДинамическийСписок. Проанализируем механизм его работы: в отличие от таблицы значений, он не считывает все записи сразу. Платформа запрашивает только те строки, которые видны пользователю в данный момент. Это критически важно для производительности.
Рассмотрим, как заставить его обновляться точечно. Если для списка задана Основная таблица, 1С автоматически отслеживает изменения объектов. Чтобы принудительно актуализировать данные без потери фокуса и «мерцания», мы можем использовать метод Обновить(). Выясним, как это работает программно:
// Пример обновления строки динамического списка
Элементы.СписокЗаявок.Обновить();
При таком вызове система не сбрасывает состояние списка, а пытается дозагрузить только изменившиеся данные в видимой области. Это самый простой и надежный способ для стандартных форм.
Если задача требует использования именно ТаблицаЗначений или ДеревоЗначений, мы можем применить стратегию «дельта-обновления». Вместо метода Очистить() и полной перезаливки, проанализируем ситуацию, когда мы меняем только конкретную строку.
Посмотрим на пример реализации через механизм оповещений. Когда в одной форме (например, в карточке заявки) происходит изменение, мы посылаем сигнал всем открытым формам дашборда:
// В форме редактирования заявки
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("Идентификатор", Объект.Ссылка);
ПараметрыОповещения.Вставить("НовыйСтатус", Объект.Статус);
Оповестить("ИзменениеСтатусаЗаявки", ПараметрыОповещения);
В форме дашборда мы ловим это событие в процедуре ОбработкаОповещения. Разберем по шагам, как найти и обновить нужную строку:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ИзменениеСтатусаЗаявки" Тогда
ПоискСтрок = ДанныеДашборда.НайтиСтроки(Новый Структура("Ссылка", Параметр.Идентификатор));
Для Каждого СтрокаТЗ Из ПоискСтрок Цикл
СтрокаТЗ.Статус = Параметр.НовыйСтатус;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Использование метода НайтиСтроки() позволяет избежать полной перерисовки интерфейса, что значительно экономит ресурсы клиентского приложения.
Для реализации максимально гибких и красивых интерфейсов рассмотрим путь использования ПолеHTMLДокумента. Этот метод позволяет встроить в 1С современные библиотеки визуализации, такие как Chart.js или ECharts. Выясним преимущества этого подхода: мы можем обновлять конкретный элемент графа через JSON-пакеты, не перегружая страницу целиком.
Проанализируем схему взаимодействия. 1С формирует JSON с обновленными данными и передает его в JavaScript-функцию внутри HTML-поля:
// Код на стороне 1С (Управляемая форма)
ДанныеДляОбновления = "[{id: 'rect1', color: 'red'}]";
Элементы.ПолеДашборда.Документ.defaultView.updateStatus(ДанныеДляОбновления);
Внутри HTML-кода функция updateStatus найдет элемент по ID и мгновенно изменит его состояние. Это позволяет создавать динамику, недоступную стандартным элементам формы 1С.
Когда данных слишком много, любая попытка получить их «здесь и сейчас» приведет к блокировке интерфейса. Разберем, как реализовать фоновое обновление. Мы запускаем сбор данных на сервере, а форма в это время остается отзывчивой.
Это стандарт де-факто для современных конфигураций. Пользователь видит индикатор загрузки, но может продолжать работу с другими элементами дашборда.
Рассмотрим ситуацию из сообщения 6: нужно перетаскивать заявки между группами (этапами процесса). Чтобы это работало мгновенно на больших объемах, используем события ПроверкаПеретаскивания и Перетаскивание.
Важный нюанс: для создания «эффекта мгновенности» (Instant UI) сначала визуально переместим строку в таблице на клиенте, и только потом отправим фоновый запрос на сервер для фактической записи в базу данных. Если сервер вернет ошибку, мы откатим визуальное изменение. Это позволяет пользователю не ждать окончания транзакции записи при каждом перемещении мышки.
Если ваш дашборд должен показывать аналитику по миллионам записей в реальном времени, стандартных индексов SQL-базы 1С может не хватить. Рассмотрим продвинутый сценарий: трансляция данных в ClickHouse. Это колончатая СУБД, идеально подходящая для аналитических запросов.
В этом случае дашборд в 1С выступает лишь «тонким» визуализатором, который делает HTTP-запрос к ClickHouse и получает готовые агрегаты за миллисекунды. Для 1С это выглядит как обычный внешний источник данных или ответ от веб-сервиса.
Современный способ доставки обновлений на форму — Система взаимодействия. Вместо того чтобы форма постоянно опрашивала сервер («не изменилось ли что?»), сервер сам присылает сообщение форме. Проанализируем этот алгоритм:
СистемаВзаимодействия.ОтправитьСообщение().Этот подход гораздо производительнее, чем стандартный Оповестить(), так как работает на уровне платформенного сервера сообщений и не нагружает основной поток выполнения кода в базе данных.
Подведем итог: для простых дашбордов достаточно правильно настроенного ДинамическогоСписка. Для сложных интерактивных панелей с графиками лучше использовать ПолеHTMLДокумента. А для систем с огромным количеством данных незаменимы фоновые задания и стратегия дельта-обновлений через ОбработкаОповещения.