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

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

При программной загрузке элементов справочников или документов из внешних источников (например, из файлов DBF, Excel или веб-сервисов) разработчики часто сталкиваются с ситуацией, когда новые данные записываются в базу, но не появляются в открытых списках у пользователей. Чтобы увидеть загруженные записи, пользователям приходится перезапускать форму или переоткрывать журнал документов.

Рассмотрим подробнее, почему возникают подобные задержки обновления в управляемом приложении 1С:Предприятие 8.3 и какими способами можно оперативно обновить интерфейс.

Выясним причину поведения динамических списков

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

Способ 1. Использование метода ОповеститьОбИзменении

Самым простым и стандартизированным решением платформы является вызов метода ОповеститьОбИзменении(). Когда процедура загрузки завершает работу на сервере и возвращает управление на клиент, необходимо вызвать оповещение платформы, передав тип созданных или измененных объектов.

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

Рассмотрим пример кода на клиенте после завершения загрузки:


&НаКлиенте
Процедура ПослеЗагрузкиИзDBF()
    
    // Запускаем серверную процедуру загрузки
    ЗагрузитьДанныеНаСервере();
    
    // Оповещаем систему об обновлении элементов справочника
    ОповеститьОбИзменении(Тип("СправочникСсылка.Контрагенты"));
    
КонецПроцедура

Способ 2. Пользовательское оповещение и метод Элементы.Список.Обновить()

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

  1. В обработке загрузки по завершении процесса вызываем клиентский метод Оповестить() с произвольным именем события:

Оповестить("ЗагрузкаДанныхИзDBFЗавершена");

  1. В форме списка справочника или журнала документов создаем обработчик события ОбработкаОповещения:

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если ИмяСобытия = "ЗагрузкаДанныхИзDBFЗавершена" Тогда
        Элементы.Список.Обновить();
    КонецЕсли;
    
КонецПроцедура

Вызов метода Элементы.Список.Обновить() перезапрашивает данные с сервера и гарантированно отображает актуальную информацию в динамическом списке.

Способ 3. Настройка интервала автообновления

Посмотрим на альтернативный вариант, который не требует написания специализированного кода связки между обработкой и формами. У элемента формы (динамического списка) можно настроить свойство ПериодАвтоОбновления.

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

Важные ограничения и особенности

При реализации обновления форм следует учитывать следующие технические нюансы:

  1. Методы ОповеститьОбИзменении(), Оповестить() и обращения к элементам формы (Элементы.Список.Обновить()) работают исключительно на клиенте (в контексте &НаКлиенте). Вызывать их напрямую из серверных модулей или фоновых заданий нельзя.
  2. Если загрузка данных выполняется в транзакции, вызывать обновление форм нужно только после фиксации транзакции, иначе динамический список не увидит новые записи.
← На главную