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