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