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