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

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

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

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

Почему табличный документ прокручивается к нижнему краю

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

Перемещение по документу осуществляется путем назначения свойства ТекущаяОбласть. При этом платформа рассчитывает принцип минимального необходимого смещения:

  1. Если активизируемая ячейка уже находится внутри видимой области экрана, прокрутка не выполняется вовсе.
  2. Если целевая ячейка расположена выше видимой области, таблица прокручивается вверх так, чтобы ячейка коснулась верхнего края экрана.
  3. Если целевая ячейка расположена ниже видимой зоны, платформа смещает полосу прокрутки ровно настолько, чтобы ячейка показалась у нижней границы окна.

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

Способ 1. Активизация диапазона ячеек вместо одной ячейки

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

Когда платформа пытается уместить в видимую область большой диапазон, превышающий размеры экрана или сопоставимый с ним, она выравнивает верхнюю границу этого блока по верхнему краю окна. Посмотрим на пример реализации клиентской процедуры:


&НаКлиенте
Процедура ПрокрутитьКСтроке(НомерСтроки)
    
    // Определяем примерную высоту видимой области в строках
    ВысотаЭкрана = 35;
    
    // Задаем диапазон: от нужной строки вниз
    ОбластьДляВыравнивания = Элементы.ТабличныйДокументПоле.Область(НомерСтроки, 1, НомерСтроки + ВысотаЭкрана, 1);
    
    // Активизируем диапазон, ориентируя платформу на выравнивание по верхнему краю
    Элементы.ТабличныйДокументПоле.ТекущаяОбласть = ОбластьДляВыравнивания;
    
    // Возвращаем выделение на саму целевую ячейку
    Элементы.ТабличныйДокументПоле.ТекущаяОбласть = Элементы.ТабличныйДокументПоле.Область(НомерСтроки, 1);
    
КонецПроцедуры

В этом сценарии интерфейс моментально прокручивается к началу целевого блока, после чего курсор остается на нужной строке без лишних скачков полосы прокрутки.

Способ 2. Двухэтапная прокрутка через обработчик ожидания

Если требуется строго имитировать прокрутку "сверху вниз", можно применить подход, основанный на двух последовательных активизациях областей. Если активизировать область, находящуюся заведомо ниже требуемой, документ прокрутится глубоко вниз. Если после этого активизировать нужную строку, для платформы она окажется выше текущей позиции видимости, и таблица сместится так, что строка встанет строго у верхнего края.

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

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


&НаКлиенте
Перем мЦелеваяСтрока;

&НаКлиенте
Процедура ПерейтиКСтрокеВверху(НомерСтроки)
    
    мЦелеваяСтрока = НомерСтроки;
    
    // Шаг 1: смещаемся на область ниже целевой
    СмещениеВниз = 50;
    СтрокаНиже = НомерСтроки + СмещениеВниз;
    
    Элементы.ТабличныйДокументПоле.ТекущаяОбласть = Элементы.ТабличныйДокументПоле.Область(СтрокаНиже, 1);
    
    // Шаг 2: подключаем обработчик для возврата на целевую строку
    ПодключитьОбработчикОжидания("ЗавершитьПозиционирование", 0.1, Истина);
    
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьПозиционирование()
    
    // Целевая строка теперь выше экрана, платформа покажет ее у верхнего края
    Элементы.ТабличныйДокументПоле.ТекущаяОбласть = Элементы.ТабличныйДокументПоле.Область(мЦелеваяСтрока, 1);
    
КонецПроцедуры

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

Способ 3. Динамическое формирование документа от выбранного узла

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

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

Способ 4. Использование поля HTML-документа

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

Преимущества HTML-документа для решения подобных задач:

  1. Прямое управление положением экрана с помощью JavaScript: метод element.scrollIntoView({block: 'start', behavior: 'smooth'}) позволяет плавно и точно спозиционировать любой блок строго по верхней границе.
  2. Возможность быстрой навигации по стандартным якорям (URL-хэшам вида #block_id).
  3. Полный контроль над стилями, адаптивностью блоков и векторной графикой.

Выбор конкретного решения зависит от структуры вашего решения: для готовых отчетов в формате табличного документа оптимально использовать активацию расширенного диапазона строк, а для сложных дашбордов и инфографики целесообразно рассмотреть применение HTML-верстки.

← На главную