При разработке сложных аналитических интерфейсов, отчетов и рабочих мест в среде 1С часто возникает задача зафиксировать верхнюю (родительскую) строку или строку с общими итогами, чтобы при вертикальной прокрутке подчиненных записей ключевые данные всегда оставались на виду. Разберем особенности работы платформы 1С с элементом управления «Таблица», связанным с деревом значений, выясним причину системных ограничений и подробно рассмотрим альтернативные варианты реализации этой задачи.
Проанализируем возможности интерфейсного элемента Таблица на форме, связанного с реквизитом типа ДеревоЗначений или ТаблицаЗначений. В платформе 1С:Предприятие для колонок таблицы предусмотрены свойства ФиксацияСлева и ФиксацияСправа, позволяющие закрепить определенные столбцы при горизонтальной прокрутке.
Однако свойства для фиксации строк по вертикали (например, «ФиксацияСверху» или «ФиксацияСнизу») у элемента формы Таблица полностью отсутствуют. Зафиксировать отдельную строку родителя или узла внутри дерева значений стандартными свойствами элемента формы невозможно.
Свойство ФиксацияСверху существует исключительно у объектов типа ТабличныйДокумент и связанных с ними элементов формы ПолеТабличногоДокумента. Если же нам требуется сохранить визуальный доступ к родительским показателям при работе с деревом значений, рассмотрим проверенные практические способы обхода этого ограничения.
Рассмотрим самый простой и быстрый способ, не требующий переработки всей архитектуры формы. Если дерево значений содержит одну главную родительскую строку, суммарные или ключевые показатели можно вывести непосредственно в подвал (футер) таблицы.
Разберем по шагам, как настроить отображение данных в подвале:
Таблица включим флажок Подвал (установим значение Истина).ТекстПодвала соответствующих колонок.Посмотрим на пример программной установки значений в подвале:
&НаКлиенте
Процедура ОбновитьИтогиВПодвале()
// Предположим, что данные родительского узла содержат общие суммы
Если ДеревоДанных.ПолучитьЭлементы().Количество() > 0 Тогда
ГлавныйРодитель = ДеревоДанных.ПолучитьЭлементы()[0];
Элементы.ДеревоДанныхЗаказано.ТекстПодвала = Формат(ГлавныйРодитель.Заказано, "ЧДЦ=2");
Элементы.ДеревоДанныхРазмещено.ТекстПодвала = Формат(ГлавныйРодитель.Размещено, "ЧДЦ=2");
КонецЕсли;
КонецПроцедуры
При таком подходе пользователь может прокручивать строки дерева вниз на любую глубину, а итоговая строка подвала останется статично закрепленной в нижней части таблицы.
Если в родительской строке содержится не просто сумма, а развернутое описание, состояние заказа или группа реквизитов, вынесем эту информацию в отдельную статичную панель над таблицей.
Разберем структуру формы при таком подходе:
Таблица создадим группу элементов без отображения рамки или выделим ее визуально как карточку.ПолеНадписи или Декорация с типом ФорматированнаяСтрока.В результате ключевые данные заказа или шапки всегда находятся над табличной частью и не зависят от положения ползунка вертикальной прокрутки.
Если специфика задачи строго требует древовидную иерархию (сворачивание и разворачивание узлов по плюсикам и минусикам) и при этом обязательна жесткая фиксация шапки или верхних строк, перейдем на использование объекта ТабличныйДокумент.
Разберем по шагам алгоритм построения такого отчета или формы:
ПолеТабличногоДокумента.ТабличныйДокумент.НачатьГруппуСтрок() и ЗакончитьГруппуСтрок().ОтображатьГруппы = Истина.ФиксацияСверху.Посмотрим на пример кода формирования табличного документа:
&НаСервере
Процедура СформироватьДеревоВТабличномДокументе()
ТабДок = Новый ТабличныйДокумент;
ТабДок.ОтображатьГруппы = Истина;
// Выводим строку с общими данными родителя
СекцияШапка = Макет.ПолучитьОбласть("ШапкаРодителя");
СекцияШапка.Параметры.Заказ = "Заказ покупателя №105";
ТабДок.Вывести(СекцияШапка);
// Фиксируем первую строку (шапку/родителя)
ТабДок.ФиксацияСверху = 1;
// Начинаем группировку для подчиненных строк
ТабДок.НачатьГруппуСтрок("Детализация", Истина);
СекцияСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого ТекСтрока Из ПодчиненныеДанные Цикл
СекцияСтрока.Параметры.Номенклатура = ТекСтрока.Номенклатура;
СекцияСтрока.Параметры.Количество = ТекСтрока.Количество;
ТабДок.Вывести(СекцияСтрока);
КонецЦикла;
ТабДок.ЗакончитьГруппуСтрок();
// Передаем сформированный документ в реквизит формы
РеквизитТабличныйДокумент = ТабДок;
КонецПроцедуры
Если данные предполагают динамическое редактирование пользователем, которое неудобно выполнять в табличном документе, применим паттерн Master-Detail.
Разберем организацию интерфейса:
ПриАктивизацииСтроки верхней таблицы динамически обновляем состав строк в нижней таблице.Таким образом, каждая область формы получает собственный независимый скролл: родительский заказ всегда находится в фокусе, а длинный перечень товарных позиций прокручивается отдельно.