В современной разработке на платформе 1С:Предприятие 8.3 часто возникает задача создания интерактивных дашбордов с сохранением настроек или мониторов, данные в которых должны актуализироваться автоматически — для этого есть готовая панель интерактивных дашбордов для 1С. Типичный пример — информационная панель на начальной странице, отображающая текущие остатки, заказы или показатели производства , настроенная через редактор форм. Мы разберем, как уйти от ручного нажатия кнопки «Обновить» и реализовать эффективное обновление данных в фоновом режиме.
Самый быстрый способ заставить форму выполнять действия периодически — это использование метода ПодключитьОбработчикОжидания и модификатора форм. Разберем механизм его работы. Этот метод доступен только на клиенте и позволяет вызвать указанную процедуру через определенный интервал времени.
Проанализируем основные правила использования этого метода:
&НаКлиенте.Рассмотрим пример реализации. Предположим, у нас есть процедура РасчитатьДниПроизводстваНаСервере, которая выполняет тяжелые расчеты и заполняет таблицу значений на форме. Для автоматизации нам понадобится клиентская «обертка»:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем обновление каждые 10 минут (600 секунд)
ПодключитьОбработчикОжидания("ВыполнитьОбновлениеДанных", 600);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьОбновлениеДанных()
// Вызываем серверный метод расчета
РасчитатьДниПроизводстваНаСервере();
КонецПроцедуры
&НаСервере
Процедура РасчитатьДниПроизводстваНаСервере()
// Пример оптимизированной загрузки данных в таблицу формы
ДанныеТЗ = Обработки.ОбработкаПодсчетаДнейПроизводства.РасчитатьДниПроизводства();
ДниПроизводства.Загрузить(ДанныеТЗ);
КонецПроцедуры
Обратите внимание на использование метода Загрузить. Это гораздо эффективнее, чем обход таблицы в цикле и добавление строк по одной, так как это минимизирует количество операций с объектами коллекции формы.
Если серверный расчет данных занимает значительное время (более 1–2 секунд), использование первого метода приведет к «фризам» (замиранию) интерфейса. Пользователь не сможет нажимать кнопки или прокручивать списки, пока идет расчет. Чтобы этого избежать, мы применим настоящие фоновые задания.
Выясним причину, по которой этот метод сложнее, но лучше: расчет выполняется в отдельном сеансе на сервере, а основная форма лишь периодически «спрашивает» сервер: «Готовы ли данные?». Если данные готовы, форма их забирает.
Разберем алгоритм по шагам:
ФоновыеЗадания.НайтиПоУникальномуИдентификатору.Посмотрим на пример кода для реализации этой схемы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЗапуститьФоновыйРасчет();
ПодключитьОбработчикОжидания("ПроверитьСтатусЗадания", 5); // Проверка каждые 5 секунд
КонецПроцедуры
&НаСервере
Процедура ЗапуститьФоновыйРасчет()
// Адрес, куда фоновое задание положит результат
АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор);
// Запуск фонового задания
НаименованиеЗадания = "Обновление данных монитора производства";
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(АдресХранилища);
РезультатЗадания = ФоновыеЗадания.Выполнить("МойОбщийМодуль.РассчитатьДанныеДляФормы", ПараметрыЗадания, , НаименованиеЗадания);
ИдентификаторЗадания = РезультатЗадания.УникальныйИдентификатор;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСтатусЗадания()
Если ЗаданиеВыполнено(ИдентификаторЗадания) Тогда
ПолучитьРезультатИзХранилища();
// После успешного получения данных можно перезапустить цикл через время
КонецЕсли;
КонецПроцедуры
Если ваша конфигурация построена на базе БСП (например, ERP, УТ 11, БП 3.0), настоятельно рекомендуется использовать подсистему ДлительныеОперации. Это избавляет программиста от необходимости вручную обрабатывать исключения и следить за жизненным циклом фоновых заданий.
Проанализируем, как это выглядит в коде:
&НаКлиенте
Процедура ОбновитьДанныеБСП()
ПараметрыВыполнения = ДлительныеОперацииКлиент.ПараметрыВыполнения(ЭтаФорма);
ПараметрыВыполнения.ТекстСообщения = "Обновление данных...";
Результат = ДлительныеОперацииКлиент.ВыполнитьВФоне(
"МойОбщийМодуль.РасчитатьНаСервере",
ПараметрыПроцедуры,
ПараметрыВыполнения
);
// БСП сама подключит обработчик ожидания и вызовет оповещение по завершении
КонецПроцедуры
Этот способ является наиболее «чистым» и профессиональным для современных конфигураций 1С.
При реализации автообновления, особенно если форма находится на начальной странице, необходимо учитывать следующие моменты (для быстрого решения задачи есть готовый конструктор интерактивных рабочих столов и интерфейсов 1С):
ДанныеФормыКоллекция.Загрузить(), текущая строка в таблице может «слететь». Чтобы этого не произошло, перед обновлением сохраните Элементы.ИмяТаблицы.ТекущаяСтрока, а после загрузки данных программно установите её обратно, если идентификатор строки всё ещё валиден.ЭтаФорма.Открыта() или анализируйте время последнего взаимодействия пользователя с системой, чтобы увеличивать интервал обновления для неактивных сессий.ДекорацияСтатус, которая сообщает: «Данные актуальны на 14:20» или «Идет обновление...». Это позволяет пользователю понимать актуальность информации перед глазами.Подводя итог, выбор метода зависит от сложности ваших расчетов. Для простых запросов достаточно ПодключитьОбработчикОжидания, а для ресурсоемких задач необходимо использовать фоновые задания или механизмы ДлительныеОперации из состава БСП.