Как зафиксировать строки и колонки в табличном документе 1С одновременно

Программист IT и автоматизация бизнеса
← На главную

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

Анализируем проблему: почему не работает двойная фиксация

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


ЭлементыФормы.ПолеТабличногоДокумента.ФиксацияСверху = 259;
ЭлементыФормы.ПолеТабличногоДокумента.ФиксацияСлева = 2;

Проанализируем поведение системы: в некоторых версиях платформы (особенно в ранних релизах ветки 8.3, таких как 8.3.5) наблюдается странный эффект — срабатывает только последняя вызванная команда. Если сначала зафиксировать верх, а потом лево, то верхняя фиксация сбрасывается, и наоборот. Выясним причину: это поведение связано с особенностями рендеринга ПоляТабличногоДокумента в обычном приложении и является известным ограничением старых версий платформы. Как показывают тесты, в более современных релизах (например, 8.3.12 и выше) данная проблема была устранена, и фиксация в обеих плоскостях работает корректно.

Решение 1: Правильный программный порядок установки свойств

Если обновление платформы не входит в ваши планы, попробуем изменить подход к программной установке свойств. Иногда платформа корректнее обрабатывает изменения, если они вносятся не напрямую в элемент формы, а в сам объект табличного документа, который выводится в это поле. Разберем по шагам, как это реализовать:

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

Пример кода для надежной установки:


// Предположим, МакетЦветов — это наш ТабличныйДокумент
МакетЦветов.ФиксацияСверху = 259;
МакетЦветов.ФиксацияСлева = 2;
ЭлементыФормы.ПолеТабличногоДокумента.Вывести(МакетЦветов);

Решение 2: Полный запрет прокрутки (скролла)

Если основной задачей является предотвращение любого смещения «палитры», то фиксация — это лишь полумера. Рассмотрим более радикальные и эффективные способы полностью запретить пользователю скроллить макет. Проанализируем возможности свойств ПоляТабличногоДокумента.

Отключение полос прокрутки

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

Это скроет полосы, однако стоит помнить, что в некоторых случаях прокрутка колесиком мыши может сохраниться. Чтобы исключить и её, перейдем к следующему методу.

Использование свойства ОбластьПросмотра

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


НужнаяОбласть = ТабДок.Область(1, 1, 260, 5); // Координаты вашей палитры
ЭлементыФормы.ПолеТабличногоДокумента.ОбластьПросмотра = НужнаяОбласть;

Решение 3: Защита таблицы и ограничение выделения

Чтобы исключить «прыжки» экрана при нажатии клавиш (например, стрелок на клавиатуре или PageDown), разберем метод защиты ячеек. Если таблица используется только для выбора цвета кликом, нам не нужно, чтобы пользователь мог выделять произвольные области.

  1. Установим свойство Защита в значение Истина для всего документа.
  2. Для ячеек, по которым будет производиться клик, также установим флаг ТолькоПросмотр = Ложь (если это необходимо для обработки событий), но заблокируем выделение через свойство РежимВыделения.

Посмотрим, как настроить элемент формы для работы в режиме «палитры»:


ЭлементыФормы.ПолеТабличногоДокумента.ТолькоПросмотр = Истина;
ЭлементыФормы.ПолеТабличногоДокумента.ОтображатьСетку = Ложь;
ЭлементыФормы.ПолеТабличногоДокумента.ОтображатьЗаголовки = Ложь;

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

ВыбранныйЦвет = ЭлементыФормы.ПолеТабличногоДокумента.ТекущаяОбласть.ЦветФона;

Подведение итогов

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

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

← На главную