В процессе разработки интерфейсов на платформе 1С часто возникает задача зафиксировать содержимое табличного документа. Это необходимо для создания интерактивных дашбордов, статических отчетов или форм ввода, где пользователь не должен иметь возможности «ускроллить» в пустую область документа. Рассмотрим подробно, какими методами можно добиться этого результата в управляемых и обычных формах, а также разберем типичные ошибки, возникающие у разработчиков.
Проанализируем распространенную ошибку: Поле объекта не обнаружено (ВертикальнаяПолосаПрокрутки). Выясним причину ее возникновения. В системе 1С существует объект типа ТабличныйДокумент (содержимое, данные) и элемент управления Поле табличного документа (визуальный контейнер на форме).
Свойства, отвечающие за отображение полос прокрутки, относятся именно к элементу формы. Если вы создаете табличный документ программно, вы не найдете этих свойств у самого объекта. Чтобы управлять прокруткой, нам необходимо обратиться к элементу формы через коллекцию Элементы. Для быстрой отладки и изменения параметров элементов прямо в пользовательском режиме можно использовать редактор свойств открытых форм.
Рассмотрим пример правильного обращения в управляемом приложении:
// Правильное обращение к элементу формы
ЭлементПросмотра = Элементы.Результат; // Где "Результат" — имя поля на форме
ЭлементПросмотра.ВертикальнаяПолосаПрокрутки = ИспользованиеПолосыПрокрутки.НеИспользовать;
ЭлементПросмотра.ГоризонтальнаяПолосаПрокрутки = ИспользованиеПолосыПрокрутки.НеИспользовать;
Разберем по шагам, как полностью убрать визуальные элементы навигации. Для этого в управляемом интерфейсе используется перечисление ИспользованиеПолосыПрокрутки. Посмотрим на пример кода, который следует разместить в процедуре ПриСозданииНаСервере или вызвать после формирования отчета:
&НаСервере
Процедура ОтключитьСкроллНаСервере()
// Устанавливаем режим отображения полос
Элементы.ПолеТабДок.ВертикальнаяПолосаПрокрутки = ИспользованиеПолосыПрокрутки.НеИспользовать;
Элементы.ПолеТабДок.ГоризонтальнаяПолосаПрокрутки = ИспользованиеПолосыПрокрутки.НеИспользовать;
КонецПроцедуры
Важный нюанс: установка значения НеИспользовать скрывает сами полосы, но, как отмечают многие разработчики, документ все равно может прокручиваться колесиком мыши. Это происходит, если фокус находится внутри поля табличного документа.
Если нам нужно, чтобы таблица вообще не двигалась, проанализируем метод фиксации строк и колонок. Если зафиксировать все строки, которые содержат данные, прокрутка станет невозможной, так как системе будет «нечего» прокручивать. Посмотрим, как это реализовать программно:
// Фиксируем все строки и колонки по размеру данных
ТабДок.ФиксацияСверху = ТабДок.ВысотаТаблицы;
ТабДок.ФиксацияСлева = ТабДок.ШиринаТаблицы;
Рассмотрим ситуацию, когда этот метод может не сработать: если количество зафиксированных строк превышает размер видимой области экрана, платформа может принудительно включить прокрутку для доступа к скрытым частям. Поэтому данный метод эффективен только в сочетании с динамическим расчетом высоты элемента формы.
Чтобы пользователь не мог прокрутить документ в «пустоту», мы можем скрыть все неиспользуемые строки и колонки. Это создаст эффект ограниченного пространства. Выясним, как это сделать:
ТабДок.ВысотаТаблицы и ТабДок.ШиринаТаблицы.Видимость = Ложь для этих областей.Пример программного скрытия лишних колонок:
// Скрываем колонки с 11-й до максимальной
ОбластьЛишнего = ТабДок.Область(, 11, , 255);
ОбластьЛишнего.Видимость = Ложь;
Дополнительно рекомендуется использовать свойство Защита. Если установить ТабДок.ТолькоПросмотр = Истина и ТабДок.Защита = Истина, а в свойствах элемента формы снять флаг «Разрешить выделение пустых областей», навигация пользователя будет сильно ограничена только заполненными ячейками.
В случаях, когда прокрутка колесиком мыши критически мешает работе, можно применить «хитрый» прием с методом Показать(). Поскольку в 1С нет прямого события «ПриПрокрутке», мы можем использовать событие ПриАктивизацииОбласти. Разберем логику:
Как только пользователь пытается кликнуть на ячейку или активизировать область, мы принудительно возвращаем видимость к началу документа. Рассмотрим пример кода:
&НаКлиенте
Процедура ПолеТабДокПриАктивизацииОбласти(Элемент)
// Принудительно позиционируем видимую часть на первой ячейке
Элемент.Показать(Объект.ТабДок.Область("R1C1"));
КонецПроцедуры
Этот метод позволяет имитировать отсутствие прокрутки: даже если пользователь «уедет» вниз, первый же клик или попытка ввода вернут экран в исходное положение.
Самый эстетичный способ избежать прокрутки — сделать так, чтобы высота элемента формы точно соответствовала высоте самого ТабличногоДокумента. Проанализируем, как это реализовать:
Если контейнер (элемент формы) имеет высоту 500 пикселей, а сам документ занимает 450 пикселей, полосы прокрутки не активируются. Мы можем измерять высоту строк в пунктах и программно менять высоту элемента формы. Однако стоит учитывать, что прямое управление высотой элементов в пикселях в управляемых формах ограничено (используется свойство Высота в строках).
Если стандартные средства ТабличногоДокумента не позволяют добиться желаемого поведения (например, нужно на 100% заблокировать скролл, сохранив сложную кликабельность), рассмотрим альтернативный путь. Вывод данных через Поле HTML документа.
В HTML/CSS прокрутка отключается одной строкой: body { overflow: hidden; }. При этом все события нажатия на кнопки или ссылки внутри HTML будут передаваться в 1С через процедуру ПриНажатии. Это радикальный, но крайне эффективный метод для создания сложных, полностью статичных интерфейсов. Для удобной подготовки разметки в управляемом приложении подойдет редактор HTML для управляемого интерфейса.
Мы рассмотрели несколько подходов к решению задачи. Подведем итог, какой метод выбрать в зависимости от ситуации:
ВертикальнаяПолосаПрокрутки = НеИспользовать у элемента формы.ФиксацияСверху и метод Показать() в событиях формы.Поля HTML документа для полного контроля над визуализацией.Используя предложенные инструкции, вы сможете настроить поведение табличного документа максимально удобно для конечного пользователя, исключив случайные смещения контента и улучшив эргономику вашей конфигурации.