Почему после редактирования и записи данных в регистр они не обновляются на управляемой форме?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8.3 на управляемых формах часто возникает задача вызова специализированных механизмов или обработок (например, типовой подсистемы редактирования контактной информации), которые изменяют данные и записывают их напрямую в базу данных или регистры сведений. Однако после завершения работы такой обработки разработчики нередко сталкиваются с тем, что на исходной управляемой форме внесенные изменения не отображаются, а метод ОбновитьОтображениеДанных() не приносит ожидаемого результата.

Разберем подробно причины такого поведения платформы и выясним, как правильно синхронизировать контекст управляемой формы с базой данных без необходимости закрывать форму объекта.

Причины рассинхронизации данных формы и базы данных

Рассмотрим, почему данные на форме не обновляются автоматически при прямой записи в регистр или табличную часть:

  1. Разрыв связи при использовании РеквизитФормыВЗначение: когда на сервере вызывается функция РеквизитФормыВЗначение(), платформа создает в оперативной памяти отдельную копию прикладного объекта. Все дальнейшие модификации происходят именно с этой локальной копией, и изменения автоматически не проецируются обратно в реквизиты формы.
  2. Ограничение метода ОбновитьОтображениеДанных(): данный метод предназначен для обновления динамических списков, условного оформления и авторасчитываемых элементов интерфейса. Он не перечитывает значения обычных реквизитов формы, коллекций или объекта из базы данных.
  3. Изоляция контекста формы: если внешняя обработка выполняет прямую запись набора записей регистра сведений в информационную базу, открытая форма объекта «не знает» о произошедшей транзакции и продолжает отображать закэшированные в ее контексте данные.

Способ 1. Синхронизация прикладного объекта и реквизитов формы

Если в коде выполняется трансформация реквизита формы в прикладное значение для передачи в обработку, после завершения редактирования необходимо выполнить обратное преобразование с помощью метода ЗначениеВРеквизитФормы().

Посмотрим на пример организации серверной процедуры:


&НаСервере
Процедура ОбновитьАдресНаСервере(ИзмененнаяТаблица)
    // Преобразуем измененный прикладной объект обратно в реквизит формы
    ЗначениеВРеквизитФормы(ИзмененнаяТаблица, "АдресДоставки");
КонецПроцедуры

Если данные представляют собой коллекцию формы, можно также воспользоваться методом платформы КопироватьДанныеФормы(Источник, Приемник).

Способ 2. Повторное чтение данных из регистра или объекта на сервере

Если обработка самостоятельно записывает сформированные записи в регистр сведений, на исходной форме необходимо принудительно запустить процедуру повторного считывания актуальных данных из базы.

Разберем по шагам, как это реализовать:

  1. После закрытия окна редактирования вызываем серверную процедуру обновления.
  2. На сервере выполняем запрос к регистру сведений по ключу текущего объекта.
  3. Заполняем реквизиты формы или реквизит Объект полученными актуальными данными.

Рассмотрим пример кода:


&НаКлиенте
Процедура ПослеРедактированияАдреса(Команда)
    // Вызов обработки редактирования
    ОбработкаРедактирования = Обработки.РедактированиеКонтактнойИнформации.Создать();
    ОбработкаРедактирования.ДоступностьОбъекта = Истина;
    ОбработкаРедактирования.РедактироватьЗапись(ТекущаяСтрока, , ЭтаФорма, , Истина);
    
    // Перечитываем актуальные данные из регистра на сервере
    ОбновитьДанныеФормыИзРегистраНаСервере();
КонецПроцедуры

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

Способ 3. Перечитывание основного объекта формы

В ситуациях, когда форма привязана к объекту базы данных (документу или справочнику), и изменения были записаны в базу данных сторонним методом, для полной синхронизации всей формы можно использовать встроенный метод перечитывания.

Посмотрим на пример вызова:


&НаСервере
Процедура ПеречитатьОбъектНаСервере()
    // Метод полностью перечитывает реквизит Объект из базы данных
    ЭтаФорма.Прочитать();
КонецПроцедуры

Важно: вызов метода Прочитать() сбрасывает все несохраненные пользователем изменения на форме, заменяя их данными из информационной базы. Используйте этот способ только тогда, когда основные реквизиты уже записаны в базу или их потеря некритична.

← На главную