Как зафиксировать программно созданные колонки таблицы значений на управляемой форме 1С 8.3?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Для фиксации колонок в табличном поле управляемой формы 1С 8.3 существуют два основных подхода, которые мы детально разберем:

  1. Индивидуальная фиксация каждой колонки с помощью ее свойства ФиксацияВТаблице.
  2. Фиксация группы колонок слева или справа от всего табличного поля с использованием свойств ФиксацияСлева или ФиксацияСправа самого элемента формы "ТабличноеПоле".

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

Подход 1: Фиксация отдельных колонок с помощью свойства ФиксацияВТаблице

Этот метод позволяет вам явно указать для каждой колонки табличного поля, должна ли она быть зафиксирована и с какой стороны. Он особенно полезен, когда вам нужно зафиксировать не последовательный блок колонок, а определенные, разрозненные колонки, или когда вы хотите дать пользователю возможность гибкой настройки.

Пошаговая реализация индивидуальной фиксации колонок

  1. Определяем реквизиты формы для таблицы значений. Прежде всего, как вы уже делаете в своем коде, мы программно создаем реквизиты формы, которые будут служить источником данных для колонок таблицы. Этот шаг важен для того, чтобы платформа 'знала' о структуре вашей таблицы значений.
  2. 
    МассивДобавляемыхРеквизитов = Новый Массив;
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("КодТовара", Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(20)),"ОбщаяТаблица" , "Код товара"));
    МассивДобавляемыхРеквизиваемыхРеквизитов.Добавить(Новый РеквизитФормы("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"ОбщаяТаблица" , "Наименование"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"),"ОбщаяТаблица" , "Характеристика"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЕдиницаИзмерения", Новый ОписаниеТипов("СправочникСсылка.БазовыеЕдиницыИзмерения"),"ОбщаяТаблица" , "Ед.изм."));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ОбщийОстаток", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,0)),"ОбщаяТаблица" , "Общий остаток"));
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    

    Здесь мы создаем реквизиты для нашей таблицы с именем ОбщаяТаблица. Функция ИзменитьРеквизиты добавляет их к форме, делая доступными для дальнейшего использования.

  3. Добавляем элементы формы - колонки табличного поля. После того как реквизиты формы определены, мы приступаем к созданию самих визуальных элементов - колонок, которые будут отображать данные этих реквизитов. Каждая колонка в управляемой форме является элементом типа ПолеФормы, который добавляется в родительский элемент - табличное поле.
  4. 
    // Добавляем колонку "Код товара"
    НоваяКолонка = Элементы.Добавить("КодТовара", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Код товара";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.КодТовара";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.Ширина = 14;
    
    // Добавляем колонку "Товар"
    НоваяКолонка = Элементы.Добавить("Товар", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Товар";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Товар";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    

    Обратите внимание на свойство ПутьКДанным, которое связывает колонку с соответствующим реквизитом формы.

  5. Устанавливаем свойство ФиксацияВТаблице для каждой фиксируемой колонки. Это ключевой шаг для индивидуальной фиксации. Важно понимать, что для этого свойства нельзя использовать булево значение Истина или Ложь. Оно принимает значения из перечисления ФиксацияВТаблице.

    Доступные значения:

    • ФиксацияВТаблице.Лево: Колонка будет зафиксирована слева.
    • ФиксацияВТаблице.Право: Колонка будет зафиксирована справа.
    • ФиксацияВТаблице.Нет: Колонка не будет зафиксирована (значение по умолчанию).
    • ФиксацияВТаблице.Авто: Система автоматически определяет, нужно ли фиксировать колонку.

    Чтобы зафиксировать первые четыре колонки слева, мы модифицируем ваш код следующим образом:

    
    // Добавляем колонку "Код товара"
    НоваяКолонка = Элементы.Добавить("КодТовара", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Код товара";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.КодТовара";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.Ширина = 14;
    <strong>НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; // Фиксируем эту колонку слева</strong>
    
    // Добавляем колонку "Товар"
    НоваяКолонка = Элементы.Добавить("Товар", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Товар";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Товар";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    <strong>НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; // Фиксируем эту колонку слева</strong>
    
    // Добавляем колонку "Характеристика"
    НоваяКолонка = Элементы.Добавить("Характеристика", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Характеристика";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Характеристика";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    <strong>НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; // Фиксируем эту колонку слева</strong>
    
    // Добавляем колонку "ЕдиницаИзмерения"
    НоваяКолонка = Элементы.Добавить("ЕдиницаИзмерения", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Ед.изм.";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.ЕдиницаИзмерения";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    <strong>НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; // Фиксируем эту колонку слева</strong>
    
    // Добавляем остальные колонки, которые не нужно фиксировать
    НоваяКолонка = Элементы.Добавить("ОбщийОстаток", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Общий остаток";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.ОбщийОстаток";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    // Для этой колонки ФиксацияВТаблице не устанавливается или устанавливается в ФиксацияВТаблице.Нет
    

    Как вы видите, для каждой из первых четырех колонок мы явно указали НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево;. Это гарантирует, что при горизонтальной прокрутке эти колонки всегда будут оставаться на экране.

Подход 2: Фиксация группы колонок с помощью свойств ФиксацияСлева и ФиксацияСправа табличного поля

Этот метод является более простым, если вам нужно зафиксировать непрерывный блок колонок либо с самого начала, либо с самого конца таблицы. Он устанавливается не для каждой отдельной колонки, а для самого элемента управления табличным полем.

Пошаговая реализация фиксации группы колонок

  1. Создаем все колонки табличного поля. Сначала мы создаем все необходимые колонки программно, как было описано выше, без установки индивидуального свойства ФиксацияВТаблице для каждой из них.
  2. 
    // ... Код создания реквизитов формы и их изменения ...
    
    // Добавляем все колонки без индивидуальной фиксации
    НоваяКолонка = Элементы.Добавить("КодТовара", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Код товара";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.КодТовара";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.Ширина = 14;
    
    НоваяКолонка = Элементы.Добавить("Товар", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Товар";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Товар";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    
    НоваяКолонка = Элементы.Добавить("Характеристика", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Характеристика";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Характеристика";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    
    НоваяКолонка = Элементы.Добавить("ЕдиницаИзмерения", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Ед.изм.";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.ЕдиницаИзмерения";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    
    НоваяКолонка = Элементы.Добавить("ОбщийОстаток", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
    НоваяКолонка.Заголовок = "Общий остаток";
    НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.ОбщийОстаток";
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    
  3. Устанавливаем свойство ФиксацияСлева или ФиксацияСправа для табличного поля. После того как все колонки созданы, мы обращаемся к самому элементу табличного поля (в вашем случае Элементы.ОбщаяТаблица) и устанавливаем соответствующее свойство, указывая количество колонок для фиксации.
  4. Если мы хотим зафиксировать первые четыре колонки слева, мы сделаем это так:

    
    // Устанавливаем фиксацию первых 4 колонок слева
    <strong>Элементы.ОбщаяТаблица.ФиксацияСлева = 4;</strong>
    

    Если бы нам понадобилось зафиксировать, например, последние две колонки справа, мы использовали бы свойство ФиксацияСправа:

    
    // Устанавливаем фиксацию последних 2 колонок справа
    <strong>Элементы.ОбщаяТаблица.ФиксацияСправа = 2;</strong>
    

    Этот подход более лаконичен, если требуется зафиксировать именно непрерывный блок колонок.

Когда и где следует размещать код фиксации?

Код, отвечающий за создание колонок и их фиксацию, целесообразно размещать в событиях формы, которые выполняются при ее инициализации, но после того, как форма уже сформирована и готова к работе с элементами. Наиболее подходящие события:

В вашем случае, поскольку колонки создаются программно на основе реквизитов формы, событие ПриСозданииНаСервере будет наиболее логичным местом для размещения всего описанного выше кода. Для стандартизации и ускорения подобных операций можно использовать модуль функций для программного изменения форм.

Особенности фиксации для Обычных форм

Важно отметить, что приведенные решения относятся к Управляемым формам (платформа 1С 8.3). Для Обычных форм, если бы вы работали с ними, механизм фиксации колонок выглядел бы иначе. В обычных формах фиксация колонок табличного поля (обычно элемент управления "Таблица") настраивается непосредственно в свойствах колонки в конфигураторе или программно через свойство Фиксированная для объекта КолонкаТаблицы. Однако, поскольку ваш вопрос касался программно создаваемых колонок и вы работаете с 8.3, основной фокус был на управляемых формах.

Управление шириной фиксированных колонок

После фиксации колонок может возникнуть вопрос, как управлять их шириной, особенно если содержимое не помещается или, как в сообщении 18, при работе с иерархическими данными (деревом) уровни раскрываются, а текст не влезает. Для управления шириной колонок и возможностью их растягивания мы рассмотрим следующие свойства:

  1. Свойство ИзменениеРазмера для колонки. Это свойство доступно для каждого элемента формы типа ПолеФормы, являющегося колонкой табличного поля. Оно определяет, разрешено ли пользователю интерактивно изменять ширину колонки. Это свойство может принимать значения типа ИзменениеРазмераКолонки:
    • ИзменениеРазмераКолонки.НеИзменять: Пользователь не может изменять ширину.
    • ИзменениеРазмераКолонки.Изменять: Пользователь может изменять ширину.
    • ИзменениеРазмераКолонки.ИзменятьИАвто: Пользователь может изменять ширину, и система также может автоматически подстраивать ее.

    Рекомендуется устанавливать ИзменениеРазмера = ИзменениеРазмераКолонки.Изменять или ИзменениеРазмера = ИзменениеРазмераКолонки.ИзменятьИАвто для колонок, содержащих текстовые поля или ссылочные значения, так как их представление может сильно варьироваться. Для колонок с фиксированной длиной данных (например, даты, числа) часто разрешать изменение размера не требуется, если только они не участвуют в отображении иерархических данных, где ширина может зависеть от уровня вложенности.

    
    // ... (после создания НоваяКолонка) ...
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.Ширина = 14;
    НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
    <strong>НоваяКолонка.ИзменениеРазмера = ИзменениеРазмераКолонки.Изменять; // Разрешаем пользователю изменять размер</strong>
    
  2. Свойство ИзменятьНастройкуКолонок для табличного поля. Это свойство относится ко всему табличному полю и определяет, разрешено ли пользователю изменять настройки колонок (размер, порядок, видимость) через стандартное меню "Настройка списка". Если установить его в Ложь, пользователь не сможет гибко настраивать колонки. По умолчанию это свойство обычно установлено в Истина, что дает пользователю больше свободы.
  3. 
    // Если нужно запретить пользователю менять настройки колонок
    <strong>Элементы.ОбщаяТаблица.ИзменятьНастройкуКолонок = Ложь;</strong>
    

    Если вы хотите, чтобы фиксированные колонки автоматически растягивались по содержимому, обычно достаточно разрешить изменение размера для соответствующей колонки и не устанавливать жестко фиксированную ширину (свойство Ширина). Платформа 1С в большинстве случаев пытается оптимально распределить доступное пространство, особенно если другие колонки не имеют фиксированной ширины. Однако для сложных случаев с деревьями или большим объемом текста может потребоваться дополнительная логика или принятие компромиссов в ширине колонок.

Итоговые рекомендации

Для успешной фиксации колонок, созданных программно в табличном поле управляемой формы 1С 8.3, мы рекомендуем:

  1. Определиться с методом фиксации:
    • Если нужна фиксация нескольких первых или последних колонок подряд, используйте Элементы.ИмяТабличнойЧасти.ФиксацияСлева = N; или ФиксацияСправа = N;. Это более простой и чистый подход.
    • Если требуется зафиксировать конкретные, возможно, не подряд идущие колонки, или дать более тонкий контроль, используйте свойство НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; для каждой такой колонки.
  2. Использовать правильный синтаксис: Всегда используйте значения из перечисления ФиксацияВТаблице (например, ФиксацияВТаблице.Лево), а не булевы значения.
  3. Размещать код в подходящем событии: Наиболее часто это ПриСозданииНаСервере или ПриОткрытии.
  4. Учитывать ширину колонок: Для фиксированных колонок, особенно содержащих переменные данные, рассмотрите возможность разрешить пользователю изменять их размер с помощью свойства ИзменениеРазмера.

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

← На главную