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

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

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

Анализ задачи и выбор инструмента

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

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

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

Реализация через обработчик ожидания с уведомлением

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

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

Такой подход защищает пользователя от потери контекста (например, когда он выделил текст или настроил группировки). Пользователь сам решает, когда нажать кнопку Выполнить для получения свежих данных.

Пример программной реализации

Рассмотрим структуру кода, который позволяет настроить таймер для уведомления пользователя:


// В модуле формы при создании
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПодключитьОбработчикОжидания("ПроверитьАктуальностьДанных", 300); // 5 минут
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьАктуальностьДанных()
    // Здесь мы проверяем, нужно ли обновлять отчет
    // Можно вывести уведомление или сделать видимой кнопку обновления
    Элементы.ГруппаСообщениеОбОбновлении.Видимость = Истина;
КонецПроцедуры

Как не потерять настройки пользователя

Если вы все же решили, что отчет должен обновляться принудительно, вы столкнетесь с проблемой потери расшифровок и настроек КомпоновщикаНастроек. Чтобы этого избежать, перед выполнением обновления необходимо:

Шаг 1: Сохранить текущие настройки пользователя во временную переменную.

ТекущиеНастройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();

Шаг 2: Выполнить формирование отчета в фоновом режиме или непосредственно.

Шаг 3: Применить сохраненные настройки обратно к компоненту Результат после завершения формирования.

Рекомендации по производительности

При настройке автообновления всегда помните о нагрузке на сервер:

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

← На главную