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

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

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

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

Выясним причину сброса позиции прокрутки

Проанализируем типовой фрагмент кода, в котором возникает ошибка отображения:


Таб.ТекущаяОбласть = Таб.Область("R600");
Таб.Показать();

При вызове метода Показать() платформа 1С инициализирует и отрисовывает новое окно документа. В момент его создания полосы прокрутки по умолчанию принудительно устанавливаются в начальное положение — верхний левый угол (ячейка R1C1). Фокус действительно остается на строке 600, но окно оказывается не прокрученным к этой ячейке.

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

Порядок вызова методов для отдельного окна

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


Таб.Показать();
Таб.ТекущаяОбласть = Таб.Область("R600");

В этом случае окно сначала отображается пользователю, а следующая строка кода немедленно перемещает область видимости вниз к строке 600.

Динамическое определение последней строки таблицы

В реальной разработке номер строки редко бывает фиксированным. Жесткое указание координат вида "R600" может привести к ошибкам, если в отчете сформировалось меньше строк, либо документ вовсе пуст. Разберем по шагам, как вычислять последнюю строку динамически:

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

Рассмотрим пример универсального кода:


// Открываем окно отчета
Таб.Показать("Анализ данных");

// Проверяем, что в документе есть выведенные строки
Если Таб.ВысотаТаблицы > 0 Тогда
    // Позиционируемся на первой ячейке последней строки
    Таб.ТекущаяОбласть = Таб.Область(Таб.ВысотаТаблицы, 1);
КонецЕсли;

Обращение через числовые координаты Таб.Область(НомерСтроки, НомерКолонки) избавляет от необходимости формировать строковое имя ячейки через функцию Формат().

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

Если отчет выводится не в отдельное модальное окно через Показать(), а встроен непосредственно в форму как элемент ПолеТабличногоДокумента, действуют другие правила:

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

&НаКлиенте
Процедура СформироватьОтчет(Команда)
    СформироватьОтчетНаСервере();
    
    // Активизируем элемент формы
    ЭтаФорма.ТекущийЭлемент = Элементы.ТабличныйДокументПоле;
    
    Если ТабличныйДокументПоле.ВысотаТаблицы > 0 Тогда
        ТабличныйДокументПоле.ТекущаяОбласть = ТабличныйДокументПоле.Область(ТабличныйДокументПоле.ВысотаТаблицы, 1);
    КонецЕсли;
КонецПроцедуры

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

Важные ограничения и нюансы

Рассмотрим факторы, которые могут препятствовать корректной прокрутке таблицы вниз:

  1. Фиксация шапки таблицы: если в документе задействовано свойство ФиксацияСверху, а целевая ячейка находится внутри зафиксированных строк, основная прокручиваемая часть документа не сдвинется с места. Убедитесь, что передаваемая ячейка находится строго ниже границы фиксации.
  2. Веб-клиент: из-за особенностей генерации DOM-дерева в браузерах прокрутка к активной области может срабатывать с визуальной задержкой.
  3. Горячие клавиши: при интерактивной работе без программных доработок пользователь может быстро перейти в конец любого табличного документа с помощью стандартной комбинации клавиш Ctrl + End.
← На главную