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