Как зафиксировать строку в дереве значений в 1С?

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

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

Штатные ограничения платформы 1С для таблиц и деревьев значений

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

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

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

Вариант 1. Отображение итогов и родительских данных в подвале колонок

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

Разберем по шагам, как настроить отображение данных в подвале:

  1. В свойствах элемента формы Таблица включим флажок Подвал (установим значение Истина).
  2. Для требуемых колонок дерева включим отображение текста подвала.
  3. При заполнении данных или расчете показателей программно присвоим значения свойству ТекстПодвала соответствующих колонок.

Посмотрим на пример программной установки значений в подвале:


&НаКлиенте
Процедура ОбновитьИтогиВПодвале()
    // Предположим, что данные родительского узла содержат общие суммы
    Если ДеревоДанных.ПолучитьЭлементы().Количество() > 0 Тогда
        ГлавныйРодитель = ДеревоДанных.ПолучитьЭлементы()[0];
        
        Элементы.ДеревоДанныхЗаказано.ТекстПодвала = Формат(ГлавныйРодитель.Заказано, "ЧДЦ=2");
        Элементы.ДеревоДанныхРазмещено.ТекстПодвала = Формат(ГлавныйРодитель.Размещено, "ЧДЦ=2");
    КонецЕсли;
КонецПроцедуры

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

Вариант 2. Вынос родительских данных в информационную панель над деревом

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

Разберем структуру формы при таком подходе:

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

В результате ключевые данные заказа или шапки всегда находятся над табличной частью и не зависят от положения ползунка вертикальной прокрутки.

Вариант 3. Использование Поля табличного документа с группировками

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

Разберем по шагам алгоритм построения такого отчета или формы:

  1. Разместим на форме элемент ПолеТабличногоДокумента.
  2. Сформируем отчет через СКД или программный вывод макета в ТабличныйДокумент.
  3. Оформим иерархические уровни с помощью методов НачатьГруппуСтрок() и ЗакончитьГруппуСтрок().
  4. Включим интерактивное управление группировками, установив свойство ОтображатьГруппы = Истина.
  5. Зафиксируем верхнюю строку или блок строк с помощью свойства ФиксацияСверху.

Посмотрим на пример кода формирования табличного документа:


&НаСервере
Процедура СформироватьДеревоВТабличномДокументе()
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.ОтображатьГруппы = Истина;
    
    // Выводим строку с общими данными родителя
    СекцияШапка = Макет.ПолучитьОбласть("ШапкаРодителя");
    СекцияШапка.Параметры.Заказ = "Заказ покупателя №105";
    ТабДок.Вывести(СекцияШапка);
    
    // Фиксируем первую строку (шапку/родителя)
    ТабДок.ФиксацияСверху = 1;
    
    // Начинаем группировку для подчиненных строк
    ТабДок.НачатьГруппуСтрок("Детализация", Истина);
    
    СекцияСтрока = Макет.ПолучитьОбласть("Строка");
    Для Каждого ТекСтрока Из ПодчиненныеДанные Цикл
        СекцияСтрока.Параметры.Номенклатура = ТекСтрока.Номенклатура;
        СекцияСтрока.Параметры.Количество   = ТекСтрока.Количество;
        ТабДок.Вывести(СекцияСтрока);
    КонецЦикла;
    
    ТабДок.ЗакончитьГруппуСтрок();
    
    // Передаем сформированный документ в реквизит формы
    РеквизитТабличныйДокумент = ТабДок;
КонецПроцедуры

Вариант 4. Разделение интерфейса на две связанные таблицы (Master-Detail)

Если данные предполагают динамическое редактирование пользователем, которое неудобно выполнять в табличном документе, применим паттерн Master-Detail.

Разберем организацию интерфейса:

  1. Разделим форму на две части по вертикали.
  2. В верхней части разместим компактную таблицу или поля для родительского уровня (заказы покупателей).
  3. В нижней части разместим таблицу только для подчиненных строк текущего выбранного заказа.
  4. По событию ПриАктивизацииСтроки верхней таблицы динамически обновляем состав строк в нижней таблице.

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

← На главную