Необходимо вывести прайс компании в формате: шапка, две колонки и подвал (ниже макет).
Вся проблема в том что номенклатуры нужно вывести в чётком порядке, а макет ТД заполняется сразу левая и правая колонка. На примере... Есть итоговая выборка:
Номенклатура1/Цена1
Номенклатура2/Цена2
Номенклатура3/Цена3
В итоге простого вывода я получу результат:
(Шапка)
Номенклатура1/Цена1 Номенклатура2/Цена2
Номенклатура3/Цена3
(Подвал)
А мне необходимо сначала реализовать полное заполнение первой колонки, после чего уже переходить ко второй, то есть результат должен бы был быть таким (если 3 позиции влазят в колонку 1):
(Шапка)
Номенклатура1/Цена1
Номенклатура2/Цена2
Номенклатура3/Цена3
(Подвал)
Либо, если в колонку 1 влазит максимум 2 строки (дальше перенос на другой лист), то:
(Шапка)
Номенклатура1/Цена1 Номенклатура3/Цена3
Номенклатура2/Цена2
(Подвал)
В итоге мне не понятно как на этапе вывода первой колонки сразу начать заполнять вторую колонку не заполнив до конца первую :)
Я надеюсь объяснил свою беду...
Была мысль просто грубо высчитать максимальное кол-во строк, которое можно вывести в один столбец и уже на основании этого делать вывод, но номенклатура может быть достаточно длинная и в результате занять вместо одной строки, например, все три.
---
ТабДок.ПроверитьВывод(МассивОбластейДляВывода)
---
Метод проверяет возможность вывода на страницу заданного формата области/массива областей. При этом не важно какая по счету страница проверяется.

Если выбранная область/массив областей для вывода влазит в оставшееся место на странице, то метод вернет Истина.
---
В итоге мне не понятно как на этапе вывода первой колонки сразу начать заполнять вторую колонку не заполнив до конца первую :)

это выполняется с помощью ТабДок.Присоединить(ОбластьСтрокиКолонки2) после ТабДок.Вывести(ОбластьСтрокиКолонки1)

ОбластьСтрокиКолонки2 и ОбластьСтрокиКолонки1 будут иметь вид Номенклатура|Цена.

Ваша задача решается путем набивания массива выводимых областей строк колонка1 с проверкой на вывод всего массива областей, как только массив областей перестает влазить на 1 лист, начинаете делать ТабДок.Вывести(ОбластьСтрокиКолонки1) из полученного массива и тут же ТабДок.Присоединить(ОбластьСтрокиКолонки2), заполнение которой выполнять со смещением из МассивОбластейКолонки1ДляВывода.Количество().

Обход таблицы всех цен выполняется с помощью

```1c
    Для НомерСтроки = 1 По ТаблицаЦен.Количество() Цикл
```

после вывода всех областей из массива, массив создается заново.

Надеюсь, понятно объяснил.
---
Тут есть засада - даже если левый массив влазит на страницу (например 20 одностроковых областей слева), то если к ним начинать присоединять двухстроковые области из правой колонки, то и первый поплывет, так как одностроковые в левой колонке начнут тоже становиться двухстроковыми...

Надеюсь, понятно объяснил...
---
Это уже частные случаи, решаются в индивидуальном порядке.
---
Я подобную идею продумывал, но не совсем понимаю смысл реализации. Например, у меня выборка из 157 строк (генератор рандома в моей голове). Дальше я беру и создаю табличный документ в который вывожу шапку, после чего начинаю заполнять только первую колону выводя каждую строку, после вывода каждой строки проверяя сколько занимает листов табличный документ. Как только кол-во листов становиться равно 2, то я понимаю что с данного момента должна была бы начинаться колонка 2. В результате мне прийдется создать новый табличный документ, который я уже буду знать как заполнять :)
Или как?)
---
Вы не сразу делаете вывод в ТабДок, а создаете массив областей, которые хотите вывести.
Если весь массив областей перестает влазить, то только в этом случае вы делаете вывод всех областей из этого массива, выводя каждую область и присоединяя к ней такую же, но заполнив ее данными строки, номер которой в наборе всех строк с данными равен смещению, равному количеству элементов массива областей.
---
А как без вывода области в ТАбДок узнать сколько листов занимает сам ТабДок?
---
ТабДок.ПроверитьВывод(МассивОбластейДляВывода)
---
ПроверитьВывод

Если в табличном документе уже есть первая страница, а заполняется вторая, то постоянно данная функция будет выдавать "Ложь"?
---
Метод проверяет возможность вывода на страницу заданного формата области/массива областей. При этом не важно какая по счету страница проверяется.

Если выбранная область/массив областей для вывода влазит в оставшееся место на странице, то метод вернет Истина.
---
Все понял. Я добавляю каждую область строки в массив, после каждого добавления проверяя вместимость на одну страницу данным методом и как только помещанмость не будет достигнута, то я начинаю брать и выводить сначала одну область с массива, присоеденяя к ней оставшиеся данные со строк. По сути продублировал Вас. А как Вы бы посоветовали бороться с проблемой, которая может возникнуть из за увеличиния строки в первой колонке поредством увеличения размера ячейки второй колонки из за большого количества символов? В принципе можно в конце вывода листа проверить помещение данных на один лист и если возникла данная проблема, то начинать заполнение документа, но уже уменьшив количество строк в левой части...
(19)
---
Лично я сделал бы заранее 2 строки и не парился бы на одну позицию, либо сделал бы альбомную страницу.
---
Если в метод "ПроверитьВывод" я передаю массив с областями, то эти области метод добавляет друг под другом и после вывода всех проверяет вместились ли они на один лист?
---
Да, при этом учитываются уже выведенные области на текущей странице.
---
Протестировал. Отличный метод, не знал, спасибо.
Подскажите пожалуйста, а если у меня есть область, которую я хочу вывести в самый низ табличного документа. Как это реализовать? Например, полностью пустой лист, а в самом низу листа горизонтальная полоса...
---
Массив строк-"пустышек" пока влазят на страницу. Если перестали, то удаляем последнюю из массива и пихаем с горизонтальной полосой, выводим весь массив.
---
Понял, спасибо за алгоритмы. Буду пробовать реализовать. Хорошего Вам дня.
---
А почему нельзя вывод оформить как нечетные слева, а четные справа?
так проще.

```1c
    Пока Выборка.Следующий() Цикл
    _номенклатура1=Выборка.Номенклатура;
    _Цена1=Выборка.Цена;
    Если Выборка.Следующий() Тогда
    _номенклатура2=Выборка.Номенклатура;
    _Цена2=Выборка.Цена;
    Иначе
    _номенклатура2=неопределенно;
    _Цена=0;
    КонецЕсли;
    КонецЦикла;
```
---
Это слишком просто. Нужно больше страданий.
---
Дипломная работа?
---
Нет :) Мне нужна именно обозначенная последовательность номенклатуры из за чего мне нужно понимать заранее, на работу какой номенклатуре закончится вывод левого столбца, что бы при начале вывода строк начать выводить левый с правым столбцы одновременно. Так же очень интересно почитать алгоритмы, которыми реализуют люди данную задачу. Сама по себе задача мне нравиться, интересно :)
---
Ну, придется сформировать два массива данных, и в одном цикле выводить в строку информацию из двух источников одновременно. Например, по индексу.
Или можно и из одного источника, но надо точно знать, на каком элементе данных начнется вторая колонка.
Или можно для каждой колонки формировать собственные табличные документики-области и складывать их в массив, а потом выводить их вместе со второй колонкой...

Но если высота строк в этих колонках не фиксирована - то задача намного усложняется. Но в принципе выполнима. Но уже за деньги.
---
Создать табличный документ в который вывести область шапки. Потом в этот табличный документ начать выводить построчно номенклатуры до момента, пока табличный документ не станет занимать 2 листа, после чего будет ясно с какой номенклатуры стоит начинать второй табличный документ. Далее создать уже новый табличный документ и начать заполнять левую колонку вместе с правой (так как уже знаем с какого элемента начинать правую).
---
Смысл похожий, да.
---
Кейс с переменным числом колонок (пока помещаются на 1 листе) не рассматривали? Тогда заранее неизвестно не только количество строк, но и количество колонок...
---
Можно сделать и высоту строки фиксированной, но тогда менять размер шрифта в ячейке. И то это если наименование не слишком длинное.
---
(2) Не совсем пончл смысл "Имя функции аосстановления".
Указывал ее, а так же модуль функции аосстановления. Да - в функцию попадаю при каждой итерации свойства, но куда и что она возвращает так и не понял.

У меня такого нет.