Как вывести данные в две колонки в табличном документе 1С с заполнением по колонкам?

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

Задача вывода прайс-листа или номенклатуры в две колонки, где сначала полностью заполняется левая колонка до конца страницы, а затем начинается правая, является классической «головной болью» разработчика 1С. Основная сложность заключается в том, что ТабличныйДокумент по своей природе является потоковым объектом, и мы не можем заранее знать, сколько строк поместится на странице, так как высота строк может варьироваться из-за разной длины наименований.

Основные принципы решения задачи

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

  1. Формируем временный массив областей, которые планируем вывести на текущую страницу.
  2. Используем метод ПроверитьВывод() для массива областей, чтобы понять, поместятся ли они на страницу.
  3. Если массив «влезает», продолжаем наполнять его.
  4. Если массив «не влезает», значит, мы нашли предел первой колонки. После этого выводим данные в документ, используя Вывести() для левой колонки и Присоединить() для правой, используя смещение индекса.

Разбор алгоритма вывода

Давайте проанализируем, как именно это реализовать программно. Сначала мы создаем массив областей, которые хотим вывести слева. Как только ПроверитьВывод() вернет Ложь, мы понимаем, что пора «печатать» страницу.


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

Методика вывода с присоединением

Когда мы определили количество строк, которые помещаются в левую колонку, мы приступаем к непосредственному выводу. Важно понимать, что Присоединить() расширяет документ вправо. Мы должны подготовить данные для правой колонки так, чтобы они соответствовали по индексу элементам левой.

Рассмотрим структуру вывода:


Процедура ВывестиДвеКолонки(ТабДок, ОбластиЛевойКолонки, ИсходнаяВыборка)
    Для Индекс = 0 По ОбластиЛевойКолонки.Количество() - 1 Цикл
        ЛеваяОбласть = ОбластиЛевойКолонки[Индекс];
        ТабДок.Вывести(ЛеваяОбласть);
        
        // Правая часть данных
        ИндексПравой = Индекс + ОбластиЛевойКолонки.Количество();
        Если ИндексПравой < ИсходнаяВыборка.Количество() Тогда
            ПраваяОбласть = Макет.ПолучитьОбласть("Строка");
            // Заполняем правую область данными из выборки со смещением
            ТабДок.Присоединить(ПраваяОбласть);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Важные нюансы при верстке

При работе с ПроверитьВывод() учитывайте следующие критические моменты:

Рекомендации для сложных отчетов

Если вы столкнулись с тем, что верстка «едет» из-за разного объема контента, рекомендуем использовать следующие приемы:

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

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

← На главную