При разработке интерфейсов на платформе 1С:Предприятие 8.3 с использованием управляемых форм мы часто сталкиваемся с требованиями пользователей, которые привыкли к функционалу Excel. Одна из частых просьб — зафиксировать несколько строк сверху таблицы (например, итоговые показатели или важные ключевые данные), чтобы при вертикальной прокрутке (скроллинге) основного списка эти строки всегда оставались перед глазами.
В этой статье мы подробно разберем, существует ли штатная возможность реализации такого поведения для элемента формы Таблица, и проанализируем эффективные обходные пути решения этой задачи.
Давайте сначала выясним, предоставляет ли платформа прямой инструмент для решения этой задачи. В обычных формах (толстый клиент) и в табличных документах механизм фиксации областей развит хорошо. Однако, когда мы работаем с управляемыми формами, основным элементом отображения списков и таблиц значений является ТаблицаФормы.
Если мы обратимся к свойствам элемента ТаблицаФормы в конфигураторе или попробуем найти соответствующие методы программно, мы обнаружим, что свойства, отвечающего за фиксацию строк (аналогичного ФиксацияСверху), для этого элемента не существует. Штатными средствами настройки самой Таблицы Значений на форме закрепить строки нельзя.
Тем не менее, задача остается актуальной. Рассмотрим варианты решений, которые применяются на практике сообществом разработчиков.
Самым надежным и "красивым" способом, который упоминается опытными разработчиками, является замена стандартной таблицы на элемент Поле табличного документа. Этот объект изначально поддерживает фиксацию строк и колонок.
Давайте разберем по шагам, как это реализовать:
ТаблицаЗначений мы добавляем на форму реквизит типа ТабличныйДокумент.Код для фиксации строк в табличном документе выглядит предельно просто:
// Фиксируем 3 верхние строки
ТабличныйДокумент.ФиксацияСверху = 3;
Однако, выбирая этот путь, мы должны учитывать ряд нюансов:
ТолькоПросмотр в значение Истина (чтобы пользователь мог скроллить, но не редактировал ячейки как в Excel).Выбор, чтобы понимать, по какой "строке" кликнул пользователь, и выполнять действия (открытие документа, расшифровка и т.д.).Если использование табличного документа кажется слишком громоздким из-за необходимости переписывать логику работы с данными, рассмотрим другой визуальный трюк. Идея заключается в создании двух таблиц значений на форме, расположенных друг над другом.
Алгоритм реализации:
ТаблицаВерх и ТаблицаНиз.ТаблицаВерх будет содержать фиксированные строки. Мы размещаем ее в верхней части формы.ТаблицаНиз будет содержать остальные данные и иметь полосу прокрутки.ОтображениеШапки), чтобы визуально они сливались в единое целое.Этот метод позволяет сохранить привычный интерфейс работы с таблицами (сортировки, условное оформление работают штатно). В верхнюю таблицу мы программно копируем строки, которые должны быть зафиксированы. Из нижней эти строки можно исключать или оставлять (дублировать).
Сложности метода:
Главная проблема здесь — синхронизация ширины колонок. Если пользователь изменит ширину колонки в нижней таблице, верхняя таблица "поедет", и данные перестанут визуально соответствовать друг другу.
Чтобы решить это, обычно применяют следующие подходы:
ИзменятьСоставСтрок и настройки формы).АвтоШирина для колонок.ПриИзмененииСоставаОтображаемыхКолонок для отслеживания видимости.Еще одно нестандартное решение, которое подходит для специфических задач (например, когда нужно зафиксировать всего одну строку итогов сверху), заключается в манипуляции заголовками колонок.
Суть метода:
Заголовок колонки значение, которое должно быть зафиксировано (например, сумму по этой колонке).
// Пример установки заголовка
Элементы.ТоварыСумма.Заголовок = "Сумма (" + ИтоговаяСумма + ")";
Высоту шапки таблицы можно увеличить в свойствах, чтобы текст помещался корректно. Это решение не слишком красиво визуально и ломает логику интерфейса (заголовок должен называть данные, а не показывать их), но оно технически "фиксирует" информацию сверху таблицы.
Для тех, кто готов к серьезной разработке ради идеального интерфейса, существует вариант использования поля HTML-документа. В этом случае мы полностью отказываемся от стандартной таблицы 1С для отображения данных.
Мы формируем HTML-код, который верстаем как таблицу. Современные стандарты CSS (каскадные таблицы стилей) позволяют легко зафиксировать любые строки.
Используем CSS-свойство position: sticky:
<style>
thead th { position: sticky; top: 0; }
.fixed-row { position: sticky; top: 30px; background-color: #fff; z-index: 10; }
</style>
Преимущества этого метода — безграничные возможности оформления. Вы можете зафиксировать 2, 3 или 10 строк, раскрасить их как угодно и добавить любую анимацию. Недостаток — высокая трудоемкость. Вам придется самостоятельно реализовывать передачу данных из 1С в HTML и обработку кликов (событий) из HTML обратно в 1С.
Подводя итог нашему анализу, можно сказать следующее:
ТаблицыФормы в 1С 8.3 нет.ТабДок) на форме. Это наиболее "платформенный" путь.