Как реализовать интерактивный дашборд в 1С с точечным обновлением данных?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

Создание дашбордов в 1С — это всегда баланс между информативностью и производительностью. Часто разработчики сталкиваются с проблемой: когда в системе меняется статус одной заявки, приходится перегружать всю таблицу или дерево значений на форме. На больших объемах данных это приводит к «замиранию» интерфейса и раздражению пользователей. В этой статье мы подробно разберем, как уйти от полной перезагрузки данных и реализовать по-настоящему «живой» дашборд.

Использование Динамического списка для частичного обновления

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

Рассмотрим, как заставить его обновляться точечно. Если для списка задана Основная таблица, 1С автоматически отслеживает изменения объектов. Чтобы принудительно актуализировать данные без потери фокуса и «мерцания», мы можем использовать метод Обновить(). Выясним, как это работает программно:


// Пример обновления строки динамического списка
Элементы.СписокЗаявок.Обновить();

При таком вызове система не сбрасывает состояние списка, а пытается дозагрузить только изменившиеся данные в видимой области. Это самый простой и надежный способ для стандартных форм.

Механизм оповещений и точечная правка Таблицы значений

Если задача требует использования именно ТаблицаЗначений или ДеревоЗначений, мы можем применить стратегию «дельта-обновления». Вместо метода Очистить() и полной перезаливки, проанализируем ситуацию, когда мы меняем только конкретную строку.

Посмотрим на пример реализации через механизм оповещений. Когда в одной форме (например, в карточке заявки) происходит изменение, мы посылаем сигнал всем открытым формам дашборда:


// В форме редактирования заявки
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("Идентификатор", Объект.Ссылка);
ПараметрыОповещения.Вставить("НовыйСтатус", Объект.Статус);
Оповестить("ИзменениеСтатусаЗаявки", ПараметрыОповещения);

В форме дашборда мы ловим это событие в процедуре ОбработкаОповещения. Разберем по шагам, как найти и обновить нужную строку:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ИзменениеСтатусаЗаявки" Тогда
        ПоискСтрок = ДанныеДашборда.НайтиСтроки(Новый Структура("Ссылка", Параметр.Идентификатор));
        Для Каждого СтрокаТЗ Из ПоискСтрок Цикл
            СтрокаТЗ.Статус = Параметр.НовыйСтатус;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Использование метода НайтиСтроки() позволяет избежать полной перерисовки интерфейса, что значительно экономит ресурсы клиентского приложения.

Дашборды на базе Поля HTML документа и JavaScript

Для реализации максимально гибких и красивых интерфейсов рассмотрим путь использования ПолеHTMLДокумента. Этот метод позволяет встроить в 1С современные библиотеки визуализации, такие как Chart.js или ECharts. Выясним преимущества этого подхода: мы можем обновлять конкретный элемент графа через JSON-пакеты, не перегружая страницу целиком.

Проанализируем схему взаимодействия. 1С формирует JSON с обновленными данными и передает его в JavaScript-функцию внутри HTML-поля:


// Код на стороне 1С (Управляемая форма)
ДанныеДляОбновления = "[{id: 'rect1', color: 'red'}]";
Элементы.ПолеДашборда.Документ.defaultView.updateStatus(ДанныеДляОбновления);

Внутри HTML-кода функция updateStatus найдет элемент по ID и мгновенно изменит его состояние. Это позволяет создавать динамику, недоступную стандартным элементам формы 1С.

Оптимизация работы с большими объемами через фоновые задания

Когда данных слишком много, любая попытка получить их «здесь и сейчас» приведет к блокировке интерфейса. Разберем, как реализовать фоновое обновление. Мы запускаем сбор данных на сервере, а форма в это время остается отзывчивой.

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

Это стандарт де-факто для современных конфигураций. Пользователь видит индикатор загрузки, но может продолжать работу с другими элементами дашборда.

Реализация быстрого Drag-and-Drop

Рассмотрим ситуацию из сообщения 6: нужно перетаскивать заявки между группами (этапами процесса). Чтобы это работало мгновенно на больших объемах, используем события ПроверкаПеретаскивания и Перетаскивание.

Важный нюанс: для создания «эффекта мгновенности» (Instant UI) сначала визуально переместим строку в таблице на клиенте, и только потом отправим фоновый запрос на сервер для фактической записи в базу данных. Если сервер вернет ошибку, мы откатим визуальное изменение. Это позволяет пользователю не ждать окончания транзакции записи при каждом перемещении мышки.

Интеграция с внешними аналитическими системами (ClickHouse)

Если ваш дашборд должен показывать аналитику по миллионам записей в реальном времени, стандартных индексов SQL-базы 1С может не хватить. Рассмотрим продвинутый сценарий: трансляция данных в ClickHouse. Это колончатая СУБД, идеально подходящая для аналитических запросов.

В этом случае дашборд в 1С выступает лишь «тонким» визуализатором, который делает HTTP-запрос к ClickHouse и получает готовые агрегаты за миллисекунды. Для 1С это выглядит как обычный внешний источник данных или ответ от веб-сервиса.

Использование Системы взаимодействия для мгновенных уведомлений

Современный способ доставки обновлений на форму — Система взаимодействия. Вместо того чтобы форма постоянно опрашивала сервер («не изменилось ли что?»), сервер сам присылает сообщение форме. Проанализируем этот алгоритм:

  1. При записи заявки на сервере вызывается СистемаВзаимодействия.ОтправитьСообщение().
  2. В форме дашборда подключается обработчик оповещений системы взаимодействия.
  3. При поступлении сообщения форма точно знает, какую строку нужно обновить.

Этот подход гораздо производительнее, чем стандартный Оповестить(), так как работает на уровне платформенного сервера сообщений и не нагружает основной поток выполнения кода в базе данных.

Подведем итог: для простых дашбордов достаточно правильно настроенного ДинамическогоСписка. Для сложных интерактивных панелей с графиками лучше использовать ПолеHTMLДокумента. А для систем с огромным количеством данных незаменимы фоновые задания и стратегия дельта-обновлений через ОбработкаОповещения.

← На главную