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