Вывод в макет в две колонки (как в ворде)

1. AndrewKop 11.06.19 08:48 Сейчас в теме
Получил задание на реализацию макета, но есть 2 "но": во-первых, я в макетах и так не силен, а во-вторых, макет тоже не простой. Сразу скажу что гуглил, но ничего путного так и не нашел.
Пример документа, которых должен сформировать макет, во вложении. Проблемы в следующем:
* Наименование программы может быть очень длинным и по идее должно перетекать на вторую страницу, при этом на первой странице подвал "Город год" должен быть всегда. На второй странице таблица тоже может быть с разным количеством строк. Если с первой страницей я путем ПроверитьВывод и дробления наименования программы еще могу все красиво оформить, то на второй странице не знаю как запихнуть все это наверх, так как присоединить выводит снизу справа. К тому же смущает дописка в СП, что не рекомендуется гонять между клиентом и сервером такие (в которых используется присоединить) макеты.
Короче, дайте идеи, поделитесь опытом, а то уже готов сделать весь лист одним полем и выводить путем обращения к ячейкам напрямую. ((
Прикрепленные файлы:
Макет.docx
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. tusv 211 11.06.19 09:16 Сейчас в теме
(1) Можно попробовать Правую часть вывести в отдельный Табличный документ, а затем присоединить к основному, ну и полученный Табличный документ возвратить на клиент
5. AndrewKop 11.06.19 09:36 Сейчас в теме
(3) Логику понял. Но если я буду к первому ТабДоку присоединять второй, то о не выведется справа снизу, как получается, когда я присоединяю обычную область?
6. x_x 2 11.06.19 09:48 Сейчас в теме
(5)можно присоединить как с боку так и снизу, а форма удостоверения всегда на 1 листе я так понимаю, значит проблем присоединения быть не должно.
7. tusv 211 11.06.19 09:53 Сейчас в теме
(5)Проверил. Увы выводится снизу
8. tusv 211 11.06.19 10:01 Сейчас в теме
(5)Ан нет. Все работает как надо
&НаСервере
Функция  ПечатьНаСервере()
	Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
	ПраваяЧасть = Макет.ПолучитьОбласть("ПраваяЧасть|Колонка");
	ЛеваяЧасть = Макет.ПолучитьОбласть("ЛеваяЧасть|Колонка");
	ТабДок = Новый ТабличныйДокумент;
	ТабДокПраво = Новый ТабличныйДокумент;
	ТабДок.Вывести(ЛеваяЧасть);
	ТабДокПраво.Вывести(ПраваяЧасть);
	ТабДокПраво.Вывести(ПраваяЧасть); //спецом вывел второй раз
	ТабДок.Присоединить(ТабДокПраво);
	Возврат ТабДок;
КонецФункции
Показать
Прикрепленные файлы:
9. AndrewKop 11.06.19 10:26 Сейчас в теме
(8) Блин, а у меня таки не получилось. Выводит справа снизу. У вас первый комментарий тоже о том что не работает. Что не так было и что поправили? Я делаю в сущности то же самое, только область задаю не пересечением, а обращаюсь по имени (именованный диапазон ячеек). Попробую сейчас пересечением её задать.
10. tusv 211 11.06.19 10:31 Сейчас в теме
(9)Ну если область задать только горизонтально, то она же имеет бесконечное количество колонок, вот и выводит вниз.
А когда четко прописали. То как надо.
Смотрите внимательно на картинки и на код
11. AndrewKop 11.06.19 10:37 Сейчас в теме
(10) Так вроде ни одной области бесконечно уходящей вправо нет. Что на первой странице, что на второй - все суть именованные конечные диапазоны. Пример одной из областей во вложении.
Прикрепленные файлы:
12. tusv 211 11.06.19 10:57 Сейчас в теме
(11)У меня немножко не так
Я выделил строки по заголовкам строк и нажал cntr+shift+N, назначил имя горизонтальной секции макета
Выделил Колонку, нажал нажал cntr+shift+N, назначил имя вертикальной секции макета.
Нужные мне области получил пересечением горизонтальной и вертикальной секции
ПраваяЧасть = Макет.ПолучитьОбласть("ПраваяЧасть|Колонка");
ЛеваяЧасть = Макет.ПолучитьОбласть("ЛеваяЧасть|Колонка");
13. tusv 211 11.06.19 11:03 Сейчас в теме
(11)На самом деле работает и так и так. У Вас наверное, какая то область все таки бесконечная
Прикрепленные файлы:
ПечатьМакетаВ2колонки.epf
14. AndrewKop 11.06.19 12:34 Сейчас в теме
(13) "Присоединяет табличный документ к результирующему табличному документу, помещая его в следующей колонке правее самой правой выведенной колонки, начиная со строки, с которой выводился предыдущий табличный документ."
Мне нужно внимательнее СП читать. У меня первый ТабДок выводился кусками. И следовательно присоединялось на его уровне.
Учитывая, что мне в любом случае придется выводить кусками первый лист, то думаю прокатит схема с 3мя ТабДоками. Один общий и 2 для каждой страницы. Заполню "страничные" а потом по очереди их в общий закину.
tusv, спасибо за изначальную идею!
15. AndrewKop 11.06.19 14:17 Сейчас в теме
(14) А все-таки что-то не везет мне сегодня.
&НаСервере
Функция  ПечатьНаСервере()
	Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
	ПраваяЧасть = Макет.ПолучитьОбласть("ПраваяЧасть|Колонка");
	ЛеваяЧасть = Макет.ПолучитьОбласть("ЛеваяЧасть|Колонка");
	//ПраваяЧасть = Макет.ПолучитьОбласть("Шапка");
	//ЛеваяЧасть = Макет.ПолучитьОбласть("Таблица");
	ТабДок = Новый ТабличныйДокумент;
	ТабДокПраво = Новый ТабличныйДокумент;
	ТакДокОбщ = Новый ТабличныйДокумент;
	ТабДок.Вывести(ЛеваяЧасть);
	ТабДок.Вывести(ЛеваяЧасть);
	ТабДокПраво.Вывести(ПраваяЧасть);
	ТабДокПраво.Вывести(ПраваяЧасть);
	ТакДокОбщ.Вывести(ТабДок);
	ТакДокОбщ.Присоединить(ТабДокПраво);
	Возврат ТакДокОбщ;
КонецФункции
Показать

Вот такой код теоретически должен был вывести по 2 области справа и слева. Но.. все гонится в один столбец.
Упросил себе задачу, договорился, что все что находится на первой странице будем выводить только на ней, перетекать на второй столбец оно не будет. Соотвественно вывести первую страницу можно будет одной областью. Тогда и присоединение правильно сработает. Но все же неприятное белое пятно осталось. Если кто в курсе как сделать - буду рад послушать.
Прикрепленные файлы:
16. tusv 211 11.06.19 14:46 Сейчас в теме
(15)Надо Правый табличный документ очищать, чтобы не накапливался
Все работает
&НаСервере
Функция  ПечатьНаСервере()
	Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
	//ПраваяЧасть = Макет.ПолучитьОбласть("ПраваяЧасть|Колонка");
	//ЛеваяЧасть = Макет.ПолучитьОбласть("ЛеваяЧасть|Колонка");
	ПраваяЧасть = Макет.ПолучитьОбласть("Таблица");
	ЛеваяЧасть = Макет.ПолучитьОбласть("Шапка");
	
	ТабДок = Новый ТабличныйДокумент;
	ТабДокПраво = Новый ТабличныйДокумент;
	
	ТабДок.Вывести(ЛеваяЧасть);
	
	ТабДокПраво.Вывести(ПраваяЧасть);
	ТабДок.Присоединить(ТабДокПраво);
	// Вторая страница
	ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
	ТабДок.Вывести(ЛеваяЧасть);
	ТабДокПраво.Очистить();
	ТабДокПраво.Вывести(ПраваяЧасть);
	ТабДок.Присоединить(ТабДокПраво);
	
	Возврат ТабДок;
КонецФункции
Показать
Прикрепленные файлы:
17. AndrewKop 13.06.19 13:10 Сейчас в теме
(16) К сожалению, в моём случае, не прокатит. Левый ТабДок и правый ТабДок'и не равнозначные, как в вашем примере. Высота строк разная, по разному именованные блоки определены. Я к тому, что нельзя заполнять левый ТабДоки и одновременно с ним формировать аналогичный блок правого и сразу его присоединять и очищать. Мне сначала придется отдельно заполнить левый ТабДок из нескольких областей и отдельно правый. Логика их формирования не пересекается. А уже потом сложить их вместе. И тут уже присоединить не работает. Ни в случае 3 ТД, ни в случае 2х.
19. tusv 211 16.06.19 21:11 Сейчас в теме
(17)Мой пример, основан на Вашем. И да строки разъезжаются. Но можно модернизировать совет Acanta, что в (18), Левая часть набор Картинок, тип Текст, заполнение Текст, Параметр (уместно, где ФИО) или Шаблон, там где указан период, Типа
с [ДатаНачала] по [ДатаОкончания]

ДатаНачала и ДатаОкончания будут параметры Левой части.
Разъезжаться особо не будет. Да и программно можно подправить положение, размеры картинок
2. soft_wind 11.06.19 09:07 Сейчас в теме
как вариант, попробуйте свою печать сделайте на Вордовском шаблоне!!!
тут и ваши две колонки будут, и колонтитуры (верхний с нижним) и в сети полно таких примеров
4. AndrewKop 11.06.19 09:21 Сейчас в теме
(2) Это да. Рассматриваю как последний вариант. Просто там у документа в зависимости от значений реквизитов 21 разных печатных форм. И все остальные на обычных макетах. И один на ворде среди них будет смущать пользователей. Да и такие обработки работаю не очень быстро у нас, так как макет получаешь на сервере, сервер в другой подсети, гонишь макет в хранилище, потом оттуда получаешь на клиенте, потом в файл, потом СОМ-объект, а потом еще с клиента за значениями реквизитов идешь. Тоже муторно. Но да, согласен, это тоже решение. Просто хотелось скил макетами прокачать. Хотелось бы попробовать решить задачу не прибегая к active document.
18. acanta 13.06.19 13:17 Сейчас в теме
Тут неподалеку пробегала публикация преобразование макета в картинку. Возможно, две картинки превратить в две колонки проще чем синхронизировать логику вывода.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот