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