К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как обновить отображение формы в 1С

Разбираем способы обновить отображение формы в 1С: клавиша F5, ОбновитьОтображениеДанных, Прочитать, ЭтотОбъект.Обновить. Примеры кода, ошибки и проверка результата.

Форма в 1С не всегда автоматически показывает актуальные данные. Пользователь изменил запись в другом окне, фоновая обработка перезаписала документ, код на сервере обновил реквизит объекта — а на экране остаются старые значения. В таких ситуациях нужно принудительно обновить отображение формы, и сделать это можно несколькими способами: от простого нажатия клавиши до вызова методов встроенного языка.

Важно различать две задачи. Первая — обновить отображение, то есть заставить элементы формы перечитать значения из уже изменённых данных формы. Вторая — обновить данные, то есть заново прочитать объект из базы данных. Это разные операции с разными последствиями, и путаница между ними — частая причина потери несохранённых изменений.

Ниже разобраны оба сценария: пользовательские приёмы без программирования и программные методы для разработчиков, а также типичные ошибки и способы проверить, что обновление действительно сработало.

Как обновить форму без программирования

Для пользователя самый быстрый способ — клавиша F5. В большинстве форм 1С она обновляет содержимое: динамические списки перечитывают данные, табличные части и реквизиты показывают актуальные значения. В формах списков также работает кнопка «Обновить» в командной панели (иконка с круговой стрелкой) и пункт «Обновить» в меню «Ещё».

Если форма документа или справочника открыта давно, а объект за это время изменили в другом сеансе, при попытке записи 1С выдаст сообщение о конфликте версий. В этом случае F5 не поможет: нужно закрыть форму без сохранения и открыть её заново, либо воспользоваться командой перечитывания, если она предусмотрена конфигурацией.

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

Обновление формы вручную
  1. 1
    Нажмите F5 или кнопку «Обновить» в командной панели формы
  2. 2
    Если данные не изменились — проверьте, не открыта ли форма в режиме блокировки другим сеансом
  3. 3
    При конфликте версий закройте форму без записи и откройте заново
  4. 4
    Для списков включите автообновление в настройках списка, если нужен постоянный мониторинг

Обновление отображения данных формы из кода

Когда реквизиты формы изменились программно (например, после серверного вызова или обработки оповещения), а элементы на экране показывают старое, используется метод ОбновитьОтображениеДанных(). Он вызывается у формы и заставляет элементы перечитать текущие значения из данных формы, не обращаясь к базе данных.

&НаКлиенте

Процедура ПослеИзмененияНаСервере()

// Данные формы уже изменены серверной процедурой

ЭтаФорма.ОбновитьОтображениеДанных();

КонецПроцедуры

Метод можно вызвать и для конкретного элемента: Элементы.Товары.ОбновитьОтображениеДанных(). Это полезно, когда нужно обновить только одну таблицу, не трогая остальную форму. Для таблиц, связанных с динамическим списком, применяется аналогичный подход — обновление элемента формы, а не всей формы целиком.

Отдельный случай — метод Обновить() у элемента формы, связанного с динамическим списком: Элементы.Список.Обновить(). Он перечитывает данные списка из базы. Именно его программный аналог выполняет кнопка «Обновить» в формах списков.

bsl
&НаКлиенте
Процедура ОбновитьСписок(Команда)
    Элементы.Список.Обновить(); // перечитывание динамического списка
    ЭтаФорма.ОбновитьОтображениеДанных(); // обновление элементов формы
КонецПроцедуры

Перечитывание объекта из базы: метод Прочитать

Если задача — не просто перерисовать форму, а загрузить свежую версию объекта из базы данных, используется метод Прочитать() у объекта формы. Для управляемой формы объекта (документа, справочника) вызов выглядит так: ЭтотОбъект.Прочитать() — в модуле формы на сервере, либо через Объект.Прочитать() с последующим обновлением отображения.

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

Также учитывайте блокировки. Если форма открыта на редактирование, объект заблокирован текущим сеансом, и перечитывание в этом же сеансе проблем не создаст. Но если другой сеанс уже изменил объект, после Прочитать() попытка записи может завершиться ошибкой конфликта версий — это нормальное поведение механизма оптимистичной блокировки.

Обновление связанных форм и оповещения

Частый сценарий: из формы документа открывается обработка, которая меняет данные, и после её закрытия основная форма должна отразить изменения. Для этого в управляемых формах применяется механизм оповещений: Оповестить() в форме-источнике и обработчик ОбработкаОповещения в форме-приёмнике.

&НаКлиенте

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "Запись_МойДокумент" Тогда

ЭтаФорма.Прочитать();

ЭтаФорма.ОбновитьОтображениеДанных();

КонецЕсли;

КонецПроцедуры

Для форм списков платформа часто обрабатывает стандартные оповещения о записи автоматически — список обновляется сам после записи элемента. Но если запись выполняется программно в обход стандартных механизмов (например, пакетная обработка на сервере), автоматического обновления не произойдёт, и оповещение нужно отправить явно.

Особенности для обычных и управляемых форм

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

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

Выбор метода обновления

F5 / кнопка «Обновить»

Подходит пользователю для списков и простых случаев; не требует кода, но не перечитывает объект формы элемента.

ОбновитьОтображениеДанных()

Обновляет только отрисовку элементов по уже изменённым данным формы; безопасен, не трогает базу.

Элементы.Список.Обновить()

Перечитывает динамический список из базы; подходит для журналов и списков справочников.

Прочитать()

Загружает объект из базы целиком; даёт актуальные данные, но уничтожает несохранённые изменения.

Типичные ошибки и как их избежать

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

Ещё одна ошибка — попытка обновить элемент по имени, которое не совпадает с реальным: Элементы.Список.Обновить() молча не сработает, если элемент называется иначе. Проверяйте имя элемента в конфигураторе. Наконец, не стоит путать обновление формы с обновлением интерфейса клиентского приложения — это разные уровни, и для панелей навигации есть свои механизмы.

Типичные ошибки
01
Вызов Прочитать() вместо ОбновитьОтображениеДанных() — теряются несохранённые изменения пользователя
02
Обновление списка в обработчике ожидания каждую секунду — мерцание формы и нагрузка на сервер
03
Неверное имя элемента в Элементы.Имя.Обновить() — код выполняется, но ничего не обновляет
04
Ожидание, что оповещение придёт от другого сеанса — оповещения работают только внутри текущего клиента

Как проверить, что обновление сработало

После программного обновления убедитесь, что на экране отображаются ожидаемые значения: сверьте ключевой реквизит с данными в базе (например, откройте объект в другом окне или через консоль запросов). Для списков проверьте, что новая запись появилась, а удалённая исчезла.

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

Контрольные точки

Контрольные точки

Значение реквизита на форме
Норма

Совпадает с данными объекта в базе

Тревожный признак

Показывает старое значение после изменения в другом сеансе

Динамический список
Норма

Новые записи появляются после Обновить() или F5

Тревожный признак

Состав списка не меняется — проверьте имя элемента и отборы

Модифицированность формы
Норма

Не сбрасывается при обновлении отображения

Тревожный признак

Данные пользователя пропали — где-то вызван Прочитать()

Частые вопросы

Почему F5 не обновляет данные в форме документа?

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

Чем ОбновитьОтображениеДанных отличается от Прочитать?

Первый метод только перерисовывает элементы формы по уже имеющимся в ней данным и не обращается к базе. Второй загружает объект из базы целиком, заменяя текущее содержимое формы. Первый безопасен, второй требует проверки модифицированности.

Как автоматически обновлять список документов?

В настройке динамического списка (в конфигураторе или через настройки формы) задайте период автообновления. Для разовых ситуаций достаточно кнопки «Обновить». Автообновление с коротким интервалом не ставьте на тяжёлых списках — это нагружает сервер.

Форма обновляется, но табличная часть показывает старые строки. Что делать?

Табличная часть — отдельный элемент формы. Вызовите обновление конкретно для неё: Элементы.ИмяТаблицы.ОбновитьОтображениеДанных(). Если строки менялись на сервере, убедитесь, что серверная процедура реально изменила данные формы, а не локальную копию объекта.

Можно ли обновить форму другого пользователя из своего сеанса?

Нет, штатных средств для этого нет: оповещения работают только внутри одного клиентского сеанса. Другой пользователь увидит изменения после ручного обновления, автообновления списка или при повторном открытии формы.

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

Обычно данные формы возвращаются на клиент автоматически при завершении серверного вызова. Если обновления нет, проверьте, что менялись именно реквизиты формы, а не переменные модуля, и что процедура не объявлена как директива без контекста, теряющая состояние объекта.

Итог

Что важно запомнить

Разделяйте две задачи: обновление отображения (ОбновитьОтображениеДанных, F5) и перечитывание данных из базы (Прочитать, Элементы.Список.Обновить). Первое безопасно, второе может уничтожить несохранённые изменения. Для связи между формами используйте оповещения, а автоматическое обновление списков настраивайте с учётом нагрузки на сервер.