При разработке интерактивных форм в 1С часто возникает задача синхронизации двух элементов управления. Например, в левой части формы расположено дерево значений или список элементов, а в правой — поле табличного документа, отображающее связанную информацию. При активизации строки в дереве требуется выделить соответствующую область в табличном документе и прокрутить его так, чтобы нужная ячейка оказалась вверху видимой области.
Однако при программном переходе стандартными средствами разработчики сталкиваются с особенностью платформы: если ячейка находится ниже текущей видимой зоны, таблица прокручивается вниз ровно настолько, чтобы активизируемая область появилась у самого нижнего края экрана. Рассмотрим причины такого поведения платформы 1С и разберем проверенные способы решения этой задачи.
Проанализируем механику работы поля табличного документа в управляемых формах 1С. В платформе для объекта ТабличныйДокумент и элемента формы ПолеТабличногоДокумента не предусмотрено прямого управления положением полосы прокрутки. В объектной модели отсутствуют свойства, задающие точное вертикальное смещение скролла (scroll offset) или номер первой видимой строки.
Перемещение по документу осуществляется путем назначения свойства ТекущаяОбласть. При этом платформа рассчитывает принцип минимального необходимого смещения:
По этой причине стандартное присвоение одиночной ячейки свойству ТекущаяОбласть не позволяет гарантированно поместить целевую строку в верхнюю часть экрана, если пользователь перемещается по дереву сверху вниз.
Разберем наиболее изящный способ позиционирования, который не требует использования таймеров и не вызывает визуального мерцания интерфейса. Вместо выделения одной целевой ячейки выделим программно диапазон строк, начинающийся от целевой строки и простирающийся вниз на высоту экрана.
Когда платформа пытается уместить в видимую область большой диапазон, превышающий размеры экрана или сопоставимый с ним, она выравнивает верхнюю границу этого блока по верхнему краю окна. Посмотрим на пример реализации клиентской процедуры:
&НаКлиенте
Процедура ПрокрутитьКСтроке(НомерСтроки)
// Определяем примерную высоту видимой области в строках
ВысотаЭкрана = 35;
// Задаем диапазон: от нужной строки вниз
ОбластьДляВыравнивания = Элементы.ТабличныйДокументПоле.Область(НомерСтроки, 1, НомерСтроки + ВысотаЭкрана, 1);
// Активизируем диапазон, ориентируя платформу на выравнивание по верхнему краю
Элементы.ТабличныйДокументПоле.ТекущаяОбласть = ОбластьДляВыравнивания;
// Возвращаем выделение на саму целевую ячейку
Элементы.ТабличныйДокументПоле.ТекущаяОбласть = Элементы.ТабличныйДокументПоле.Область(НомерСтроки, 1);
КонецПроцедуры
В этом сценарии интерфейс моментально прокручивается к началу целевого блока, после чего курсор остается на нужной строке без лишних скачков полосы прокрутки.
Если требуется строго имитировать прокрутку "сверху вниз", можно применить подход, основанный на двух последовательных активизациях областей. Если активизировать область, находящуюся заведомо ниже требуемой, документ прокрутится глубоко вниз. Если после этого активизировать нужную строку, для платформы она окажется выше текущей позиции видимости, и таблица сместится так, что строка встанет строго у верхнего края.
Выясним важный нюанс: выполнить эти две команды последовательно в рамках одной процедуры нельзя. Платформа 1С оптимизирует перерисовку интерфейса и накапливает изменения, отображая только конечное состояние. Поэтому между шагами необходимо вернуть управление клиенту с помощью метода ПодключитьОбработчикОжидания.
Рассмотрим реализацию данного метода по шагам:
&НаКлиенте
Перем мЦелеваяСтрока;
&НаКлиенте
Процедура ПерейтиКСтрокеВверху(НомерСтроки)
мЦелеваяСтрока = НомерСтроки;
// Шаг 1: смещаемся на область ниже целевой
СмещениеВниз = 50;
СтрокаНиже = НомерСтроки + СмещениеВниз;
Элементы.ТабличныйДокументПоле.ТекущаяОбласть = Элементы.ТабличныйДокументПоле.Область(СтрокаНиже, 1);
// Шаг 2: подключаем обработчик для возврата на целевую строку
ПодключитьОбработчикОжидания("ЗавершитьПозиционирование", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершитьПозиционирование()
// Целевая строка теперь выше экрана, платформа покажет ее у верхнего края
Элементы.ТабличныйДокументПоле.ТекущаяОбласть = Элементы.ТабличныйДокументПоле.Область(мЦелеваяСтрока, 1);
КонецПроцедуры
Важный момент: параметр Однократно = Истина в методе ПодключитьОбработчикОжидания гарантирует, что процедура выполнится ровно один раз и таймер отключится автоматически, не нагружая клиентское приложение.
Если табличный документ используется исключительно для отображения информации и защищен от редактирования (установлен режим "Только просмотр"), можно отказаться от хранения единого длинного полотна. Вместо попыток скроллинга единой таблицы эффективнее очищать табличный документ и выводить данные заново, начиная непосредственно с выбранного узла дерева значений.
Такой подход обеспечивает мгновенное открытие нужного фрагмента, полностью исключает непредсказуемое поведение скролла и существенно ускоряет работу формы при больших объемах выводимых данных.
Если табличный документ используется для отображения инфографики, карт процессов и схем, стандартных возможностей табличного поля платформы 1С может быть недостаточно. В таких сценариях отличной альтернативой выступает элемент формы ПолеHTMLДокумента.
Преимущества HTML-документа для решения подобных задач:
element.scrollIntoView({block: 'start', behavior: 'smooth'}) позволяет плавно и точно спозиционировать любой блок строго по верхней границе.#block_id).Выбор конкретного решения зависит от структуры вашего решения: для готовых отчетов в формате табличного документа оптимально использовать активацию расширенного диапазона строк, а для сложных дашбордов и инфографики целесообразно рассмотреть применение HTML-верстки.