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