Разработка и Конфигурация · 10 мин
Как обновить страницу в 1С программно
Как программно обновить страницу, форму, табличную часть или динамический список в 1С. Методы ОбновитьОтображениеДанных, Прочитать, примеры кода и типичные ошибки.
Задача обновить страницу или форму в 1С программно возникает в двух разных контекстах, которые часто путают. Первый — обновление формы объекта, журнала документов или элемента интерфейса в управляемом приложении после изменения данных. Второй — обновление содержимого веб-страницы, отображаемой в поле HTML-документа. В обоих случаях есть штатные методы встроенного языка, и важно выбрать правильный, иначе обновление либо не сработает, либо приведёт к потере несохранённых данных у пользователя.
Универсальной команды «обновить всё» в платформе нет: каждый элемент формы (динамический список, табличная часть, реквизиты объекта, поле HTML) обновляется своим способом. Ниже разобраны основные сценарии с примерами кода, ограничениями методов и способами проверить, что обновление действительно произошло.
Что именно нужно обновить: определяем сценарий
Прежде чем писать код, определите, какой элемент должен обновиться. От этого зависит выбор метода: попытка обновить динамический список через Прочитать() не даст результата, а Прочитать() на форме с несохранёнными изменениями затрёт ввод пользователя.
Типичные сценарии: обновить видимость и доступность элементов после изменения реквизита; перечитать данные объекта, изменённого другим пользователем или фоновым заданием; обновить журнал документов после проведения; перезагрузить веб-страницу, выведенную в поле HTML-документа; обновить данные на клиенте по таймеру.
Как выбрать метод обновления
Обновление отображения данных формы
Метод ОбновитьОтображениеДанных() — самый безопасный способ «освежить» форму. Он не перечитывает данные из базы, а лишь заставляет платформу заново отрисовать элементы: применить условное оформление, обновить видимость и доступность, пересчитать представления. Метод доступен на клиенте и на сервере в контексте формы.
&НаКлиенте
Процедура ОбновитьФорму(Команда)
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
Если нужно обновить не всю форму, а конкретный элемент (например, табличную часть), передайте его в параметре: ЭтаФорма.ОбновитьОтображениеДанных(Элементы.Товары). Это снижает нагрузку при работе с тяжёлыми формами.
Важно понимать границу метода: если данные в базе изменились, ОбновитьОтображениеДанных их не покажет — он работает только с тем, что уже загружено в форму. Для перечитывания из базы нужен другой подход.
Перечитывание объекта из базы данных
Метод Прочитать() формы загружает актуальную версию объекта из информационной базы и заменяет данные в форме. Типовой сценарий — документ изменён фоновым заданием или другим пользователем, и нужно показать свежие данные.
&НаСервере
Процедура ПеречитатьОбъектНаСервере()
ЭтаФорма.Прочитать();
КонецПроцедуры
Безопасный вариант с проверкой:
&НаКлиенте
Процедура ОбновитьИзБазы(Команда)
Если ЭтаФорма.Модифицированность Тогда
ПоказатьПредупреждение(, "Сначала сохраните изменения");
Возврат;
КонецЕсли;
ПеречитатьОбъектНаСервере();
КонецПроцедуры
Обновление динамического списка
Журналы документов и списки справочников в управляемых формах построены на динамических списках. Чтобы обновить такой список программно, используется метод Обновить() элемента формы:
&НаКлиенте
Процедура ОбновитьСписок(Команда)
Элементы.Список.Обновить();
КонецПроцедуры
Частая задача — обновить список после записи объекта из другой формы. Для этого в форме списка обрабатывается событие ОбработкаОповещения: при записи объекта платформа рассылает оповещение, и список может отреагировать.
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "Запись_РасходнаяНакладная" Тогда
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедуры
Для частичного обновления (только текущей строки, без полного перечитывания запроса) можно использовать ОповеститьОбИзменении(Ссылка) — платформа сама обновит строки с этой ссылкой во всех открытых списках.
Обновление страницы в поле HTML-документа
Если под «страницей» понимается веб-страница, отображаемая в поле HTML-документа на форме, обновить её можно двумя способами. Первый — повторно присвоить реквизиту адрес или HTML-текст, что заставит поле перезагрузить содержимое:
&НаКлиенте
Процедура ПерезагрузитьСтраницу(Команда)
АдресСтраницы = "https://example.com/page?rnd=" + Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧГ=");
КонецПроцедуры
Добавление случайного параметра в URL предотвращает показ закэшированной версии. Второй способ — через объектную модель документа, если поле работает в режиме, допускающем доступ к DOM:
Документ = Элементы.ПолеHTML.Документ;
Документ.location.reload();
Доступ к DOM зависит от режима совместимости поля HTML и настроек безопасности: на новых версиях платформы с движком WebKit прямой доступ к document может быть ограничен. Если reload() недоступен, остаётся переприсвоение адреса.
Автоматическое обновление по таймеру
Для периодического обновления данных (мониторинг заказов, дашборды) используется механизм ожидания на клиенте — ПодключитьОбработчикОжидания:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ОбновитьДанныеПоТаймеру", 60);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанныеПоТаймеру()
Элементы.Список.Обновить();
КонецПроцедуры
При закрытии формы обработчик следует отключать через ОтключитьОбработчикОжидания, иначе возможны вызовы по уже недействительной форме и ошибки в журнале регистрации. Интервал меньше нескольких секунд задавать не рекомендуется: каждый тик — это обращение к серверу и нагрузка на базу.
- 1Определите, какой элемент формы нужно обновлять, и вспомните его имя в дереве элементов
- 2Добавьте клиентскую процедуру обновления с вызовом Элементы.Список.Обновить()
- 3Подключите обработчик ожидания в ПриОткрытии с разумным интервалом (от 30–60 секунд)
- 4Отключите обработчик в ПриЗакрытии
- 5Проверьте работу: измените данные в другом сеансе и дождитесь тика таймера
Проверка результата и типичные ошибки
Признак успешного обновления — изменившиеся данные видны в форме без её переоткрытия, а несохранённый ввод пользователя не потерян. Если после вызова метода ничего не изменилось, проверьте: тот ли элемент обновляется (имя элемента в коде совпадает с именем в конфигураторе), не выполняется ли код не в том контексте (серверная процедура без контекста формы не имеет доступа к Элементы), и действительно ли данные в базе изменились.
Что важно запомнить
ОбновитьОтображениеДанных() перерисовывает форму, Прочитать() перечитывает объект из базы (с риском потери несохранённых данных), Элементы.Список.Обновить() обновляет динамический список, а страницу в поле HTML перезагружают повторной установкой адреса. Для периодического обновления используйте обработчик ожидания с отключением при закрытии формы.
Частые вопросы
Как обновить форму списка из формы документа после записи?
Используйте оповещения: в форме списка опишите ОбработкаОповещения и реагируйте на событие записи, вызывая Элементы.Список.Обновить(). Либо вызовите ОповеститьОбИзменении(Ссылка) после записи — тогда платформа сама обновит строки с этой ссылкой во всех открытых формах без полного перечитывания списка.
Чем ОбновитьОтображениеДанных отличается от Прочитать?
ОбновитьОтображениеДанных только перерисовывает элементы формы на основании уже загруженных данных — применяет условное оформление, видимость, доступность. Прочитать обращается к базе и полностью заменяет данные формы свежей версией объекта, что при несохранённых изменениях приводит к их потере.
Можно ли обновить форму другого открытого окна?
Напрямую обратиться к чужой форме нельзя, но можно получить её через Оповестить() с уникальным именем события: форма-получатель в ОбработкаОповещения выполнит своё обновление. Также доступен способ через ОткрытыеОкна или передачу формы-владельца при открытии, но механизм оповещений — штатный и надёжный путь.
Почему Элементы.Список.Обновить() не срабатывает?
Чаще всего не совпадает имя элемента: проверьте в конфигураторе точное имя таблицы формы, связанной с динамическим списком. Также метод не поможет, если данные не изменились в базе или если обновление вызывается в контексте, где элементы формы недоступны (например, в серверной процедуре вне контекста формы).
Как обновить данные формы без перечитывания всего объекта?
Если нужно обновить только отдельные показатели (итоги, остатки, счётчики), не трогая сам объект, выведите их в реквизиты формы и обновляйте эти реквизиты отдельным серверным вызовом, затем примените ОбновитьОтображениеДанных(). Так форма не потеряет несохранённые данные и не будет перечитывать весь объект.
Работает ли обновление по таймеру в веб-клиенте?
Да, ПодключитьОбработчикОжидания работает и в тонком, и в веб-клиенте. Ограничения те же: разумный интервал, отключение при закрытии формы и учёт того, что каждый вызов — это обращение к серверу. В веб-клиенте дополнительно учитывайте сетевую задержку при выборе интервала.