При разработке интерфейсов журналов документов часто используется разделение по видам с помощью страниц (закладок). При переключении страницы программно устанавливается отбор по соответствующему виду документа. Однако разработчики сталкиваются с особенностью платформы 1С: свойство НачальноеОтображениеСписка.Конец отрабатывает исключительно в момент первого открытия формы. При смене отбора табличное поле динамически обновляет данные и сбрасывает фокус на самую первую строку выборки, в то время как пользователю требуются последние, самые актуальные документы.
Разберем, почему возникает такое поведение платформы, и рассмотрим все доступные варианты решения данной задачи.
Выясним причину, по которой табличное поле журнала ведет себя подобным образом:
Строки), нет фиксированного количества элементов и прямого индексного обращения к последней записи.НачальноеОтображениеСписка, как и интерактивная настройка в режиме «1С:Предприятие» (меню «Действия» – «Настройка списка» – закладка «Прочее» – «При открытии переходить в конец списка»), предназначено строго для инициализации формы при ее открытии. При программном изменении фильтра форма не открывается повторно, а лишь перезапрашивает видимую часть данных с начала выборки.ПерейтиВКонец() для табличного поля динамического списка.Рассмотрим правильный с точки зрения архитектуры 1С способ. Свойство табличного поля ТекущаяСтрока принимает не порядковый номер и не строку таблицы значений, а непосредственную ссылку на документ (ДокументСсылка). Если присвоить этому свойству ссылку на последний документ, входящий в текущий отбор, платформа автоматически выполнит позиционирование и отобразит нужную порцию списка.
Разберем по шагам реализацию данного подхода:
ТекущаяСтрока табличного поля.Посмотрим на пример программного кода для обычной формы:
Процедура ПриСменеСтраницы(Элемент, ТекущаяСтраница)
// 1. Устанавливаем необходимый отбор по виду документа
// Например: СписокДокументов.Отбор.ВидДокумента.Установить(ИмяВыбранногоВида);
// 2. Получаем ссылку на последний документ выборки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Журнал.Ссылка КАК Ссылка
|ИЗ
| ЖурналДокументов.СкладскиеДокументы КАК Журнал
|ГДЕ
| Журнал.ВидДокумента = &ВидДокумента
|УПОРЯДОЧИТЬ ПО
| Журнал.Дата УБЫВ,
| Журнал.Ссылка УБЫВ";
Запрос.УстановитьПараметр("ВидДокумента", ИмяВыбранногоВида);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
// 3. Позиционируемся на найденный документ
ЭлементыФормы.СписокДокументов.ТекущаяСтрока = Выборка.Ссылка;
КонецЕсли;
КонецПроцедуры
Обратите внимание: если табличное поле не успевает обновить данные на клиенте до момента назначения строки, позиционирование может сорваться. В таких случаях вызов перехода к строке выносят в отдельную процедуру и подключают через однократный обработчик ожидания с задержкой 0.1 секунды:
ПодключитьОбработчикОжидания("ПерейтиКПоследнейСтроке", 0.1, Истина);
Проанализируем быстрый обходной способ, предложенный на форуме. Он заключается в программной передаче фокуса в табличное поле и эмуляции нажатия комбинации клавиш Ctrl + End, которая в платформе 1С штатно перемещает указатель в самый конец динамического списка.
Посмотрим на пример кода:
// Устанавливаем фокус на табличное поле списка
ТекущийЭлемент = ЭлементыФормы.СписокДокументов;
// Создаем COM-объект и отправляем комбинацию клавиш
Shell = Новый COMОбъект("WScript.Shell");
Shell.SendKeys("^{END}");
Рассмотрим подробнее ограничения этого метода:
WScript.Shell доступен исключительно в среде Windows. Данный код вызовет ошибку на рабочих местах под управлением Linux, macOS или при работе через веб-клиент.Рассмотрим еще один практичный подход, который кардинально снимает проблему навигации без написания сложного кода. Зачастую цель перехода в конец списка — дать пользователю возможность сразу видеть самые свежие документы.
Вместо постоянной прокрутки списка вниз развернем порядок отображения данных:
Дата УБЫВ).