При программной загрузке элементов справочников или документов из внешних источников (например, из файлов DBF, Excel или веб-сервисов) разработчики часто сталкиваются с ситуацией, когда новые данные записываются в базу, но не появляются в открытых списках у пользователей. Чтобы увидеть загруженные записи, пользователям приходится перезапускать форму или переоткрывать журнал документов.
Рассмотрим подробнее, почему возникают подобные задержки обновления в управляемом приложении 1С:Предприятие 8.3 и какими способами можно оперативно обновить интерфейс.
Проанализируем ситуацию: запись объектов при загрузке чаще всего происходит на сервере. Платформа 1С не отправляет автоматических клиентских уведомлений обо всех изменениях в базе данных, если они выполнены вне контекста конкретной клиентской формы. Если в свойствах динамического списка не задана Основная таблица или данные записываются в сторонних обработках, открытые формы списков не узнают о появлении новых записей до их принудительного обновления.
Самым простым и стандартизированным решением платформы является вызов метода ОповеститьОбИзменении(). Когда процедура загрузки завершает работу на сервере и возвращает управление на клиент, необходимо вызвать оповещение платформы, передав тип созданных или измененных объектов.
Разберем по шагам: метод принимает либо конкретную ссылку на созданный объект, либо тип метаданных целиком. Передача типа метаданных заставляет платформу обновить все открытые формы списков соответствующего типа у текущего пользователя.
Рассмотрим пример кода на клиенте после завершения загрузки:
&НаКлиенте
Процедура ПослеЗагрузкиИзDBF()
// Запускаем серверную процедуру загрузки
ЗагрузитьДанныеНаСервере();
// Оповещаем систему об обновлении элементов справочника
ОповеститьОбИзменении(Тип("СправочникСсылка.Контрагенты"));
КонецПроцедура
Если динамический список построен на основе сложного произвольного запроса без указания основной таблицы, метод ОповеститьОбИзменении() может не сработать. В таком случае разберем схему с применением процедур Оповестить() и ОбработкаОповещения().
Оповестить() с произвольным именем события:
Оповестить("ЗагрузкаДанныхИзDBFЗавершена");
ОбработкаОповещения:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ЗагрузкаДанныхИзDBFЗавершена" Тогда
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедура
Вызов метода Элементы.Список.Обновить() перезапрашивает данные с сервера и гарантированно отображает актуальную информацию в динамическом списке.
Посмотрим на альтернативный вариант, который не требует написания специализированного кода связки между обработкой и формами. У элемента формы (динамического списка) можно настроить свойство ПериодАвтоОбновления.
Данное свойство задается в секундах. При его включении платформа с заданной периодичностью опрашивает базу данных и обновляет содержимое динамического списка на экране пользователя без его прямого участия.
При реализации обновления форм следует учитывать следующие технические нюансы:
ОповеститьОбИзменении(), Оповестить() и обращения к элементам формы (Элементы.Список.Обновить()) работают исключительно на клиенте (в контексте &НаКлиенте). Вызывать их напрямую из серверных модулей или фоновых заданий нельзя.