Как реализовать объединение ячеек или сложную структуру строк в таблице значений на управляемой форме

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

При разработке интерфейсов на управляемых формах 1С программисты часто сталкиваются с ограничением стандартного элемента Таблица: в нем невозможно программно или интерактивно объединить ячейки по горизонтали для конкретной строки, как это делается в Excel или в табличных документах. Рассмотрим ситуацию, когда у нас есть показатели с разными наборами данных — например, для одних важны границы (Минимум/Максимум), а для других достаточно одного строкового значения.

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

Метод 1: Визуальная имитация через Условное оформление

Если нам принципиально использовать именно элемент ТаблицаЗначений (например, для сохранения возможности стандартной сортировки и поиска), мы можем прибегнуть к «хитрости» с оформлением. Хотя мы не можем физически убрать границы между колонками Минимум и Максимум, мы можем сделать их содержимое невидимым или неактивным.

Разберем этот процесс подробнее:

  1. Добавим в объект ТаблицаЗначений служебную колонку, например, ТипСтроки (это может быть и колонка с флажком).
  2. Настроим Условное оформление формы. Создадим правило, где условием будет Объект.ТЗ.ТипСтроки = 1 (строка без числовых показателей).
  3. В оформляемых полях выберем колонки Минимум и Максимум.
  4. Установим параметр ЦветТекста равным цвету фона или просто очистим текст через параметр Текст (установив пустую строку), чтобы ячейки выглядели пустыми.

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

Метод 2: Использование Табличного документа на форме

Как справедливо заметили участники обсуждения, если требования к макету (объединению ячеек) являются критичными, стандартная ТаблицаЗначений не подходит. В этом случае мы используем элемент Поле табличного документа. Рассмотрим, как это реализовать программно:

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


&НаСервере
Процедура ЗаполнитьТаблицуНаФорме()
    ТабДок = ЭтаФорма.РеквизитТабличныйДокумент;
    ТабДок.Очистить();
    
    // Определяем макет или формируем области программно
    Для Каждого СтрокаТЗ Из Объект.ИсточникДанных Цикл
        НомерСтроки = ТабДок.ВысотаТаблицы + 1;
        
        Если СтрокаТЗ.ЭтоГруппа Тогда
            // Объединяем ячейки для специфического показателя
            Область = ТабДок.Область(НомерСтроки, 2, НомерСтроки, 4);
            Область.Объединить();
            Область.Текст = СтрокаТЗ.ЗначениеСтрокой;
        Иначе
            // Обычный вывод данных в разные колонки
            ТабДок.Область(НомерСтроки, 2).Текст = СтрокаТЗ.Значение;
            ТабДок.Область(НомерСтроки, 3).Текст = СтрокаТЗ.Минимум;
            ТабДок.Область(НомерСтроки, 4).Текст = СтрокаТЗ.Максимум;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Метод 3: Группировка колонок

Выясним причину, по которой иногда визуально требуется объединение. Часто это нужно для создания логических «шапок». В управляемых формах 1С есть мощный инструмент — Группы колонок. Проанализируем, как ими воспользоваться:

В дереве элементов формы выделите нужные колонки (например, Минимум и Максимум), нажмите правую кнопку мыши и выберите Сгруппировать колонки. У группы установите свойство Группировка в значение Вертикальная или В отдельной колонке. Это позволит:

Метод 4: Поле HTML-документа

Если задача стоит в создании максимально гибкого интерфейса, который должен выглядеть как веб-страница, рассмотрим использование Поля HTML-документа. Мы можем сформировать строку HTML, используя теги <table>, <tr>, <td> и атрибут colspan для объединения колонок.

Пример формирования динамической таблицы:


&НаСервере
Функция СформироватьHTMLТаблицу()
    ТекстHTML = "<html><body><table border='1' style='width:100%; border-collapse: collapse;'>";
    
    Для Каждого Строка Из ТаблицаДанных Цикл
        ТекстHTML = ТекстHTML + "<tr>";
        ТекстHTML = ТекстHTML + "<td>" + Строка.Показатель + "</td>";
        
        Если Строка.НужноОбъединение Тогда
            ТекстHTML = ТекстHTML + "<td colspan='3'>" + Строка.Значение + "</td>";
        Иначе
            ТекстHTML = ТекстHTML + "<td>" + Строка.Значение + "</td>";
            ТекстHTML = ТекстHTML + "<td>" + Строка.Минимум + "</td>";
            ТекстHTML = ТекстHTML + "<td>" + Строка.Максимум + "</td>";
        КонецЕсли;
        
        ТекстHTML = ТекстHTML + "</tr>";
    КонецЦикла;
    
    ТекстHTML = ТекстHTML + "</table></body></html>";
    Возврат ТекстHTML;
КонецФункции

Важно: Этот метод требует знаний HTML/CSS и усложняет получение данных обратно в 1С при редактировании, как и в случае с форматированным документом (потребуется использование события ПриНажатии и расшифровка параметров через URL-схему).

Рекомендации по выбору решения

Выбор конкретного метода зависит от ваших приоритетов:

1. Если вам нужны стандартные отборы и оформление — используйте Метод 1 (Условное оформление). Вы не получите реального объединения, но добьетесь визуальной чистоты.

2. Если важна красота и точность макета (как в печатной форме) — выбирайте Метод 2 (Табличный документ). Это эталонный способ для сложных аналитических отчетов на форме.

3. Если нужно компактно разместить данные — используйте Метод 3 (Группировка колонок). Это самый «родной» для платформы способ без написания сложного кода.

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

← На главную