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

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

Как обновить страницу в 1С программно

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

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

Универсальной команды «обновить всё» в платформе нет: каждый элемент формы (динамический список, табличная часть, реквизиты объекта, поле HTML) обновляется своим способом. Ниже разобраны основные сценарии с примерами кода, ограничениями методов и способами проверить, что обновление действительно произошло.

Что именно нужно обновить: определяем сценарий

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

Типичные сценарии: обновить видимость и доступность элементов после изменения реквизита; перечитать данные объекта, изменённого другим пользователем или фоновым заданием; обновить журнал документов после проведения; перезагрузить веб-страницу, выведенную в поле HTML-документа; обновить данные на клиенте по таймеру.

Маршрут решения

Как выбрать метод обновления

Изменился реквизит и нужно пересчитать видимость, доступность, условное оформлениеЭтаФорма.ОбновитьОтображениеДанных()
Данные объекта изменены в базе другим сеансом или фоновым заданиемЭтаФорма.Прочитать() — но только если нет несохранённых изменений
Нужно обновить журнал документов или список справочникаЭлементы.Список.Обновить()
Нужно перезагрузить страницу в поле HTML-документаПовторно присвоить адрес или вызвать refresh через объект document

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

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

&НаКлиенте

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

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

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

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

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

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

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

&НаСервере

Процедура ПеречитатьОбъектНаСервере()

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

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

Безопасный вариант с проверкой:

&НаКлиенте

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

Если ЭтаФорма.Модифицированность Тогда

ПоказатьПредупреждение(, "Сначала сохраните изменения");

Возврат;

КонецЕсли;

ПеречитатьОбъектНаСервере();

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

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

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

&НаКлиенте

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

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

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

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

&НаКлиенте

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

Если ИмяСобытия = "Запись_РасходнаяНакладная" Тогда

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

КонецЕсли;

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

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

Обновление страницы в поле HTML-документа

Если под «страницей» понимается веб-страница, отображаемая в поле HTML-документа на форме, обновить её можно двумя способами. Первый — повторно присвоить реквизиту адрес или HTML-текст, что заставит поле перезагрузить содержимое:

&НаКлиенте

Процедура ПерезагрузитьСтраницу(Команда)

АдресСтраницы = "https://example.com/page?rnd=" + Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧГ=");

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

Добавление случайного параметра в URL предотвращает показ закэшированной версии. Второй способ — через объектную модель документа, если поле работает в режиме, допускающем доступ к DOM:

Документ = Элементы.ПолеHTML.Документ;

Документ.location.reload();

Доступ к DOM зависит от режима совместимости поля HTML и настроек безопасности: на новых версиях платформы с движком WebKit прямой доступ к document может быть ограничен. Если reload() недоступен, остаётся переприсвоение адреса.

Автоматическое обновление по таймеру

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

&НаКлиенте

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

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

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

&НаКлиенте

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

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

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

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

Порядок настройки автообновления списка
  1. 1
    Определите, какой элемент формы нужно обновлять, и вспомните его имя в дереве элементов
  2. 2
    Добавьте клиентскую процедуру обновления с вызовом Элементы.Список.Обновить()
  3. 3
    Подключите обработчик ожидания в ПриОткрытии с разумным интервалом (от 30–60 секунд)
  4. 4
    Отключите обработчик в ПриЗакрытии
  5. 5
    Проверьте работу: измените данные в другом сеансе и дождитесь тика таймера

Проверка результата и типичные ошибки

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

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

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

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

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

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

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

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

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

Можно ли обновить форму другого открытого окна?

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

Почему Элементы.Список.Обновить() не срабатывает?

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

Как обновить данные формы без перечитывания всего объекта?

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

Работает ли обновление по таймеру в веб-клиенте?

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