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

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

Когда обновляется динамический список в 1С

Разбираем, когда динамический список в 1С обновляется автоматически, как работает параметр автосохранения и обновления, методы Обновить() и типичные проблемы.

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

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

В статье разобраны все ситуации, когда динамический список обновляется сам, когда требуется ручное обновление, какие свойства и методы за это отвечают и какие ошибки приводят к «зависшим» данным на форме.

Как устроено обновление динамического списка

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

Ключевое свойство — «Обновление списка» (в палитре свойств реквизита формы типа «ДинамическийСписок»). Если оно установлено, платформа отслеживает события записи объектов и автоматически перечитывает данные. Если свойство снято, список обновляется только при явных действиях пользователя или программных вызовах.

Ситуации, когда список обновляется автоматически

Автоматическое обновление срабатывает в нескольких стандартных сценариях. Во-первых, при записи объекта, чей тип входит в основную таблицу запроса: например, список документов «Реализация товаров» обновится после проведения или отмены проведения такого документа. Платформа отслеживает события записи и посылает форме сигнал перечитать данные.

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

  • запись, проведение или пометка удаления объекта основной таблицы запроса;
  • изменение значений параметров произвольного запроса;
  • изменение отбора, сортировки, группировки пользователем или кодом;
  • нажатие клавиши F5 или кнопки «Обновить» пользователем;
  • программный вызов метода обновления у элемента формы.
Список обновляется сам после записи документаНорма

Свойство обновления включено, тип объекта совпадает с таблицей запроса

Список не реагирует на записьВозможна проблема

Проверить свойство обновления и наличие произвольного запроса с временными таблицами

Форма тормозит при работе со спискомСлишком частые обновления

Проверить, не вызывается ли Обновить() в цикле или обработчике ожидания

Программное обновление: метод Обновить()

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

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

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

1c
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "Запись_РеализацияТоваровУслуг" Тогда
        Элементы.Список.Обновить();
    КонецЕсли;
КонецПроцедуры

Когда автоматическое обновление не срабатывает

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

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

Настройка поведения: свойства и типовые приёмы

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

Как настроить обновление списка
  1. 1
    Откройте форму списка в конфигураторе и найдите реквизит типа ДинамическийСписок
  2. 2
    Проверьте свойство «Обновление списка» — включите его для стандартного поведения
  3. 3
    Если используется произвольный запрос с временными таблицами — добавьте вызов Элементы.Список.Обновить() в ОбработкаОповещения
  4. 4
    В формах, изменяющих данные, вызывайте ОповеститьОбИзменении() после записи
  5. 5
    Протестируйте: откройте список, измените данные в другой форме, убедитесь, что строка появилась или изменилась

Обновление при изменении параметров

При изменении значения параметра запроса через Список.Параметры.УстановитьЗначениеПараметра() список перечитывается автоматически — отдельный вызов Обновить() не требуется. Это удобно для программной фильтрации: достаточно установить параметр, и форма сама покажет новые данные.

Обновление при динамическом считывании данных

Если в списке включено динамическое считывание данных (свойство таблицы формы «ОбновлениеПриИзмененииДанных» или аналогичные механизмы в зависимости от версии платформы), поведение может отличаться: платформа перечитывает текущую строку при изменении связанных данных. Проверяйте актуальную документацию под свою версию платформы.

Способы обновления списка

Автоматическое (свойство обновления)

Подходит для стандартных списков без временных таблиц; не работает для сложных произвольных запросов

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

Точечное обновление конкретной формы; требует ручного вызова в нужных обработчиках

ОповеститьОбИзменении(Тип)

Обновляет все открытые списки с этим типом; удобно при массовых изменениях, но затрагивает все окна

Типичные проблемы и их диагностика

Самая частая жалоба — «документ записали, а в списке его нет». Порядок диагностики: проверить, включено ли свойство обновления; нет ли в запросе временных таблиц; совпадает ли тип записанного объекта с таблицей запроса; не наложен ли отбор, который отсекает новую запись. Часто запись есть в базе, но скрыта пользовательским отбором.

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

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

Как проверить результат

Запись объекта из другой формы
Норма

Строка появляется или изменяется в списке без нажатия F5

Тревожный признак

Список не меняется до ручного обновления

Поведение при массовой обработке
Норма

Список обновляется один раз по завершении

Тревожный признак

Форма перерисовывается после каждой записи

Нагрузка на сервер
Норма

Обновления происходят только по событиям

Тревожный признак

Запросы к СУБД идут каждые несколько секунд от каждой формы

Рекомендации по производительности

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

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

При массовой загрузке данных вызывайте ОповеститьОбИзменении один раз после цикла, а не внутри него. Это простое изменение часто убирает жалобы пользователей на «мерцание» и подвисание открытых списков во время обмена данными.
ПЗ
Практическое замечание

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

Почему список не обновляется после записи документа из другой формы?

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

Нужно ли вызывать Обновить() после изменения параметра запроса?

Нет. Установка значения параметра через Список.Параметры.УстановитьЗначениеПараметра() сама инициирует перечитывание данных списка.

Обновится ли список, если данные изменились через обмен данными?

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

Как обновить сразу все открытые списки с нужным типом объектов?

Используйте ОповеститьОбИзменении() с указанием типа — платформа сама найдёт и обновит все открытые динамические списки, содержащие этот тип. Вызывайте после завершения пакетной операции, а не при каждой записи.

Можно ли сделать автообновление списка по таймеру?

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

Итог

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

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