Разработка удобного и интуитивно понятного интерфейса рабочего места пользователя — одна из важнейших задач при проектировании информационных систем на платформе «1С:Предприятие 8». Начальная страница (или рабочий стол) часто служит основным центром управления, где сотрудники видят оперативные списки задач, текущих документов, заказов или заявок, требующих незамедлительной обработки. Однако стандартное поведение динамических списков на начальной странице имеет свои особенности: новые данные, созданные другими пользователями или фоновыми процессами, далеко не всегда мгновенно отображаются на экране. Пользователям приходится либо перезапускать программу, либо использовать контекстное меню для ручного обновления.
В рамках этой статьи мы подробно разберем, почему возникает такая проблема, проанализируем различные подходы к автоматическому и программному обновлению списков на управляемых формах и выберем оптимальные решения для различных сценариев разработки.
Часто начинающие разработчики путают две важные настройки динамического списка, которые доступны в свойствах элемента формы. Давайте разберем разницу между ними, чтобы понять физику процесса:
Если на начальной странице установлено только динамическое считывание данных, список останется статичным до тех пор, пока пользователь не совершит какое-либо интерактивное действие (например, не нажмет кнопку «Обновить», не переоткроет форму или не выполнит поиск).
Самый простой и не требующий написания программного кода способ — это использование стандартного механизма автообновления динамического списка. Этот инструмент встроен в платформу «1С:Предприятие 8.3».
Рассмотрим, как настроить данный механизм по шагам:
Список).300 будет означать обновление данных каждые 5 минут.Важный нюанс: динамические списки в целях снижения нагрузки на сеть и сервер СУБД приостанавливают автообновление, если форма не активна, свернута или перекрыта другими окнами (вкладками документов). Обновление возобновится, как только пользователь вернется к работе с начальной страницей.
Если вам требуется более гибкий контроль над процессом обновления (например, дать пользователю возможность самостоятельно включать и выключать автоматическое обновление или динамически менять его интервал прямо в режиме «1С:Предприятие»), можно использовать программный метод подключения обработчика ожидания.
Давайте разберем пример реализации, в котором на форме размещен флаг включения автообновления ПолучениеОбновлений (тип Булево) и числовое поле Периодичность (интервал в секундах):
&НаКлиенте
Процедура ПолучениеОбновленийПриИзменении(Элемент)
ПодключитьОтключитьОбработчикОжидания();
КонецПроцедуры
&НаКлиенте
Процедура ПодключитьОтключитьОбработчикОжидания()
Если ПолучениеОбновлений = Истина Тогда
Если Периодичность > 0 Тогда
// Подключаем обработчик ожидания с заданным интервалом
// Третий параметр "Ложь" указывает, что обработчик будет выполняться многократно
ПодключитьОбработчикОжидания("ВыполнитьОбновлениеСписка", Периодичность, Ложь);
Иначе
ПолучениеОбновлений = Ложь;
ОтключитьОбработчикОжидания("ВыполнитьОбновлениеСписка");
КонецЕсли;
Иначе
ОтключитьОбработчикОжидания("ВыполнитьОбновлениеСписка");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьОбновлениеСписка()
// Принудительное обновление динамического списка на форме
Элементы.Список.Обновить();
КонецПроцедуры
Преимущество данного подхода заключается в том, что логику работы таймера можно усложнять. Например, можно временно отключать обновление в ночное время или автоматически увеличивать интервал опроса базы данных при падении скорости интернет-соединения.
Использование постоянных опросов базы данных по таймеру (методы 1 и 2) создает непрерывную фоновую нагрузку на сервер СУБД. Если в системе работают сотни пользователей, частые запросы могут существенно снизить общую производительность. Более элегантным и производительным решением является событийный подход.
Платформа 1С предоставляет мощный встроенный механизм автоматического обновления связанных форм при помощи метода ОповеститьОбИзменении(). Давайте разберем, как это работает:
Если у вашего динамического списка на начальной странице заполнено свойство Основная таблица (например, указана таблица Документ.ЗаказКлиента), платформа автоматически отслеживает изменения этой таблицы в рамках текущего сеанса пользователя.
При записи нового документа в коде клиентского приложения (например, в форме создания документа после успешной записи) достаточно вызвать метод:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
// Оповещаем систему об изменении конкретного объекта
ОповеститьОбИзменении(Объект.Ссылка);
КонецПроцедуры
Или, если нужно обновить списки определенного типа глобально:
ОповеститьОбИзменении(Тип("ДокументСсылка.ЗаказКлиента"));
Платформа самостоятельно проанализирует все открытые формы текущего сеанса, найдет динамические списки, базирующиеся на таблице заказов клиентов, и принудительно обновит их данные на экране. При этом вам не нужно писать код обработки внутри самой начальной страницы.
Если динамический список построен на основе сложного произвольного запроса без явного указания основной таблицы, метод ОповеститьОбИзменении() может не сработать автоматически. В этом случае мы можем применить ручную отправку и обработку оповещений.
Шаг 1. В модуле формы источника данных (например, в форме нового документа при его записи) генерируем уникальное оповещение:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
// Параметры метода: ИмяСобытия, Параметр, Источник
Оповестить("СозданНовыйДокументОтгрузки", Объект.Ссылка, ЭтотОбъект);
КонецПроцедуры
Шаг 2. В форме начальной страницы, где расположен наш список, создаем обработчик события ОбработкаОповещения:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем имя пришедшего события
Если ИмяСобытия = "СозданНовыйДокументОтгрузки" Тогда
// Обновляем наш динамический список на форме начальной страницы
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедуры
Этот метод гарантирует точечное и мгновенное обновление формы без создания лишних фоновых запросов к серверу по таймеру.
Если вы ведете разработку в современной конфигурации 1С (таких как «ERP Управление предприятием», «Управление торговлей», «Бухгалтерия предприятия» и др.), в вашем распоряжении находится Библиотека Стандартных Подсистем. В БСП уже встроены готовые программные интерфейсы для решения подобных задач.
Вместо ручного вызова системных методов рекомендуется использовать следующие процедуры БСП:
ОбщегоНазначенияКлиент.ОповеститьОбИзмененииОбъектов(Источник) — стандартизированный метод, который корректно генерирует события БСП (вида Запись_ИмяМетаданных) и обеспечивает синхронное обновление всех открытых списков на рабочих местах.ОбменДаннымиКлиент.ОбновитьВсеОткрытыеДинамическиеСписки() — радикальный, но крайне полезный метод, когда требуется принудительно обновить абсолютно все динамические списки на экране пользователя (например, после выполнения групповой обработки данных или масштабного импорта документов).Важно понимать ключевое ограничение стандартных механизмов Оповестить() и ОповеститьОбИзменении(): они работают строго в пределах одного клиентского сеанса. Если документ создал Пользователь А, то у Пользователя Б на экране компьютера список автоматически не обновится, так как эти оповещения не передаются между сеансами через сервер.
Аналогично, если документы загружаются в фоновом режиме через регламентные задания, REST-сервисы или планы обмена, клиентские приложения пользователей «не знают» об этих событиях.
Для преодоления этого ограничения применяются два основных архитектурных подхода:
Подход А. Использование Системы взаимодействия (современный метод)
Начиная с платформы «1С:Предприятие» версии 8.3.10, разработчикам доступен механизм Системы взаимодействия. Это встроенная шина обмена мгновенными сообщениями между сеансами.
Схема реализации выглядит следующим образом:
Элементы.Список.Обновить().Этот способ обеспечивает моментальное обновление данных в реальном времени у всех сотрудников организации без создания паразитной фоновой нагрузки на СУБД.
Подход Б. Оптимизированный обработчик ожидания
Если Система взаимодействия в компании не развернута, единственным выходом остается использование обработчика ожидания по таймеру (Решение №2). Однако, чтобы не перегружать СУБД тяжелыми запросами от сотен открытых начальных страниц, необходимо придерживаться правил оптимизации:
Чтобы предоставить пользователю максимально актуальные данные без постоянного фонового опроса сервера, можно использовать событие активации формы начальной страницы. Когда сотрудник закрывает рабочие вкладки документов и возвращается на рабочий стол, форма становится активной.
Мы можем перехватить этот момент и принудительно обновить список. Для этого используются события формы начальной страницы ПриАктивизации или ПриПовторномОткрытии:
&НаКлиенте
Процедура ПриАктивизации()
// Этот код сработает, когда пользователь переключится на вкладку начальной страницы
Элементы.Список.Обновить();
КонецПроцедуры
Такой подход гарантирует, что как только пользователь переведет взгляд на начальную страницу, перед ним окажется гарантированно актуальный список документов, при этом во время активной работы в других окнах система не будет тратить ресурсы на фоновое обновление скрытого от глаз рабочего стола.
Подводя итог, выбор конкретного метода обновления зависит от архитектуры вашей базы данных, количества активных пользователей и интенсивности создания документов. Сочетание стандартного автообновления, событийного подхода с использованием БСП и оптимизации моментов активации формы позволит создать отзывчивый интерфейс без ущерба для общей производительности системы.