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

Программист 1С v8.3 (Управляемые формы)
← На главную

В процессе разработки систем мониторинга на платформе 1С:Предприятие 8.3 часто возникает задача отображения данных в реальном времени. Типичная ситуация: у нас есть периодический регистр сведений, куда постоянно поступают новые записи (например, логи производственных процессов или статусы оборудования). Стандартный механизм динамического списка позволяет включить автообновление, но платформа по умолчанию сохраняет позицию курсора на старой записи, из-за чего новые строки остаются "за кадром" выше видимой области. Разберем подробно, как заставить интерфейс автоматически показывать самые свежие данные.

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

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

Использование обработчика ожидания для управления списком

Рассмотрим основной способ решения через использование метода ПодключитьОбработчикОжидания. Это позволит нам не только обновлять данные, но и выполнять код по управлению визуальным состоянием формы. В процедуре ПриОткрытии на клиенте нам нужно инициировать этот процесс.


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем обработчик с интервалом 5 секунд
    ПодключитьОбработчикОжидания("ОбработчикОбновленияСписка", 5);
КонецПроцедуры

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


&НаКлиенте
Процедура ОбработчикОбновленияСписка()
    // Обновляем данные динамического списка
    Элементы.Список.Обновить();
    
    // Если сортировка установлена по убыванию даты, 
    // новые записи будут всегда в начале списка.
    // Попробуем сбросить выделение на первую строку.
    // Однако прямого метода "ПерейтиВНачало" у списка нет.
КонецПроцедуры

Метод принудительной переинициализации через параметры

Выясним причину, по которой простой Обновить() не всегда помогает визуально "подтянуть" список вверх. В 1С динамический список работает порционно. Чтобы заставить его сбросить текущую позицию и вернуться к настройке НачальноеОтображениеСписка, можно использовать небольшую хитрость с параметрами запроса. Если мы программно изменим значение параметра в запросе динамического списка, платформа воспримет это как необходимость полного перестроения списка и вернет фокус в начало (если в свойствах списка установлено НачальноеОтображениеСписка — Начало).

Рассмотрим реализацию этого метода. Добавим в запрос динамического списка фиктивное условие, например: ГДЕ (&ХитраяДата = ДАТАВРЕМЯ(1,1,1) ИЛИ ИСТИНА). Это условие никак не влияет на результат выборки, но изменение параметра ХитраяДата заставит список обновиться полностью.


&НаКлиенте
Процедура ОбработчикОбновленияСписка()
    // Устанавливаем в параметр текущую дату/время, чтобы запрос считался "новым"
    ТекущаяВерсия = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ХитраяДата"));
    
    // Передаем новое значение параметра
    Список.Параметры.УстановитьЗначениеПараметра("ХитраяДата", ТекущаяДата());
    
    // После этого список перестроится и, согласно настройкам формы, 
    // отобразит верхние (самые новые) записи.
КонецПроцедуры

Проблема "залипания" курсора и удобство пользователя

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

Посмотрим на пример расширенной логики в обработчике:


&НаКлиенте
Процедура ОбработчикОбновленияСписка()
    // Проверяем, не выделено ли пользователем что-то конкретное
    Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда
        Элементы.Список.Обновить();
    Иначе
        // Логика: если мы уже в начале (первая строка), обновляем.
        // Если пользователь ушел вниз — не трогаем, чтобы не сбивать фокус.
        // Для реализации требуется получение ключа первой строки через серверный вызов.
    КонецЕсли;
КонецПроцедуры

Оптимизация производительности при частом обновлении

Важно помнить, что частое использование Обновить() или переинициализация через параметры создает нагрузку на сервер и сеть. Разберем рекомендации по оптимизации:

  1. Интервал обновления: Не ставьте интервал менее 3–5 секунд. Для большинства производственных задач этого достаточно, а интерфейс будет работать плавнее.
  2. Легкость запроса: В динамическом списке, который обновляется автоматически, не должно быть тяжелых соединений (ЛЕВОЕ СОЕДИНЕНИЕ с большими таблицами) или сложных вычисляемых полей. Чем быстрее отработает запрос на сервере, тем меньше "фризов" заметит пользователь.
  3. Индексация: Убедитесь, что поле, по которому идет сортировка (обычно Период для периодических регистров), проиндексировано. Это критически важно для динамических списков.

Использование оповещений об изменении данных

Если данные в регистр пишутся из этой же базы другими пользователями, можно рассмотреть механизм ОповещениеОИзмененииДанных. Мы можем вызвать процедуру ОповеститьОбИзменении(Тип("РегистрСведенийКлючЗаписи.ИмяВашегоРегистра")) в модуле набора записей после записи. Это заставит все открытые формы списков этого регистра обновиться автоматически. Однако это не решит вопрос позиционирования курсора, поэтому комбинация с обработчиком ожидания и проверкой текущей позиции остается самым надежным инструментом.

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

← На главную