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