При переходе с обычных форм на управляемые разработчики часто сталкиваются с ограничениями в визуальном оформлении табличных частей. Одной из наиболее трудоемких задач является создание сложной иерархической «шапки» таблицы, где разные уровни заголовков имеют разную высоту, а колонки должны группироваться по определенной логике. В этой статье мы подробно разберем, как реализовать такую структуру, рассмотрим нюансы настройки групп колонок и выясним, в каких случаях лучше отказаться от стандартной таблицы в пользу табличного документа.
Управляемое приложение 1С предлагает встроенный механизм группировки колонок, который позволяет создавать многоуровневые заголовки. В отличие от обычных форм, где отрисовка шапки была жестко привязана к сетке, здесь мы работаем с иерархией элементов формы. Рассмотрим, как правильно настроить такие группы.
Шаг 1. Создание структуры групп
Для создания многоуровневой шапки нам необходимо добавить в дерево элементов формы специальные объекты — Группа колонок. Расположим их следующим образом: создадим основную группу (первый уровень), внутрь которой поместим вложенные группы (второй уровень) и, наконец, сами колонки (третий уровень). Проанализируем ключевые свойства группы:
Горизонтальная, колонки выстроятся в ряд. Если Вертикальная — колонки (или вложенные группы) встанут друг под другом.Нет или Сквозная. Это позволит скрыть границы самой группы, оставив только иерархический заголовок.Шаг 2. Решение проблемы с разной высотой строк
Основная сложность заключается в том, что в стандартной таблице формы свойство ВысотаШапки является глобальным для всего объекта. Мы не можем напрямую сказать платформе: «сделай вторую строку заголовка высотой в два раза больше первой». Однако мы можем «обмануть» механизм отрисовки, используя программное добавление символов переноса строки.
Выясним причину, по которой это работает: платформа 1С автоматически подстраивает высоту ячейки под содержимое, если включен авторасчет высоты. Если в заголовок конкретной колонки программно добавить Символы.ПС, это принудительно увеличит высоту именно этого сегмента шапки. Рассмотрим пример программного кода для реализации такой логики:
// Программное создание колонки с увеличенной высотой заголовка
НоваяКолонка = Элементы.Добавить("КолонкаДанных", Тип("ПолеФормы"), ГруппаВторогоУровня);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Объект.ТабличнаяЧасть.Данные";
// Добавляем переносы строк для увеличения высоты ячейки шапки
НоваяКолонка.Заголовок = "Название" + Символы.ПС + "колонки в" + Символы.ПС + "три строки";
Шаг 3. Фиксация ширины колонок
Часто при создании сложных шапок колонки начинают «разъезжаться» или игнорировать установленную ширину. Чтобы жестко зафиксировать размеры, проанализируем следующие настройки:
РастягиватьПоГоризонтали должно быть установлено в значение Ложь.РастягиватьПоГоризонтали также должно быть Ложь.Ширина укажите конкретное число символов.Автомасштабирование. Если оно включено, платформа может игнорировать ваши настройки ширины ради размещения таблицы в границах окна.Если требования к дизайну шапки включают поворот текста на 90 градусов, объединение ячеек «крест-накрест» или специфическое раскрашивание границ, стандартная таблица формы не справится. В этом случае мы переходим к использованию Табличного документа, размещенного прямо на форме.
Преимущества работы с Табличным документом:
ОриентацияТекста).Разберем по шагам, как сделать такой документ интерактивным для ввода данных, так как многие ошибочно считают, что табличный документ предназначен только для вывода отчетов.
Настройка интерактивности:
Чтобы пользователь мог вводить данные прямо в ячейки табличного документа, установим следующие параметры:
// Настройка области для ввода данных
ОбластьДляВвода = ТабДок.Область("R5C2:R10C10");
ОбластьДляВвода.Защита = Ложь; // Разрешаем редактирование в ячейках
ОбластьДляВвода.СодержитЗначение = Истина;
ОбластьДляВвода.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
// Настройка самого элемента управления на форме
Элементы.ТабличныйДокументНаФорме.ТолькоПросмотр = Ложь;
Элементы.ТабличныйДокументНаФорме.Редактирование = Истина;
Обработка изменений:
Для того чтобы данные из табличного документа попадали в базу данных, нам нужно обрабатывать событие ПриИзмененииСодержимогоОбласти. В этом обработчике мы можем считать измененное значение и записать его в связанную таблицу значений или объект.
&НаКлиенте
Процедура ТабличныйДокументПриИзмененииСодержимогоОбласти(Элемент, Область)
// Получаем адрес измененной ячейки
Адрес = Область.Имя;
Значение = Область.Значение;
// Передаем данные на сервер для обработки и сохранения
ОбработатьВводДанныхНаСервере(Адрес, Значение);
КонецПроцедуры
Выясним, какой метод оптимален для вашей задачи. Если вам требуется динамическое добавление колонок, стандартная сортировка, отборы и привычное поведение списка, то Метод 1 (Группы колонок) является приоритетным. Он сохраняет все преимущества Динамического списка или Табличной части.
Если же визуальная составляющая шапки критична (например, шахматка, сложные ведомости с вертикальным текстом), и количество строк в таблице не исчисляется тысячами, то Метод 2 (Табличный документ) предоставит вам полную свободу действий. Рассмотрим подробнее ситуацию с программным созданием сложной шапки в макете табличного документа:
&НаСервере
Процедура СформироватьСложнуюШапку()
ТабДок = Объект.Результат;
Макет = ПолучитьМакет("МакетШапки");
// Выводим основную область
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Фиксируем шапку, чтобы она не уходила при скроллинге
ТабДок.ФиксацияСверху = ОбластьШапка.ВысотаТаблицы;
КонецПроцедуры
Для продвинутых задач, когда колонки создаются динамически в зависимости от настроек пользователя, важно соблюдать строгую иерархию при вызове метода Элементы.Добавить(). Проанализируем ситуацию: если вы добавите колонку непосредственно в таблицу, она всегда будет в конце. Чтобы поместить её внутрь группы, вторым параметром нужно передать именно объект группы.
// 1. Создаем группу первого уровня (например, "Период")
ГруппаПериод = Элементы.Добавить("ГруппаПериод", Тип("ГруппаФормы"), Элементы.ТаблицаДанных);
ГруппаПериод.Вид = ВидГруппыФормы.ГруппаКолонок;
ГруппаПериод.Заголовок = "Январь 2024";
// 2. Создаем вложенную группу (например, "План/Факт")
ГруппаПлан = Элементы.Добавить("ГруппаПлан", Тип("ГруппаФормы"), ГруппаПериод);
ГруппаПлан.Вид = ВидГруппыФормы.ГруппаКолонок;
ГруппаПлан.Заголовок = "Плановые показатели";
// 3. Добавляем конкретную колонку в группу "План"
КолонкаСумма = Элементы.Добавить("КолонкаПланСумма", Тип("ПолеФормы"), ГруппаПлан);
КолонкаСумма.Вид = ВидПоляФормы.ПолеВвода;
КолонкаСумма.ПутьКДанным = "Объект.Данные.СуммаПлан";
Важный нюанс: при динамическом изменении состава колонок в управляемой форме всегда вызывайте ОбновитьОтображение(), чтобы интерфейс корректно пересчитал геометрию шапки после добавления новых групп.
Таким образом, реализация сложной шапки в 1С 8.3 требует комбинированного подхода: использования иерархии групп для логической структуры и небольших «хитростей» с текстовыми строками для визуального выравнивания высоты. Если же интерфейсные ограничения становятся непреодолимыми, переход к табличному документу позволит реализовать интерфейс любой сложности.