Как исправить бесконечную циклическую прокрутку в динамическом списке 1С 8.3 при сортировке по дате?

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

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

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

Выясняем причину: почему список «зацикливается»?

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

Когда мы устанавливаем сортировку по полю Дата, платформа строит запрос, который выглядит примерно так: «Выбрать первые 50 записей, где Дата больше или равна Дате последней видимой записи». Если в вашей базе данных присутствует большое количество записей с абсолютно одинаковым временем (например, много документов за одну секунду), возникает проблема неуникальности ключа сортировки.

Платформа не может однозначно определить «точку остановки». При достижении конца выборки, если условия фильтрации по дате и внутренние механизмы определения позиции курсора отрабатывают некорректно (что признавалось багом в ряде релизов платформы 8.3.13–8.3.15), система может повторно подхватить данные, которые уже были показаны. В результате пользователь видит циклическое повторение строк.

Способ 1. Отключение динамического считывания данных

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

  1. Откройте конфигуратор и найдите нужную управляемую форму.
  2. Перейдите на закладку «Реквизиты» и выберите основной реквизит формы с типом ДинамическийСписок.
  3. В окне свойств реквизита найдите раздел «Настройки».
  4. Обратите внимание на свойство ДинамическоеСчитываниеДанных.

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

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

Способ 2. Обеспечение уникальности через составную сортировку

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

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


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

Благодаря добавлению поля Ссылка в порядок, каждая строка списка получает уникальную позицию. Даже если у ста документов дата совпадает до секунды, их ссылки всегда уникальны, и платформа сможет четко выстроить их в ряд, исключая возможность зацикливания.

Способ 3. Использование основной таблицы в произвольном запросе

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

Когда вы указываете в настройках списка основную таблицу (например, Документ.РеализацияТоваровУслуг), платформа автоматически выполняет ряд оптимизаций:

Если же основная таблица не указана (например, в запросе используются ОБЪЕДИНИТЬ или сложные соединения, где система не может однозначно определить источник данных), автоматическая стабилизация сортировки отключается. В этом случае вы получаете «сырой» SQL-вывод, который при определенных условиях (те же неуникальные даты) превращается в бесконечный цикл.

Рекомендация: Всегда старайтесь указывать ОсновнуюТаблицу в свойствах динамического списка. Если ваш запрос слишком сложен для этого, обязательно используйте Способ 2 (программное добавление Ссылки в порядок).

Дополнительные факторы: версии платформы и индексы

Рассмотрим ситуацию, когда настройки верны, но проблема сохраняется. На некоторых версиях платформы (в частности, 8.3.13.1690, упомянутой в обсуждении) данный эффект признавался зарегистрированной ошибкой. В новых релизах (начиная с 8.3.16 и выше) логика работы динамических списков была переработана, и механизмы пагинации стали более устойчивыми к неуникальным индексам.

Также проанализируем состояние базы данных на уровне SQL-сервера. Если записи в список попадают в нестабильном порядке, попробуйте выполнить регламентные операции:

  1. Обновление статистик базы данных.
  2. Перестройка (реиндексация) индексов таблицы.

В редких случаях «прыжки» в списке связаны с тем, что SQL-сервер выбирает неоптимальный план выполнения запроса, считая, что записи с одинаковой датой можно возвращать в произвольном порядке при каждом новом обращении.

Подведем итоги

Бесконечная прокрутка в 1С 8.3 — это не мистика, а следствие работы алгоритмов динамического считывания данных при отсутствии уникального ключа сортировки. Чтобы гарантированно победить этот эффект, мы рекомендуем придерживаться следующего алгоритма:

1. Проверьте, установлена ли Основная таблица в настройках динамического списка.
2. Если используется сортировка по дате, убедитесь, что вторым полем в сортировке (пусть даже скрытым) идет Ссылка.
3. В качестве экстренной меры отключите Динамическое считывание данных в свойствах реквизита списка.
4. Если есть возможность, обновите платформу до актуального релиза (ветки 8.3.20 и выше практически лишены данной проблемы).

Соблюдение этих простых правил позволит сделать работу ваших пользователей комфортной, а интерфейсы — предсказуемыми и стабильными.

← На главную