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