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

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

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

Разберем, почему возникает такое поведение платформы, и рассмотрим все доступные варианты решения данной задачи.

Причины поведения и специфика динамических списков

Выясним причину, по которой табличное поле журнала ведет себя подобным образом:

  1. Динамическое считывание данных. Табличное поле списка документов не загружает всю таблицу в память клиента. Оно считывает данные с сервера порциями, необходимыми для отображения видимой части окна. Из-за этого у источника данных нет коллекции всех строк (свойства вроде Строки), нет фиксированного количества элементов и прямого индексного обращения к последней записи.
  2. Ограничение свойства начального отображения. Свойство формы НачальноеОтображениеСписка, как и интерактивная настройка в режиме «1С:Предприятие» (меню «Действия» – «Настройка списка» – закладка «Прочее» – «При открытии переходить в конец списка»), предназначено строго для инициализации формы при ее открытии. При программном изменении фильтра форма не открывается повторно, а лишь перезапрашивает видимую часть данных с начала выборки.
  3. Отсутствие отдельного метода навигации. В объектной модели платформы 1С нет встроенного метода вида ПерейтиВКонец() для табличного поля динамического списка.

Вариант 1. Штатный программный переход через поиск ссылки

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

Разберем по шагам реализацию данного подхода:

  1. В обработчике смены страницы определяем текущий вид документа и применяем отбор к списку.
  2. Выполняем быстрый запрос к базе данных, получающий самый последний документ по установленному фильтру (с сортировкой по убыванию даты).
  3. Присваиваем полученную ссылку свойству ТекущаяСтрока табличного поля.

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


Процедура ПриСменеСтраницы(Элемент, ТекущаяСтраница)
    
    // 1. Устанавливаем необходимый отбор по виду документа
    // Например: СписокДокументов.Отбор.ВидДокумента.Установить(ИмяВыбранногоВида);
    
    // 2. Получаем ссылку на последний документ выборки
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |   Журнал.Ссылка КАК Ссылка
        |ИЗ
        |   ЖурналДокументов.СкладскиеДокументы КАК Журнал
        |ГДЕ
        |   Журнал.ВидДокумента = &ВидДокумента
        |УПОРЯДОЧИТЬ ПО
        |   Журнал.Дата УБЫВ,
        |   Журнал.Ссылка УБЫВ";
    
    Запрос.УстановитьПараметр("ВидДокумента", ИмяВыбранногоВида);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        // 3. Позиционируемся на найденный документ
        ЭлементыФормы.СписокДокументов.ТекущаяСтрока = Выборка.Ссылка;
    КонецЕсли;

КонецПроцедуры

Обратите внимание: если табличное поле не успевает обновить данные на клиенте до момента назначения строки, позиционирование может сорваться. В таких случаях вызов перехода к строке выносят в отдельную процедуру и подключают через однократный обработчик ожидания с задержкой 0.1 секунды:

ПодключитьОбработчикОжидания("ПерейтиКПоследнейСтроке", 0.1, Истина);

Вариант 2. Эмуляция нажатия горячих клавиш через WScript.Shell

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

Посмотрим на пример кода:


// Устанавливаем фокус на табличное поле списка
ТекущийЭлемент = ЭлементыФормы.СписокДокументов;

// Создаем COM-объект и отправляем комбинацию клавиш
Shell = Новый COMОбъект("WScript.Shell");
Shell.SendKeys("^{END}");

Рассмотрим подробнее ограничения этого метода:

  1. Зависимость от операционной системы. Объект WScript.Shell доступен исключительно в среде Windows. Данный код вызовет ошибку на рабочих местах под управлением Linux, macOS или при работе через веб-клиент.
  2. Сбои при потере фокуса. Если в момент отправки нажатия фокус ввода случайно сместится с табличного поля на другой элемент интерфейса (кнопку, поле ввода), эмуляция сработает некорректно.

Вариант 3. Изменение порядка сортировки по умолчанию

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

Вместо постоянной прокрутки списка вниз развернем порядок отображения данных:

  1. В свойствах журнала документов или настройках списка устанавливаем порядок сортировки по убыванию даты (Дата УБЫВ).
  2. При таком порядке самые последние созданные документы всегда физически располагаются в первой видимой строке вверху таблицы.
  3. При любом переключении закладок и установке новых отборов список всегда будет открываться на наиболее актуальных документах без необходимости дополнительного позиционирования.
← На главную