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

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

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

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

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

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

Ниже разобраны ручные способы обновления, программные методы с примерами кода, особенности динамических списков и управляемых форм, а также типичные ошибки, из-за которых данные «не обновляются», хотя код отрабатывает без ошибок.

Когда форме нужно обновление и почему она устаревает

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

Типичные ситуации, когда данные на форме устарели:

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

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

Ручное обновление формы без программирования

Пользователю доступны встроенные средства платформы, которые не требуют доработки конфигурации.

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

Для формы списка обновление выполняется клавишей F5 в таблице списка или кнопкой «Обновить» на командной панели. Динамический список перечитает данные с учётом текущих отборов и настроек.

Порядок действий
  1. 1
    Перейдите на форму, которую нужно обновить
  2. 2
    Для формы объекта нажмите F5 или «Ещё → Перечитать»
  3. 3
    Для формы списка установите курсор на таблицу и нажмите F5
  4. 4
    Проверьте, что отображаемые значения совпадают с данными в базе

Программное обновление формы объекта

Основной метод — Прочитать() у данных формы. В модуле формы объекта он вызывается так:

&НаКлиенте

Процедура ОбновитьДанные(Команда)

ПрочитатьДанныеНаСервере();

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

&НаСервере

Процедура ПрочитатьДанныеНаСервере()

Прочитать();

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

Метод Прочитать() доступен только в серверном контексте, поэтому с клиента вызывается серверная процедура. После чтения платформа автоматически обновит элементы формы, связанные с реквизитами объекта.

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

ОбновитьОтображениеДанных(); // обновляет все элементы формы

Элементы.Товары.Обновить(); // обновляет конкретную таблицу

Обновление динамического списка

Динамический список на форме обновляется отдельно от остальных данных. Стандартный вызов:

&НаКлиенте

Процедура ОбновитьСписок(Команда)

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

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

Если список должен обновляться автоматически, у динамического списка есть свойство «Автообновление» и период обновления в секундах — его включают в настройках реквизита формы. Автообновление удобно для мониторинга, но создаёт постоянные запросы к базе, поэтому для больших таблиц его используют осторожно.

Альтернатива без периодического опроса — подключение обработчика ожидания на клиенте:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

ПодключитьОбработчикОжидания("ОбновитьСписокПоТаймеру", 60);

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

Сравнение вариантов

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

Разовое обновление по кнопке или событию; нагрузку контролирует разработчик

Автообновление списка

Простая настройка без кода, но постоянные запросы к базе даже при неактивной форме

ПодключитьОбработчикОжидания

Гибкий интервал и возможность отключать обновление, требует кода и аккуратного отключения обработчика

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

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

// В форме, где произошла запись

Оповестить("ИзмененКонтрагент", КонтрагентСсылка, ЭтотОбъект);

// В форме, которую нужно обновить

&НаКлиенте

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

Если ИмяСобытия = "ИзмененКонтрагент" Тогда

ПрочитатьДанныеНаСервере();

КонецЕсли;

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

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

Типичные ошибки
01
Вызов Прочитать() на клиенте — метод доступен только на сервере, код завершится ошибкой
02
Обновление отображения вместо чтения: ОбновитьОтображениеДанных() не подтягивает свежие данные из базы, а лишь перерисовывает элементы
03
Перечитывание объекта с несохранёнными изменениями — пользователь теряет введённые данные
04
Ожидание автообновления списка при выключенном свойстве Автообновление — список остаётся устаревшим
05
Обновление списка в обработчике ожидания без отключения при закрытии формы — лишние вызовы и ошибки после закрытия

Проверка результата и границы безопасной работы

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

При доработке конфигурации соблюдайте осторожность: перечитывание объекта в цикле или в обработчиках ожидания с маленьким интервалом создаёт лишнюю нагрузку на сервер СУБД. Перед внедрением автообновления оцените количество пользователей, у которых форма будет открыта одновременно.

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

Как проверить результат

Значение на форме после обновления
Норма

Совпадает с данными в базе (проверено запросом или вторым сеансом)

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

Расходится — перечитывается не тот объект или данные кэшированы

Несохранённые изменения пользователя
Норма

Перед Прочитать() выдан вопрос о сохранении

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

Изменения молча затираются

Нагрузка при автообновлении списка
Норма

Интервал разумный, обновление отключается при закрытии формы

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

Запросы идут каждые секунды у всех пользователей

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

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

F5 в форме объекта работает как перечитывание только если фокус стоит на самой форме, а не в отдельных элементах с собственной обработкой клавиш. Надёжнее использовать команду «Ещё → Перечитать». Также проверьте, не переопределено ли сочетание клавиш в конфигурации.

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

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

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

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

Почему динамический список не обновляется после записи документа?

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

Как обновить только одну таблицу на форме, не перечитывая весь объект?

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

Итог

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

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