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