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

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

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

Метод 1: Использование обработчика ожидания (Простой подход)

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

Проанализируем основные правила использования этого метода:

  1. Процедура-обработчик должна располагаться в модуле формы с директивой &НаКлиенте.
  2. Процедура не должна принимать никаких параметров.
  3. Интервал задается в секундах.

Рассмотрим пример реализации. Предположим, у нас есть процедура РасчитатьДниПроизводстваНаСервере, которая выполняет тяжелые расчеты и заполняет таблицу значений на форме. Для автоматизации нам понадобится клиентская «обертка»:


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

&НаКлиенте
Процедура ВыполнитьОбновлениеДанных()
    // Вызываем серверный метод расчета
    РасчитатьДниПроизводстваНаСервере();
КонецПроцедуры

&НаСервере
Процедура РасчитатьДниПроизводстваНаСервере()
    // Пример оптимизированной загрузки данных в таблицу формы
    ДанныеТЗ = Обработки.ОбработкаПодсчетаДнейПроизводства.РасчитатьДниПроизводства();
    ДниПроизводства.Загрузить(ДанныеТЗ);
КонецПроцедуры

Обратите внимание на использование метода Загрузить. Это гораздо эффективнее, чем обход таблицы в цикле и добавление строк по одной, так как это минимизирует количество операций с объектами коллекции формы.

Метод 2: Реальное фоновое обновление (без блокировки интерфейса)

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

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

Разберем алгоритм по шагам:

  1. Запускаем фоновое задание на сервере и помещаем результат во временное хранилище.
  2. В обработчике ожидания проверяем статус задания с помощью метода ФоновыеЗадания.НайтиПоУникальномуИдентификатору.
  3. Если задание завершено успешно, получаем данные и обновляем форму.

Посмотрим на пример кода для реализации этой схемы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ЗапуститьФоновыйРасчет();
    ПодключитьОбработчикОжидания("ПроверитьСтатусЗадания", 5); // Проверка каждые 5 секунд
КонецПроцедуры

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

&НаКлиенте
Процедура ПроверитьСтатусЗадания()
    Если ЗаданиеВыполнено(ИдентификаторЗадания) Тогда
        ПолучитьРезультатИзХранилища();
        // После успешного получения данных можно перезапустить цикл через время
    КонецЕсли;
КонецПроцедуры

Метод 3: Использование библиотеки стандартных подсистем (БСП)

Если ваша конфигурация построена на базе БСП (например, ERP, УТ 11, БП 3.0), настоятельно рекомендуется использовать подсистему ДлительныеОперации. Это избавляет программиста от необходимости вручную обрабатывать исключения и следить за жизненным циклом фоновых заданий.

Проанализируем, как это выглядит в коде:


&НаКлиенте
Процедура ОбновитьДанныеБСП()
    ПараметрыВыполнения = ДлительныеОперацииКлиент.ПараметрыВыполнения(ЭтаФорма);
    ПараметрыВыполнения.ТекстСообщения = "Обновление данных...";
    
    Результат = ДлительныеОперацииКлиент.ВыполнитьВФоне(
        "МойОбщийМодуль.РасчитатьНаСервере",
        ПараметрыПроцедуры,
        ПараметрыВыполнения
    );
    
    // БСП сама подключит обработчик ожидания и вызовет оповещение по завершении
КонецПроцедуры

Этот способ является наиболее «чистым» и профессиональным для современных конфигураций 1С.

Важные нюансы при автоматическом обновлении

При реализации автообновления, особенно если форма находится на начальной странице, необходимо учитывать следующие моменты (для быстрого решения задачи есть готовый конструктор интерактивных рабочих столов и интерфейсов 1С):

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

← На главную