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