Задача.
Вывести в печатную форму, на подобии печати ценников, мини-прайсы. Т.е. некий набор номенклатуры с ценами.
Для тех кто не в курсе как печатаются ценники (на примере УТ11) выводятся фиксированные блоки поочередно присоединяя их, пока они по размеру входят в выводимую область. Как только присоединение не возможно, данные выводятся на «новой строке» Таблицы. Проверка осуществляется ч/з проверить присоединение и проверить вывод
Проблема заключается в том, что количество строк в каждом мини-прайсе различна, и заранее определить фиксированную область в макете для их присоединения (методом присоединить) не представляется возможным.
Решение, приведенное выше, конечно, рабочее и может применяться (даже применяется) на практике. Но к моему глубокому сожалению, для меня не приемлемо по моим внутренним убеждениям (люблю, чтоб код был простым и красивым). Поэтому у меня придумался другой подход.
Решение
Если коротко, то алгоритм следующий:
- Создаем «подставной» табличный документ
- Получаем из макета области для формирования мини-прайса (в примере Шапка, строка, подвал)
- В цикле по сгруппированным данным (по данным шапки)
- Очищаем подставной макет
- Выводим в него шапку
- Выводим все строки (цикл по строкам)
- Выводим подвал
- Получаем область из подставной табличной части, в которую вывели данные.
- Далее работаем с этой областью так же, как как если бы мы получили ее из макета целиком (проверяем на вывод и выводим)
Алгоритм не сложный, и думаю что не я первый, кто пользуется таким способом.
PS: Возможно, данная реализация не самая красивая и есть еще варианты. Предлагаю обсудить в комментах.
Ниже небольшая выдержка из кода обработки, прикрепленной для скачивания (демо пример в которой на ряду со «сборной» областью выводится фиксированная область, типа ценника)
ТабличныйДокумент = Новый ТабличныйДокумент;
ВременнаяОбласть = Новый ТабличныйДокумент;
ФиксОбласть = Макет.ПолучитьОбласть("ФиксХ|У");
ФиксОбласть.Параметры.Текст = ТекстФиксированногоМакета;
Х_Шапка = Макет.ПолучитьОбласть("Х_Шапка|У");
Х_Строка = Макет.ПолучитьОбласть("Х_Строка|У");
Х_Подвал = Макет.ПолучитьОбласть("Х_Подвал|У");
ПерваяКолонка = Истина;
Если ВыводитьФиксированнуюОбласть Тогда
Область = ФиксОбласть;
ВывестиОбласть(ТабличныйДокумент, Область, ПерваяКолонка);
КонецЕсли;
Для х = 1 по СтрокиТаблицы.Количество() Цикл
СтрокаТаблицы = СтрокиТаблицы[х-1];
ВременнаяОбласть.Очистить();
Х_Шапка.параметры.Наименование = СтрокаТаблицы.Наименование;
ВременнаяОбласть.Вывести(Х_Шапка);
Для Каждого строкаТ из СтрокаТаблицы.Строки Цикл
ЗаполнитьЗначенияСвойств(Х_Строка.Параметры, строкаТ);
ВременнаяОбласть.Вывести(Х_Строка);
КонецЦикла;
ВременнаяОбласть.Вывести(Х_Подвал);
Область = ВременнаяОбласть.ПолучитьОбласть("R1C1:R"+ВременнаяОбласть.ВысотаТаблицы+"C"+ВременнаяОбласть.ШиринаТаблицы);
ВывестиОбласть(ТабличныйДокумент, Область, ПерваяКолонка);
Если ВыводитьФиксированнуюОбласть Тогда
Область = ФиксОбласть;
ВывестиОбласть(ТабличныйДокумент, Область, ПерваяКолонка);
КонецЕсли;
КонецЦикла;