Как реализовать отображение лога в 1С в режиме реального времени на управляемых формах?

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

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

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

Проблема фокуса в Форматированном документе

Часто разработчики пытаются использовать объект ФорматированныйДокумент для вывода лога, так как он позволяет раскрашивать текст и добавлять новые строки. Однако при программном обновлении текста в этом объекте на управляемой форме фокус (скролл) часто сбрасывается в начало документа. Это крайне неудобно: при добавлении новой записи пользователю приходится каждый раз вручную прокручивать лог вниз, чтобы увидеть результат последнего действия.

Рассмотрим код, который обычно приводит к такой проблеме:


// Пример добавления строки, вызывающий сброс фокуса
ЧатЗаявок.Добавить("", Тип("ПереводСтрокиФорматированногоДокумента"));
ЧатЗаявок.Добавить("Запись " + Формат(ТекущаяДата(), "ДЛФ=DDT"), Тип("ТекстФорматированногоДокумента"));
// После этого обновления в обработчике ожидания скролл улетает вверх

Решение 1: Обратный порядок сортировки (Самый простой способ)

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

Если данные хранятся в Регистре Сведений или Таблице Значений, достаточно установить сортировку по дате или порядковому номеру в убывающем порядке. Рассмотрим, как это реализовать:

  1. Если используется ДинамическийСписок, в настройках списка (или программно в коде) укажите Порядок по полю Период с направлением НаправлениеСортировки.Убыв.
  2. Если вы используете текстовое поле, добавляйте новые строки не в конец текста, а в начало.

Пример реализации через текстовое поле:


НоваяЗапись = Формат(ТекущаяДата(), "ДЛФ=T") + ": Данные загружены успешно";
ТекстЛога = НоваяЗапись + Символы.ПС + ТекстЛога;

Решение 2: Использование Поля HTML-документа

Если нам нужна «красивая» визуализация (разные цвета для ошибок и предупреждений) и классический порядок лога (новое снизу), лучшим выбором будет использование Поля HTML документа. Разберем по шагам, как это настроить:

  1. Создайте реквизит формы с типом Строка (неограниченной длины).
  2. Вынесите его на форму и в свойстве «Вид» выберите Поле HTML документа.
  3. Для управления прокруткой используйте вставку JavaScript-кода.

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


// Добавление новой строки в HTML-лог
ТекстHTML = ТекстHTML + "<div id='last_row'>" + ТекстСобытия + "</div>";
// Скрипт для прокрутки вниз
ТекстHTML = ТекстHTML + "<script>document.getElementById('last_row').scrollIntoView(false);</script>";

Это исключает мерцание и позволяет гибко стилизовать лог с помощью CSS, выделяя ошибки красным цветом, а важные уведомления — жирным шрифтом <strong>.

Решение 3: Динамический список и фоновое обновление

Если лог записывается фоновым заданием в РегистрСведений, наиболее правильным с точки зрения архитектуры будет использование Динамического списка. Рассмотрим, как настроить его для эффективной работы:

Важно помнить: частое чтение из базы данных (через ОбработчикОжидания) может создать избыточную нагрузку. Выясним, как этого избежать. Если у вас сотни пользователей, и у каждого раз в секунду срабатывает запрос к БД, это может привести к деградации производительности. Рекомендуется устанавливать интервал обновления не менее 5-10 секунд или использовать Систему взаимодействия.

Решение 4: Система взаимодействия (Push-уведомления)

Для реализации по-настоящему «реалтаймового» лога без постоянных запросов к базе данных (модель Pull) лучше использовать Систему взаимодействия (модель Push). Рассмотрим этот механизм:

  1. Фоновое задание, выполняющее загрузку, отправляет сообщение в определенный «канал» или обсуждение.
  2. Форма списка подписывается на это обсуждение через обработчик ПриПолученииСообщения.
  3. Как только данные приходят, форма мгновенно обновляет содержимое лога на экране.

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

Оптимизация производительности: Кольцевой буфер

При длительной работе системы объем лога в оперативной памяти формы может вырасти до гигантских размеров, что приведет к замедлению работы интерфейса. Проанализируем ситуацию: если загрузка идет 24/7, и мы просто добавляем строки в ТаблицуЗначений или HTML-поле, через день форма начнет «тормозить».

Рекомендуем внедрить механизм кольцевого буфера:

Пример кода для очистки старых записей в ТаблицеЗначений:


Если Объект.ЛогСобытий.Количество() > 500 Тогда
    Объект.ЛогСобытий.Удалить(0); // Удаляем самую старую запись
КонецЕсли;

Выводы и рекомендации

Подведем итог. Выбор метода зависит от ваших требований к интерфейсу:

  1. Если нужно быстро и просто — используйте текстовое поле или таблицу с обратной сортировкой (новые сверху).
  2. Если нужен красивый интерфейс с цветами и иконками — выбирайте Поле HTML документа с JavaScript-скроллом.
  3. Если важна производительность при большом количестве пользователей — используйте Систему взаимодействия.
  4. Всегда ограничивайте количество хранимых в форме записей, чтобы не допустить утечек памяти и зависания клиентского приложения.
← На главную