При разработке интерфейсов на платформе 1С 8.3 с использованием управляемых форм, нередко возникает задача по динамическому созданию колонок в табличных полях. Однако, когда колонок становится много и они выходят за пределы видимой области, возникает потребность в их фиксации, чтобы наиболее важные данные всегда оставались на виду при горизонтальной прокрутке. Рассмотрим, как программно реализовать фиксацию колонок для табличного поля, данные которого представлены таблицей значений, а колонки созданы в коде. Для решения базовой задачи отображения данных подойдёт пример программного вывода произвольной таблицы значений на управляемую форму.
Для фиксации колонок в табличном поле управляемой формы 1С 8.3 существуют два основных подхода, которые мы детально разберем:
ФиксацияВТаблице.ФиксацияСлева или ФиксацияСправа самого элемента формы "ТабличноеПоле".Давайте проанализируем эти подходы по шагам, основываясь на вашем примере кода и полезных советах из обсуждения.
ФиксацияВТаблицеЭтот метод позволяет вам явно указать для каждой колонки табличного поля, должна ли она быть зафиксирована и с какой стороны. Он особенно полезен, когда вам нужно зафиксировать не последовательный блок колонок, а определенные, разрозненные колонки, или когда вы хотите дать пользователю возможность гибкой настройки.
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("КодТовара", Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(20)),"ОбщаяТаблица" , "Код товара"));
МассивДобавляемыхРеквизиваемыхРеквизитов.Добавить(Новый РеквизитФормы("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"ОбщаяТаблица" , "Наименование"));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"),"ОбщаяТаблица" , "Характеристика"));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЕдиницаИзмерения", Новый ОписаниеТипов("СправочникСсылка.БазовыеЕдиницыИзмерения"),"ОбщаяТаблица" , "Ед.изм."));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ОбщийОстаток", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,0)),"ОбщаяТаблица" , "Общий остаток"));
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
Здесь мы создаем реквизиты для нашей таблицы с именем ОбщаяТаблица. Функция ИзменитьРеквизиты добавляет их к форме, делая доступными для дальнейшего использования.
ПолеФормы, который добавляется в родительский элемент - табличное поле.
// Добавляем колонку "Код товара"
НоваяКолонка = Элементы.Добавить("КодТовара", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Код товара";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.КодТовара";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.Ширина = 14;
// Добавляем колонку "Товар"
НоваяКолонка = Элементы.Добавить("Товар", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Товар";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Товар";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
Обратите внимание на свойство ПутьКДанным, которое связывает колонку с соответствующим реквизитом формы.
ФиксацияВТаблице для каждой фиксируемой колонки. Это ключевой шаг для индивидуальной фиксации. Важно понимать, что для этого свойства нельзя использовать булево значение Истина или Ложь. Оно принимает значения из перечисления ФиксацияВТаблице.
Доступные значения:
ФиксацияВТаблице.Лево: Колонка будет зафиксирована слева.ФиксацияВТаблице.Право: Колонка будет зафиксирована справа.ФиксацияВТаблице.Нет: Колонка не будет зафиксирована (значение по умолчанию).ФиксацияВТаблице.Авто: Система автоматически определяет, нужно ли фиксировать колонку.Чтобы зафиксировать первые четыре колонки слева, мы модифицируем ваш код следующим образом:
// Добавляем колонку "Код товара"
НоваяКолонка = Элементы.Добавить("КодТовара", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Код товара";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.КодТовара";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.Ширина = 14;
<strong>НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; // Фиксируем эту колонку слева</strong>
// Добавляем колонку "Товар"
НоваяКолонка = Элементы.Добавить("Товар", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Товар";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Товар";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
<strong>НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; // Фиксируем эту колонку слева</strong>
// Добавляем колонку "Характеристика"
НоваяКолонка = Элементы.Добавить("Характеристика", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Характеристика";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Характеристика";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
<strong>НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; // Фиксируем эту колонку слева</strong>
// Добавляем колонку "ЕдиницаИзмерения"
НоваяКолонка = Элементы.Добавить("ЕдиницаИзмерения", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Ед.изм.";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.ЕдиницаИзмерения";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
<strong>НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; // Фиксируем эту колонку слева</strong>
// Добавляем остальные колонки, которые не нужно фиксировать
НоваяКолонка = Элементы.Добавить("ОбщийОстаток", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Общий остаток";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.ОбщийОстаток";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
// Для этой колонки ФиксацияВТаблице не устанавливается или устанавливается в ФиксацияВТаблице.Нет
Как вы видите, для каждой из первых четырех колонок мы явно указали НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево;. Это гарантирует, что при горизонтальной прокрутке эти колонки всегда будут оставаться на экране.
ФиксацияСлева и ФиксацияСправа табличного поляЭтот метод является более простым, если вам нужно зафиксировать непрерывный блок колонок либо с самого начала, либо с самого конца таблицы. Он устанавливается не для каждой отдельной колонки, а для самого элемента управления табличным полем.
ФиксацияВТаблице для каждой из них.
// ... Код создания реквизитов формы и их изменения ...
// Добавляем все колонки без индивидуальной фиксации
НоваяКолонка = Элементы.Добавить("КодТовара", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Код товара";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.КодТовара";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.Ширина = 14;
НоваяКолонка = Элементы.Добавить("Товар", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Товар";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Товар";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка = Элементы.Добавить("Характеристика", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Характеристика";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.Характеристика";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка = Элементы.Добавить("ЕдиницаИзмерения", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Ед.изм.";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.ЕдиницаИзмерения";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка = Элементы.Добавить("ОбщийОстаток", Тип("ПолеФормы"), Элементы.ОбщаяТаблица);
НоваяКолонка.Заголовок = "Общий остаток";
НоваяКолонка.ПутьКДанным = "ОбщаяТаблица.ОбщийОстаток";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
ФиксацияСлева или ФиксацияСправа для табличного поля. После того как все колонки созданы, мы обращаемся к самому элементу табличного поля (в вашем случае Элементы.ОбщаяТаблица) и устанавливаем соответствующее свойство, указывая количество колонок для фиксации.Если мы хотим зафиксировать первые четыре колонки слева, мы сделаем это так:
// Устанавливаем фиксацию первых 4 колонок слева
<strong>Элементы.ОбщаяТаблица.ФиксацияСлева = 4;</strong>
Если бы нам понадобилось зафиксировать, например, последние две колонки справа, мы использовали бы свойство ФиксацияСправа:
// Устанавливаем фиксацию последних 2 колонок справа
<strong>Элементы.ОбщаяТаблица.ФиксацияСправа = 2;</strong>
Этот подход более лаконичен, если требуется зафиксировать именно непрерывный блок колонок.
Код, отвечающий за создание колонок и их фиксацию, целесообразно размещать в событиях формы, которые выполняются при ее инициализации, но после того, как форма уже сформирована и готова к работе с элементами. Наиболее подходящие события:
ПриСозданииНаСервере: Если ваша логика создания и фиксации колонок не зависит от интерактивных действий пользователя и должна быть выполнена один раз при открытии формы.ПриОткрытии: В некоторых случаях, если требуется более позднее выполнение или взаимодействие с уже созданными элементами формы.В вашем случае, поскольку колонки создаются программно на основе реквизитов формы, событие ПриСозданииНаСервере будет наиболее логичным местом для размещения всего описанного выше кода. Для стандартизации и ускорения подобных операций можно использовать модуль функций для программного изменения форм.
Важно отметить, что приведенные решения относятся к Управляемым формам (платформа 1С 8.3). Для Обычных форм, если бы вы работали с ними, механизм фиксации колонок выглядел бы иначе. В обычных формах фиксация колонок табличного поля (обычно элемент управления "Таблица") настраивается непосредственно в свойствах колонки в конфигураторе или программно через свойство Фиксированная для объекта КолонкаТаблицы. Однако, поскольку ваш вопрос касался программно создаваемых колонок и вы работаете с 8.3, основной фокус был на управляемых формах.
После фиксации колонок может возникнуть вопрос, как управлять их шириной, особенно если содержимое не помещается или, как в сообщении 18, при работе с иерархическими данными (деревом) уровни раскрываются, а текст не влезает. Для управления шириной колонок и возможностью их растягивания мы рассмотрим следующие свойства:
ИзменениеРазмера для колонки. Это свойство доступно для каждого элемента формы типа ПолеФормы, являющегося колонкой табличного поля. Оно определяет, разрешено ли пользователю интерактивно изменять ширину колонки. Это свойство может принимать значения типа ИзменениеРазмераКолонки:
ИзменениеРазмераКолонки.НеИзменять: Пользователь не может изменять ширину.ИзменениеРазмераКолонки.Изменять: Пользователь может изменять ширину.ИзменениеРазмераКолонки.ИзменятьИАвто: Пользователь может изменять ширину, и система также может автоматически подстраивать ее.Рекомендуется устанавливать ИзменениеРазмера = ИзменениеРазмераКолонки.Изменять или ИзменениеРазмера = ИзменениеРазмераКолонки.ИзменятьИАвто для колонок, содержащих текстовые поля или ссылочные значения, так как их представление может сильно варьироваться. Для колонок с фиксированной длиной данных (например, даты, числа) часто разрешать изменение размера не требуется, если только они не участвуют в отображении иерархических данных, где ширина может зависеть от уровня вложенности.
// ... (после создания НоваяКолонка) ...
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.Ширина = 14;
НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
<strong>НоваяКолонка.ИзменениеРазмера = ИзменениеРазмераКолонки.Изменять; // Разрешаем пользователю изменять размер</strong>
ИзменятьНастройкуКолонок для табличного поля. Это свойство относится ко всему табличному полю и определяет, разрешено ли пользователю изменять настройки колонок (размер, порядок, видимость) через стандартное меню "Настройка списка". Если установить его в Ложь, пользователь не сможет гибко настраивать колонки. По умолчанию это свойство обычно установлено в Истина, что дает пользователю больше свободы.
// Если нужно запретить пользователю менять настройки колонок
<strong>Элементы.ОбщаяТаблица.ИзменятьНастройкуКолонок = Ложь;</strong>
Если вы хотите, чтобы фиксированные колонки автоматически растягивались по содержимому, обычно достаточно разрешить изменение размера для соответствующей колонки и не устанавливать жестко фиксированную ширину (свойство Ширина). Платформа 1С в большинстве случаев пытается оптимально распределить доступное пространство, особенно если другие колонки не имеют фиксированной ширины. Однако для сложных случаев с деревьями или большим объемом текста может потребоваться дополнительная логика или принятие компромиссов в ширине колонок.
Для успешной фиксации колонок, созданных программно в табличном поле управляемой формы 1С 8.3, мы рекомендуем:
Элементы.ИмяТабличнойЧасти.ФиксацияСлева = N; или ФиксацияСправа = N;. Это более простой и чистый подход.НоваяКолонка.ФиксацияВТаблице = ФиксацияВТаблице.Лево; для каждой такой колонки.ФиксацияВТаблице (например, ФиксацияВТаблице.Лево), а не булевы значения.ПриСозданииНаСервере или ПриОткрытии.ИзменениеРазмера.Следуя этим рекомендациям, вы сможете эффективно управлять отображением данных в ваших табличных полях, улучшая удобство использования форм для конечных пользователей.