При активной работе с динамическими формами в 1С разработчики часто сталкиваются с ситуацией, когда после программного удаления реквизита или изменения состава колонок таблицы интерфейс полностью перерисовывается. В результате горизонтальная полоса прокрутки автоматически сбрасывается в самое начало, а активная колонка сдвигается на самый первый элемент. Это создает неудобства для пользователей, если таблица содержит большое количество колонок (например, 50 и более) и требует постоянного скроллинга.
Разберем причины такого поведения платформы 1С:Предприятие и рассмотрим практические способы решения этой проблемы.
Проанализируем алгоритм работы формы при программном удалении колонки. Когда выполняется метод ИзменитьРеквизиты(), на сервере происходит перестройка контекста формы. После завершения процедуры и возврата на клиент платформа 1С заново отрисовывает элементы управляемой формы.
Рассмотрим стандартный фрагмент кода программного удаления колонки из таблицы значений и реквизитов формы:
мТЗ = РеквизитФормыВЗначение("Характеристики", Тип("ТаблицаЗначений"));
// Удаляем колонку из таблицы значений
мТЗ.Колонки.Удалить(мТЗ.Колонки.Найти(УдаляемаяКолонка));
// Удаляем реквизит формы
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить("Характеристики." + УдаляемаяКолонка);
ИзменитьРеквизиты(, МассивРеквизитов);
// Возвращаем данные в реквизит формы
ЗначениеВРеквизитФормы(мТЗ, "Характеристики");
Так как вызов ИзменитьРеквизиты() пересоздает структуру элементов, фокус ввода и положение прокрутки утеряются. Платформа 1С не имеет прямого свойства для управления координатами полосы прокрутки, однако мы можем управлять ею опосредованно через позиционирование на нужном элементе.
Выясним, как принудительно заставить платформу сдвинуть горизонтальный скролл к нужной колонке после полного перерисовывания формы. Для этого у элемента формы (колонки) предусмотрено свойство АктивизироватьПоУмолчанию.
Если перед окончанием формирования или перерисовки формы указать соседней колонке это свойство, платформа при отображении автоматически прокрутит таблицу к ней:
// Определяем имя соседней колонки, которая должна стать активной
ИмяСоседнейКолонки = "Колонка20";
// Устанавливаем свойство для автоматической прокрутки
Элементы.Характеристики.ПодчиненныеЭлементы[ИмяСоседнейКолонки].АктивизироватьПоУмолчанию = Истина;
При таком подходе после перерисовки управляемой формы горизонтальная полоса прокрутки автоматически установится в позицию указанной колонки.
Другим распространенным решением является прямое управление свойством ТекущийЭлемент формы. Когда мы задаем активный элемент программно, платформа 1С автоматически сдвигает полосу прокрутки в область видимости этого элемента.
Посмотрим на пример кода, который активизирует нужную колонку:
// Устанавливаем фокус на требуемую колонку таблицы
ЭтаФорма.ТекущийЭлемент = Элементы.Характеристики.ПодчиненныеЭлементы.Колонка20;
Обратите внимание: если перерисовка происходит через тяжеловесный серверный вызов с изменением реквизитов, изменение свойства ТекущийЭлемент лучше выполнять на клиенте сразу после завершения серверной процедуры. Если фокус сбрасывается из-за асинхронности отрисовки, можно подключить обработчик ожидания с минимальным интервалом (0.1 сек), в котором установить ТекущийЭлемент.
Рассмотрим еще один эффективный архитектурный подход. Если пользователю требуется лишь временно убрать ненужные колонки из вида, вместо физического удаления реквизитов через ИзменитьРеквизиты() целесообразно управляемо изменять видимость элементов.
Управление свойством Видимость не вызывает тяжелой перестройки контекста формы на сервере:
// Скрытие колонки без удаления реквизита
Элементы.Характеристики.ПодчиненныеЭлементы[ИмяКолонки].Видимость = Ложь;
При смене видимости позиция остальных элементов и фокус сохраняются значительно стабильнее, а платформа не сбрасывает состояние прокрутки к первому элементу таблицы.
Мы проанализировали особенности работы с динамическими колонками в управляемых формах 1С. Для предотвращения сброса горизонтальной полосы прокрутки рекомендуются следующие шаги:
АктивизироватьПоУмолчанию = Истина или устанавливать ЭтаФорма.ТекущийЭлемент на соседний элемент.Видимость элементов формы.