СКД. Вставка разрыва страницы

Опубликовал Петр Чечин (stoptime) в раздел Программирование - Практика программирования

Столкнувшись с достаточно типовой проблемой при разработке отчетов на системе компоновки данных(СКД), вставка разрыва страницы в конце группировки, на форумах и в документации не нашел простого решения этой задачи. Пост-обработкой табличного документа заниматься не хотелось, хотя совсем этого избежать пока не удалось :) , поэтому было найдено не сложное решение которым я хочу с вами поделиться.

 

Столкнувшись с достаточно типовой проблемой при разработке отчетов на системе компоновки данных(СКД), вставка разрыва страницы после в конце группировки, на форумах и в документации не нашел простого решения этой задачи. Пост-обработкой табличного документа заниматься не хотелось, хотя совсем этого избежать пока не удалось :) , поэтому было найдено не сложное решение которым я хочу с вами поделиться.

Отчет будем формировать программно переопределив событие "ПриКомпоновкеРезультата"

 

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка=ЛОжь;

Настройки = КомпоновщикНастроек.ПолучитьНастройки();

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

ПроцессорВывода.НачатьВывод();

ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Пока
ЭлементРезультата <> Неопределено Цикл
    Если
ЭлементРезультата.ЗначенияПараметров.Количество()=1 Тогда
            Если
ЭлементРезультата.ЗначенияПараметров[0].Значение = "Разорвать" Тогда
           
ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
    КонецЕсли;
   
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
   
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();

 

Как вы видите здесь все шаблонно, весь фокус находится в анализе ЭлементРезультата, в нем нужно определить когда собсвенно резать. Как я это решил для себя:

В СКД был добавлен Параметр РазрывСтраницы с типом строка и заданным значением "Разорвать"

 

В моей задачи мне нужно было выводить показатели списка врачей, при этом каждый врач должен был печататься на своем листе. В настройках отчета я сделал именованную группировку:

 

В настройка этой группировки я убрал Авто поля и вставил свой парметр РазрывСтраницы.

 

 

Далее для этой группировки сделал свой макет:

 

Чтобы сделать группировку не видимой я в настройках, для этой группировки установил условное оформление: цвета текста, фона, линий - белые.

На закладке Другие настройки установил: Тип макета - вертикально, Выводить отбор - не выводить.

Для чего все это было сделано, напомню кусочек кода:

 

    Если ЭлементРезультата.ЗначенияПараметров.Количество()=1 Тогда
            Если
ЭлементРезультата.ЗначенияПараметров[0].Значение = "Разорвать" Тогда
           
ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
    КонецЕсли;

 

Для группировки ГруппировкаРазрыв у нас количество в коллекции ЗначенияПараметров будет равно 1. Всегда будет 1 параметр и его значение будет всегда равно нашей строке "Разорвать"  Благодаря этому и появляется выловить его при обходе результата. В пост обработки табличного документа придется удалить 2 последние строки, иначе у нас будет печататься пустая страница.

С уважение Петр Юрьевич Чечин


См. также

Комментарии
0. Петр Чечин (stoptime) 264 30.10.11 14:22 Сейчас в теме
Столкнувшись с достаточно типовой проблемой при разработке отчетов на системе компоновки данных(СКД), вставка разрыва страницы в конце группировки, на форумах и в документации не нашел простого решения этой задачи. Пост-обработкой табличного документа заниматься не хотелось, хотя совсем этого избежать пока не удалось :) , поэтому было найдено не сложное решение которым я хочу с вами поделиться.


Перейти к публикации

igor-tit; +1 Ответить
1. Vladimir (Boroda) 90 30.10.11 15:39 Сейчас в теме
Спасибо за хорошую публикацию, но почему-то, как ни старался, не могу посмотреть картинки к ней. Вместо них - лишь рамка с красным крестиком
2. Петр Чечин (stoptime) 264 30.10.11 19:23 Сейчас в теме
Не знаю , почему у тебя проблеммы с картинками у меня отображаются нормально.
3. Max Gr. (max082) 31.10.11 11:33 Сейчас в теме
stoptime, как раз искал решение такой задачи месяц назад. В итоге решил тупо пост-обработкой(. Ваш вариант интереснее!
4. Петр Чечин (stoptime) 264 31.10.11 11:55 Сейчас в теме
Да я тоже раньше постобработкой справлялся, просто нужно было сделать серию отчетов, и не все достаточно простые, для разбора потом табличного документа. Вот и придумал этот фокус. Нужда заставляет нас творить чудеса
5. Александр Крынецкий (echo77) 717 31.10.11 17:26 Сейчас в теме
1С расчетные листки в ЗУПе постобработкой режет
6. Makc Saipl (Saipl) 6 01.11.11 15:06 Сейчас в теме
А если в СКД в макете создать макет заголовка группировки для врачей, создать именную область макета в свойствах которой в группе Параграф указать "Начало страницы" ???
7. Петр Чечин (stoptime) 264 01.11.11 18:51 Сейчас в теме
(6) Saipl, Пробовал. вставлять разрыв страницы в макете, настраивать параграф. Убирамть макет оформления. в нем кстате нельзя настроить Параграф. Вобщем я досточно пошарился по всему механизму работы с макетами. Все пробовал на платформе 8.2.13, надо будет посмотреть может в следующих они испавят это поведение
8. bulpi bulpi (bulpi) 110 03.11.11 11:40 Сейчас в теме
Все это здорово напоминает удаление гланд через задний проход. Виртуозно, да. А через рот не пробовали? ( в смысле, обязательно КАЖДЫЙ отчет делать в СКД? Это религия такая?)
9. Дандронтий Крузенштерн (dandrontiy) 07.11.11 13:28 Сейчас в теме
Гениально просто. Это зачёт.
igor-tit; +1 Ответить
10. solarlion (solarlion) 08.11.11 10:47 Сейчас в теме
Тоже думал над этой проблемой в СКД. Попробую такой вариант.
11. Петр Чечин (stoptime) 264 08.11.11 20:07 Сейчас в теме
(10) Если получится что то добавить к придумке, сообщи. Статью расширим
12. Марина Шевченко (marinelle) 11.11.11 11:33 Сейчас в теме
Спасибо!!! хоть появился еще один вариант, кроме постобработки.
13. rusrus rusrus (rusrus) 48 26.02.12 12:46 Сейчас в теме
Гениально. Спасибо
igor-tit; +1 Ответить
14. Сергей (lsp71) 28.02.12 13:57 Сейчас в теме
Присоединяюсь к плюсующим. Спасибо за идею.
igor-tit; +1 Ответить
15. irenkaN (irenkaN) 29.02.12 09:38 Сейчас в теме
Большое спасибо, вы очень помогли
igor-tit; +1 Ответить
16. Александр Че (chmod660) 410 17.04.12 14:03 Сейчас в теме
спасибо за идею, воспользовался!
igor-tit; +1 Ответить
17. Armando Armando (Armando) 1375 16.07.12 18:28 Сейчас в теме
Спасибо
Что бы группировка-пустышка не выводилась я дописал чуть-чуть:
Если ЭлементРезультата.ЗначенияПараметров[0].Значение = "Разорвать" Тогда
	ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
	ЭлементРезультата = ПроцессорКомпоновки.Следующий();
	Продолжить;
КонецЕсли;
...Показать Скрыть
igor-tit; rendalina; manaxov83; zqzq; KindLion; ERP-master; zus; alex15650; +8 Ответить 1
18. ВладимирП Пономарев (владимирп) 24 16.07.12 18:34 Сейчас в теме
Все гениальное просто! Это надо взять на вооружение
igor-tit; +1 Ответить
19. www2000 www2000 (www2000) 52 21.08.12 10:49 Сейчас в теме
Спасибо, отличная идея!

Но в конце поста левая картинка с правилами обмена данными, или они сюда каким-то боком относятся.
20. Петр Чечин (stoptime) 264 21.08.12 11:15 Сейчас в теме
(19) Это я на редактировал. правил 2 статьи сразу.
21. Денис (Den_D) 47 21.08.12 17:39 Сейчас в теме
Голь на выдумки хитра) Автору большое спасибо!
igor-tit; +1 Ответить
22. Алекс Ю (AlexO) 115 21.08.12 17:47 Сейчас в теме
Т.е. снова "пустышку" выводим?
Ничего в 1С не меняется... :(
23. qwerty qwerty (vamleshka) 13.09.12 14:29 Сейчас в теме
Спасибо за классную идею! буду пробовать ее реализовать
igor-tit; +1 Ответить
24. Сан Саныч (herfis) 107 13.02.13 15:27 Сейчас в теме
Как уже было сказано выше, группировку-пустышку можно просто не выводить при поэлементном выводе отчета.
Это сразу несколько плюшек дает:
1) не выводится лишняя строка
2) отпадает необходимость настраивать оформление группировки-пустышки, обеспечивая её условную невидимость
3) а самое вкусное - не надо удалять строки с "хвостовым" разрывом строки. Т.к. после последнего разрыва теперь нет данных для вывода, то пустой лист не выгоняется.
igor-tit; +1 Ответить
25. pau74 (pau74) 7 02.06.13 20:32 Сейчас в теме
Спасибо за идею.
Можно перед выводом элементов, найти в схеме компоновки данных макет, в котором присутствует нужный параметр и далее в цикле проверять, что в элементе результата содержится этот макет.
26. Олег Афанасьев (oafan) 21 26.07.13 10:59 Сейчас в теме
Замечу следующее: если требуется выводить итоги к группировки (в вашем случае направивший врач) - то разделитель некорректно выводится. Мои рекомендации - в макете, где выводятся итоги (в вашем случае итогов нет, но в это относится к параметру "РазрывСтраницы" см. рис) слово итоги сделать параметром, а параметр можно заполнять в параметрах макета.
Прикрепленные файлы:
27. Tuia f (zus) 32 18.08.13 20:10 Сейчас в теме
Гениально и просто! Спасибо за публикацию!
28. Александр Хомяк (logarifm) 967 08.07.14 18:04 Сейчас в теме
(17) Armando,

можно и так

Пока ЭлементРезультата <> Неопределено Цикл
		Если ЭлементРезультата.ЗначенияПараметров.Количество() = 1 Тогда
			Если ЭлементРезультата.ЗначенияПараметров[0].Значение = Истина Тогда
				ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
			КонецЕсли;
		Иначе
			ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
		КонецЕсли;
		ЭлементРезультата = ПроцессорКомпоновки.Следующий();
	КонецЦикла;


...Показать Скрыть
29. Igor Kostenko (kosmius) 7 12.12.14 15:12 Сейчас в теме
//аналогично настройкам масштаба «по ширине страницы»

МОжно подробней...? нету такого свойства у ТабДока.... и негде нету об этом ( как зделать чтобы при печати по умолчанию стояла "по ширине страницы"???
30. Петр Чечин (stoptime) 264 16.12.14 00:40 Сейчас в теме
(29) Тебе наверное здесь спрашивать нужно было http://infostart.ru/public/83627/ . Табличный документ имеет свойства АвтоМасштаб. А по ширине страницы это в настройках печати нужно смотреть. а не в свойствах элемента.(меню файл, параметры страницы)
31. victor andone (victory) 09.05.15 08:53 Сейчас в теме
Спасибо за статью!
Чтобы не терять расшифровки добавил бы:

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);
igor-tit; rendalina; steve77; +3 Ответить
32. Игорь Дзеса (Kamikadze) 44 10.08.15 09:37 Сейчас в теме
Спасибо за идею. С СКД в полной мере начинаю только работать. Механизм рабочий, даже скажу больше - делит на печатные страницы отлично.
igor-tit; +1 Ответить
33. Андрей Суворов (AndroidRu) 1 01.02.16 15:21 Сейчас в теме
34. sank84 (sank84) 03.10.16 08:30 Сейчас в теме
35. Петр Чечин (stoptime) 264 04.10.16 16:21 Сейчас в теме
удивляюсь что все еще актуально. :)
igor-tit; +1 Ответить
37. Igor Tit (igor-tit) 1 20.02.17 22:22 Сейчас в теме
(25) Имена Макетов в СКД "Макет1", "Макет2" и т.д. НЕ совпадут и похожими именами макетов при выводе. Порядковые номера макетов в СКД завися от порядка их создания, а номера макетов при выводе связаны с порядком Группировок в структуре отчета.
38. Igor Tit (igor-tit) 1 23.02.17 01:10 Сейчас в теме
Спасибо. Очень к стати публикация.
39. Наталья * (NatalyaVP) 15.05.17 08:56 Сейчас в теме
Здравствуйте.
Подскажите, а в какую часть модуля нужно вставить процедуру "ПриКомпоновкеРезультата"?
Я сделала всё как описано, но ничего не получилось, программа просто не заходит в процедуру "Процедура ПриКомпоновкеРезультата".
40. Сан Саныч (herfis) 107 15.05.17 09:41 Сейчас в теме
(39) Это событие объекта "Отчет". Соответственно - в модуль отчета (не формы).
41. Наталья * (NatalyaVP) 15.05.17 09:57 Сейчас в теме
Что значит "программно переопределив событие "ПриКомпоновкеРезультата""?
Как это сделать?
Я скопировала полностью процедуру "ПриКомпоновкеРезультата" , вставила её в модуль отчета, но программа туда не заходит.
Наверно, нужно что-то ещё написать. Подскажите, пожалуйста.
Спасибо.
42. Сан Саныч (herfis) 107 15.05.17 10:19 Сейчас в теме
(41)
1) Может и заходит. Если клиент-сервер, то без перевода сервера в отладочный режим серверный модуль отладить не получится
2) Да нет, копирования должно быть достаточно. Для переопределения события объекта (не формы) достаточно правильной сигнатуры процедуры.
Для очистки совести можете в конфигураторе в модуле нажать Ctrl+Alt+P. Если "ПриКомпоновкеРезультата" будет в угловых скобках в конце списка - значит, не переопределилась (ошибка в названии или списке параметров). Ну или удалить всю вашу писанину и выбрать событие в угловых скобках из списка процедур/событий. Тогда конфигуратор сам переопределит событие, а вы внутрь скопируете все остальное.
3) честно говоря, судя по уровню знаний, у вас в чем угодно может быть затык. В таких случаях бывает сложно удаленно диагностировать :)
43. Наталья * (NatalyaVP) 15.05.17 11:58 Сейчас в теме
Я делаю согласно написанной инструкции, значит этот метод не ко всем отчетам подходит, либо инструкция так написана.
Уровень знаний у меня нормальный, с скд только сейчас столкнулась.
44. Наталья * (NatalyaVP) 15.05.17 12:18 Сейчас в теме
(42), " в модуле нажать Ctrl+Alt+P. Если "ПриКомпоновкеРезультата"" - я так и делаю. Не заходит программа в процедуру "ПриКомпоновкеРезультата".
45. Виктория Дорохина (vikad) 15.05.17 12:21 Сейчас в теме
Оставьте свое сообщение