При работе с объемными документами пользователям часто требуется видеть самые свежие записи, добавленные в конец таблицы, а также сразу понимать общее количество строк без лишней ручной прокрутки. Разберем, как реализовать автоматическую прокрутку табличной части к последним строкам при открытии формы и какие особенности платформы необходимо учитывать.
Проанализируем сначала возможности настройки элементов без программирования. В управляемых формах 1С у элементов, отображающих динамический список, предусмотрено стандартное свойство НачальноеОтображениеСписка, в котором можно выбрать вариант Конец. Однако для таблиц формы, связанных с табличными частями объектов (тип данных ДанныеФормыКоллекция), такого свойства в палитре свойств нет.
Сортировка строк в обратном порядке также не всегда решает задачу, поскольку она меняет физический или отображаемый порядок строк, но оставляет фокус и видимую область на первой строке. Таким образом, автоматическое перемещение фокуса и прокрутка таблицы вниз реализуются исключительно программным путем.
Чтобы видимая область таблицы переместилась вниз, не обязательно вручную высчитывать смещение на несколько строк назад. Достаточно установить свойство элемента формы ТекущаяСтрока на самую последнюю строку коллекции. Платформа 1С автоматически выполнит скролл, и на экране отобразится нижняя часть таблицы вместе с предшествующими строками.
Для управляемых форм привязка к текущей строке выполняется через внутренний идентификатор строки с помощью метода ПолучитьИдентификатор(). Разберем по шагам правильную реализацию с обязательной проверкой на наличие строк, чтобы исключить ошибку выхода индекса за пределы диапазона.
Посмотрим на пример кода клиентского обработчика:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПерейтиКПоследнейСтроке();
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиКПоследнейСтроке()
КоличествоСтрок = Объект.Товары.Количество();
Если КоличествоСтрок > 0 Тогда
ПоследняяСтрока = Объект.Товары[КоличествоСтрок - 1];
Элементы.Товары.ТекущаяСтрока = ПоследняяСтрока.ПолучитьИдентификатор();
КонецЕсли;
КонецПроцедуры
Рассмотрим важные моменты данного алгоритма:
Если КоличествоСтрок > 0 гарантирует, что при открытии нового или пустого документа не возникнет исключительная ситуация.КоличествоСтрок - 1.ПриОткрытии на стороне клиента. Назначение свойства ТекущаяСтрока на сервере (например, в процедуре ПриСозданииНаСервере) часто игнорируется платформой при финальной визуализации формы в тонком или веб-клиенте.В сложных формах с большим количеством элементов или при работе через веб-клиент на момент выполнения события ПриОткрытии визуальная сетка таблицы может не успеть завершить расчет геометрических размеров. В такой ситуации прямое присвоение свойства ТекущаяСтрока может не привести к визуальному сдвигу скролла.
Для гарантированного смещения видимой области применим однократное подключение обработчика ожидания с минимальной задержкой. Разберем этот пример:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОжидание("ПрокрутитьТаблицуККонцу", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПрокрутитьТаблицуККонцу()
Количество = Объект.Товары.Количество();
Если Количество > 0 Тогда
Элементы.Товары.ТекущаяСтрока = Объект.Товары[Количество - 1].ПолучитьИдентификатор();
КонецЕсли;
КонецПроцедуры
Параметр Истина в методе ПодключитьОжидание указывает на то, что процедура выполнится всего один раз сразу после того, как интерфейс формы будет полностью сформирован.
Если цель прокрутки заключается исключительно в том, чтобы видеть общее количество строк или оперативно заносить новые позиции в поле зрения, рассмотрим альтернативные варианты интерфейсных решений:
Подвал у элемента таблицы формы. Для колонки номера строки в свойство ТекстПодвала можно выводить общее число строк через свойство Объект.Товары.Количество() при открытии и после любого изменения состава строк. Пользователь сразу увидит объем документа без необходимости листать список.Декорация - надпись, выводящий динамический счетчик строк документа.Вставить(0) вместо стандартного метода Добавить(). Тогда самые новые записи всегда будут находиться в верхней видимой части таблицы при открытии формы.