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