При разработке отчетов на платформе 1С 7.7 программисты часто сталкиваются с ограничением стандартного механизма вывода секций. Основная сложность возникает, когда необходимо реализовать сложную верстку: например, вывести слева графическую диаграмму или основную таблицу, а справа от нее — динамический список (рейтинг сотрудников, пояснительные данные), количество строк в котором заранее неизвестно. Стандартный метод ВывестиСекцию работает сверху вниз, а ПрисоединитьСекцию пристыковывает данные только к последней выведенной строке, что затрудняет создание параллельных столбцов разной высоты.
В этой статье мы разберем несколько проверенных способов решения этой задачи, проанализируем их плюсы и минусы, а также научимся делать такие таблицы интерактивными.
Этот метод является наиболее гибким, так как он позволяет игнорировать последовательный строчный порядок формирования таблицы. Вместо того чтобы «печатать» секции одну за другой, мы сначала формируем каркас таблицы, а затем «вписываем» данные в нужные ячейки по их координатам.
Рассмотрим алгоритм действий подробнее:
ВывестиСекцию.Область(Ряд, Колонка) для заполнения значений.Посмотрим на пример реализации такого подхода в коде:
// Предположим, Таб - это объект Таблица
Таб.ВывестиСекцию("Шапка");
СтартоваяСтрока = Таб.ВысотаТаблицы() + 1;
// Выводим левую часть (например, 10 строк с графиком)
Для Ном = 1 По 10 Цикл
Таб.ВывестиСекцию("СекцияГрафика");
КонецЦикла;
// Теперь динамически заполняем правую часть
СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
СпрСотр.ВыбратьЭлементы();
ТекущийРяд = СтартоваяСтрока;
Пока СпрСотр.ПолучитьЭлемент() = 1 Цикл
// Если сотрудников больше, чем строк в левой секции,
// нам нужно добавить пустые строки слева
Если ТекущийРяд > Таб.ВысотаТаблицы() Тогда
Таб.ВывестиСекцию("ПустаяСекция");
КонецЕсли;
// Записываем данные в 5-ю колонку (правая часть)
Таб.Область(ТекущийРяд, 5).Текст = СпрСотр.Наименование;
Таб.Область(ТекущийРяд, 6).Текст = СпрСотр.Рейтинг;
// Сохраняем кликабельность (Расшифровка)
Таб.Область(ТекущийРяд, 5).Расшифровка(СпрСотр.ТекущийЭлемент());
ТекущийРяд = ТекущийРяд + 1;
КонецЦикла;
Важным преимуществом метода Область является возможность программно задавать не только текст, но и оформление: цвет, рамки и шрифт. Это позволяет «наводить красоту» даже в тех случаях, когда структура таблицы меняется на лету.
Если мы хотим использовать преимущества визуального редактора таблиц (где настроены шрифты, отступы и цвета в секциях), нам подойдет метод синхронного вывода. Суть его заключается в том, чтобы за один проход цикла выводить и левую, и правую части одновременно.
Проанализируем ситуацию: у нас есть массив данных для графиков и список сотрудников. Нам нужно определить, кто из них «длиннее», и итерироваться по максимальному количеству строк. Разберем по шагам, как это реализовать:
Макс(КоличествоСтрокГрафика, КоличествоСотрудников).ВывестиСекцию для левой части и сразу же ПрисоединитьСекцию для правой части.Пример кода для синхронного вывода:
// ТЗ_Сотрудники - подготовленная таблица значений
ВсегоСтрок = Макс(ВысотаГрафика, ТЗ_Сотрудники.КоличествоСтрок());
Для Ном = 1 По ВсегоСтрок Цикл
// Выводим левую часть
Если Ном <= ВысотаГрафика Тогда
Таб.ВывестиСекцию("СекцияЛево");
Иначе
Таб.ВывестиСекцию("ПустаяСекцияЛево");
КонецЕсли;
// Присоединяем правую часть
Если Ном <= ТЗ_Сотрудники.КоличествоСтрок() Тогда
// Устанавливаем параметры в секции перед присоединением
СотрФИО = ТЗ_Сотрудники.ПолучитьЗначение(Ном, "ФИО");
СотрРейтинг = ТЗ_Сотрудники.ПолучитьЗначение(Ном, "Рейтинг");
Таб.ПрисоединитьСекцию("СекцияПраво");
КонецЕсли;
КонецЦикла;
Этот способ удобен тем, что вы сохраняете все настройки форматирования, заданные в конфигураторе для секций СекцияЛево и СекцияПраво. Однако он требует тщательного контроля над тем, чтобы высота строк в обеих секциях совпадала, иначе колонки «разъедутся».
Мало кто из начинающих разработчиков 1С 7.7 активно использует вертикальные секции, хотя они встроены в платформу. В редакторе таблиц можно задать не только горизонтальные области, но и вертикальные. Это позволяет динамически наращивать таблицу в ширину.
Если ваша задача — вывести список сотрудников не вниз, а вправо (колонками), то вертикальные секции будут незаменимы. Сначала выводится основная горизонтальная секция, а затем внутри неё или после неё циклом присоединяются вертикальные области.
Автор темы на форуме выразил опасение, что при «колхозном» выводе (например, через объединение строк с разделителем) пропадет возможность кликнуть по сотруднику. При использовании методов Область или ПрисоединитьСекцию эта проблема легко решается.
Объект Область в 1С 7.7 имеет метод Расшифровка(). Даже если вы заполняете таблицу вручную, вы можете назначить ячейке значение — ссылку на элемент справочника или документ. При формировании отчета 1С поймет, что это расшифровка, и при двойном клике откроет соответствующий объект. Важно: не забывайте передавать именно объект (ссылку), а не просто строку с именем, чтобы стандартный механизм открытия карточки сработал автоматически.
Если стандартных средств Таблицы недостаточно для реализации задуманного дизайна (например, нужно менять цвета ячеек в зависимости от условий более гибко или перехватывать движение мыши), профессионалы часто обращаются к внешней компоненте FormEx. Она расширяет возможности встроенного языка, позволяя программно управлять визуальным представлением таблиц на уровне, близком к современным версиям 1С.
В частности, FormEx позволяет:
Подводя итог, можно сказать, что наиболее сбалансированным решением для 1С 7.7 является комбинированный метод: вывод основного каркаса секциями и заполнение динамических «проблемных» зон через метод Область. Это гарантирует предсказуемый результат и сохраняет возможность интерактивной работы с отчетом.