В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда пользователь открывает список документов (например, заказы или счета), а затем запускает обработку, которая массово меняет реквизиты этих документов (например, статусы или ответственных). Проблема заключается в том, что динамический список, уже открытый на экране, не узнает об этих изменениях мгновенно. Пользователю приходится либо нажимать кнопку "Обновить" (F5), либо ждать срабатывания стандартных механизмов платформы. Разберем подробно, как сделать интерфейс приложения более "живым" и заставить формы обновляться автоматически.
Проанализируем самый эффективный и рекомендуемый платформенный механизм — метод ОповеститьОбИзменении(). Этот метод предназначен специально для того, чтобы сообщить всем открытым формам в текущем сеансе, что данные определенного типа или конкретного объекта были изменены в базе данных. Когда форма динамического списка получает такое оповещение, она автоматически инициирует перечитывание данных с сервера.
Рассмотрим, как применить этот метод в коде обработки. Предположим, наша обработка меняет статусы документов РеализацияТоваровУслуг. После завершения цикла записи документов нам необходимо вызвать оповещение. Посмотрим на пример кода:
// В модуле обработки (на клиенте)
Процедура ИзменитьСтатусыДокументов()
// Логика изменения данных на сервере
ВыполнитьИзменениеСтатусовНаСервере();
// Оповещаем систему, что данные типа "Документ.РеализацияТоваровУслуг" изменились
ОписаниеТипаДокумента = Тип("ДокументСсылка.РеализацияТоваровУслуг");
ОповеститьОбИзменении(ОписаниеТипаДокумента);
КонецПроцедуры
Выясним, в чем преимущество этого подхода. Главный плюс в том, что нам не нужно искать конкретное открытое окно списка или знать его уникальный идентификатор. Платформа сама найдет все открытые динамические списки, в основной таблице которых указан данный тип документа, и обновит их. Если в методе передать не тип, а конкретную Ссылку на документ, платформа обновит только соответствующую строку в списке, что еще более экономично с точки зрения ресурсов.
Иногда требуется более тонкая настройка обновления. Например, если список построен на сложном произвольном запросе, ОповеститьОбИзменении() может не сработать так, как ожидается. В этом случае мы можем использовать механизм произвольных оповещений. Разберем этот алгоритм по шагам:
Оповестить(), передавая имя события и, при необходимости, параметры (например, массив измененных ссылок).ОбработкаОповещения.Список.Посмотрим на программную реализацию. Код в обработке:
// Код в форме обработки
&НаКлиенте
Процедура ПослеИзмененияДанных()
ПараметрыОповещения = Новый Структура("СтатусОбновлен", Истина);
Оповестить("ОбновитьСписокПослеОбработки", ПараметрыОповещения, ЭтаФорма);
КонецПроцедуры
Теперь проанализируем код, который должен быть размещен в форме списка документов:
// Код в форме списка документов
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбновитьСписокПослеОбработки" Тогда
// Вызываем обновление динамического списка
Элементы.Список.Обновить();
// Можно также вывести уведомление пользователю
ПоказатьОповещениеПользователя("Данные обновлены", , "Статусы документов успешно изменены обработкой");
КонецЕсли;
КонецПроцедуры
Этот способ позволяет не просто "молча" обновить список, но и выполнить дополнительные действия: спозиционироваться на нужной строке, изменить отбор или уведомить пользователя о завершении процесса.
Рассмотрим стандартную настройку динамического списка, которая упоминалась в обсуждении. У каждого динамического списка в управляемых формах есть свойство ПериодАвтообновления. Это интервал в секундах, через который форма сама опрашивает сервер на предмет изменений. По умолчанию это свойство равно 0 (выключено).
Важные нюансы использования автообновления:
Использовать этот метод стоит только тогда, когда изменения вносятся не вашей обработкой, а, например, внешними системами или регламентными заданиями на сервере, о которых клиентское приложение не может узнать через Оповестить().
Проанализируем сообщение из форума по поводу свойства Динамическое считывание данных. Нужно четко понимать, что это свойство не отвечает за обновление списка при изменении данных в базе. Оно определяет стратегию выборки данных из СУБД: подгружать ли данные порциями по мере прокрутки списка пользователем или попытаться считать больше данных за один раз для кэширования. Включение этой галочки никак не поможет увидеть новые статусы документов, измененные обработкой, без принудительного обновления формы.
Подведем итог и выберем оптимальный путь решения задачи в зависимости от условий:
ОповеститьОбИзменении(). Это самый "чистый" код.Оповестить() и событие ОбработкаОповещения.Период автообновления в свойствах списка, но ставьте разумное значение (от 60 до 300 секунд).Таким образом, мы выяснили, что наиболее профессиональным подходом является программное инициирование обновления через механизм оповещений. Это гарантирует актуальность данных на экране пользователя без излишней нагрузки на систему.