Разрыв страницы в СКД. Легко!

01.09.23

Разработка - СКД

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

Когда передо мной ставилась такая задача: - А можно, чтобы каждая таблица выводилась на отдельном листе? Конечно, можно. При этом я начинал вспоминать, где я это видел или уже делал, и интернет мне в помощь и пр. Все, что я находил в интернете, сводилось либо к созданию макета, либо  обрабатывать вывод процессора компоновки и в процессе вывода вставлять разделитель в нужных местах. Макет рисовать не хочется потому, что его придется переделывать под каждый отчет. Программный код, который я находил, считаю более громоздким. Но нашел вариант, как упростить программный код.

Итак, все, что нам нужно, это поймать начало группировки, которая должна быть выведена на новой странице. В моем случае я начало группировки определил отдельным полем "Заголовок" 


 

Просто добавил вычисляемое поле с определенным текстом - "Заголовок" - по этой фразе будем определять начало листа, поэтому можете придумать свою ключевую фразу.

Далее в настройках поставил это поле первым в своем отчете,  



Далее все-таки придется лезть в код, поскольку это поле надо найти и обработать. Но я это поле буду обрабатывать уже после вывода результата.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	ИтоговыеНастройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	//Можем редактировать настройки компоновки (ИтоговыеНастройки)
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ИтоговыеНастройки, ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);   
	
	//Можем редактировать табличный документ (ДокументРезультат)
	
	// Считываю параметры периода хотя это не обязательно	
	Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ПериодОтчета");
	Если Параметр <> Неопределено  Тогда
		Элемент = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Параметр.ИдентификаторПользовательскойНастройки);
		Если Элемент <> Неопределено И Элемент.Использование Тогда
			Дата1 = Элемент.Значение.ДатаНачала;
			Дата2 = Элемент.Значение.ДатаОкончания;
		КонецЕсли;
	КонецЕсли;
	
	ПОиск=ДокументРезультат.НайтиТекст("Заголовок",ДокументРезультат.Область(1,1),,,,Истина); 
	ПОка не ПОиск=Неопределено Цикл
		ПОиск.Текст="Лицевой счет сотрудника по начислению зарплаты и удержаниям за период "+ПредставлениеПериода(Дата1,Дата2,"ДЛФ=ДД"); 
		ДокументРезультат.Область("R"+Формат(ПОиск.Низ,"ЧГ=0")).НачалоСтраницы=Истина;   //Эта строка работает также как ВывестиГоризонтальныйРазделительСтраниц()
		ПОиск=ДокументРезультат.НайтиТекст("Заголовок",,,,,Истина);
	КонецЦикла;   
КонецПроцедуры

Суть следующая - первые несколько строк - это стандартный программный вывод отчета.

Далее в результате просто ищу свое ключевое слово "Заголовок", определяю, какая это строка (свойство поиск.низ) и указываю у этой области, что ДокументРезультат.Область("R"+Формат(ПОиск.Низ,"ЧГ=0")).НачалоСтраницы=Истина;. И в результате отчет выводится с разрывом в начале каждой группировки


  

 

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

В итоге минимальные правки в настройках и коде и прекрасный результат.

Тестировалось на платформе 8.3.19.

Надеюсь, кому-то поможет данное решение.

СКД разрыв страницы ВывестиГоризонтальныйРазделительСтраниц

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 руб.

02.09.2020    101893    564    385    

610

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    4092    10    kalyaka    4    

82

Гибкие отборы через СКД на управляемых формах. Демо-обработка

СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

07.06.2023    4614    26    quazare    7    

46

Вывод элементов иерархии верхнего уровня на СКД

СКД Платформа 1С v8.3 Абонемент ($m)

Как получить родителя первого уровня иерархического справочника с помощью СКД.

1 стартмани

06.06.2023    4255    echo77    6    

72

Обработка результатов запроса произвольными вычисляемыми полями. Обзор некоторых новых функций СКД

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

В данной статье вспомним, как обрабатывать результаты запроса в вычисляемых полях СКД, а также сделаем небольшой обзор на новые функции СКД платформы 8.3.20.

07.02.2023    5555    quazare    8    

38

Выборочная свертка группировок для СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Россия Абонемент ($m)

Методика разработки отчета на СКД с возможностью свёртки части группировок по заданному программно условию. - свертка по значению поля (неотрицательные - сворачиваются); - свертка подчиненных в иерархии с произвольным количеством уровней.

1 стартмани

16.01.2023    3454    schthaxe    5    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dhurricane 01.09.23 09:22 Сейчас в теме
Для обращения к области табличного документа не обязательно обращаться, используя адресацию вида "R10C2", преобразовывая при этом числа в строки. Можно проще:
ОднаЯчейка = ТабДокумент.Область(10, 2);
ДиапазонЯчеек = ТабДокумент.Область(10, 2, 12, 4);
СтрокаДокумента = ТабДокумент.Область(10, , 10, );
КолонкаДокумента = ТабДокумент.Область(, 2, , 2);
abasovit; sandr13; echo77; +3 Ответить
10. TMV 14 02.09.23 18:03 Сейчас в теме
(1) у автора это используется на две строки выше)
dhurricane; +1 Ответить
2. kser87 2403 01.09.23 11:21 Сейчас в теме
Можно без строчки кода сделать свой именнованный макет с разрывом страницы и выводить его
dabu-dabu; Fuego; sandr13; +3 Ответить
3. KVIKS 378 01.09.23 12:56 Сейчас в теме
(2)Как раз тут я и пишу, что не хочу делать макет
7. kser87 2403 01.09.23 16:21 Сейчас в теме
(3) интересно, почему
14. Torin57 7 08.09.23 09:12 Сейчас в теме
(7) Способ с программным кодом более очевиден для новичка. Поэтому я голосую за способ автора.
Допустим, пришел стажер. Ему дают мелкую работу. Переделай отчет на СКД. Нужно разрыв страницы перенести чуть пониже. Про процедуру ПриКомпоновкеРезультата новичок, скорей всего, знает и туда заглянет. А то что разрыв страницы спрятан где-то в макете может и не догадаться.
Плюс он зайдет в гугл и найдет статью автора.
Ну и самый главный аргумент это пост (8). Парень с рейтингом 1824, давно на инфостарте, с задачей сделать свой именованный макет с разрывом страницы не справился.
8. echo77 1846 01.09.23 18:54 Сейчас в теме
(2) Покажите, пожалуйста, как это сделать.
У меня не получилось https://youtu.be/lG-uwfBuMsc
4. ixijixi 1688 01.09.23 14:01 Сейчас в теме
Заголовок некорректный, СКД тут не причём. Обычная постобработка табличного документа.
0x00; TMV; sandr13; bulpi; echo77; kser87; starik-2005; +7 Ответить
6. KVIKS 378 01.09.23 15:51 Сейчас в теме
(4)Да, по факту это пост обработка. а статья называется именно так потому, что когда надо в отчет вставить разрыв страницы никто в поиске не будет писать пост обработка Табличного документа. Все ищут - как добавить разрыв страницы (разделитель страниц) в отчете на СКД. и тому подобное. И здесь представил свой вариант как решить эту проблему.
Pependos; mihuilka; _Sedoy; sandr13; +4 Ответить
9. starik-2005 2900 01.09.23 21:38 Сейчас в теме
(4) С одной стороны, автор прав, что никто не будет искать, как вставить разрыв, имея ввиду что-то другое. С другой стороны, народ вообще думать перестает. Есть кадры, которые по любому поводу гуглят или качают обработку, а потом обижаются, что это полуфабрикат, и им приходится тратить больше времени на доводку, чем на создание с нуля. Так вот и живут слесаря от 1С )))
mihuilka; sandr13; +2 Ответить
5. starik-2005 2900 01.09.23 15:14 Сейчас в теме
Все эти статьи сводятся к тому, как обработать результат после компоновки.
https://infostart.ru/1c/articles/1223500/
11. triviumfan 87 04.09.23 00:03 Сейчас в теме
Кликбейт?! Сколько уже тем было про постобработку...
Данное решение - типичный "костыль". Им можно воспользоваться, если заголовок или подвал подправить, но делить на страницы в цикле по поиску текста... Ну, камон!
Тут напрашивается детальный обход результата по группировкам - самый логичный и, вероятно, правильный метод с точки зрения алгоритмизации.
12. KVIKS 378 04.09.23 11:23 Сейчас в теме
(11)Пока 1С не придумают какой то встроенный механизм в СКД (типа свойство у группировки - разделитель или может вообще отдельный элемент), все методы можно считать "костылями", вопрос только в том, кому какой удобнее (макет, постобработка табдок, обход результата по группировкам и пр.)
Altez50; KrivobokVS; +2 Ответить
13. Danila-Master 116 05.09.23 12:44 Сейчас в теме
Очень интересный подход
15. user779438 02.11.23 04:13 Сейчас в теме
Вставлю и свои 5 копеек.
Есть способ который работает без дополнительных манипуляций с настройкой варианта, создания лишних макетов, полей расшифровки без отражения и постобработки табличного документа.
Для примера выведу справочник Проекты. В варианте единственная группировка Проект Иерархия. У группировки установлено имя "ИменованнаяГруппировка". Например ставим разрав страницы перед каждой иерархической папкой. Вся магия происходит во время компоновки результата.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ДокументРезультат.Очистить();
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	// Теперь проанализируем тело макета 
	// и найдем макет вывода иерархического элемента справочника.
	// У нужного макета обязательно будет переменная
	// с источником "Иерерхия", а не "НаборДанных1"
	ИскомыйМакет = "";
	Для Каждого Макет Из МакетКомпоновки.Макеты Цикл 
		Для Каждого Параметр Из Макет.Параметры Цикл 
			Если Тип(Параметр) = Тип("ПараметрОбластиВыражениеКомпоновкиДанных") 
				И СтрНайти(Параметр.Выражение, "ПроектИерархия") Тогда 
				ИскомыйМакет = Макет.Имя;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		Если Не ПустаяСтрока(ИскомыйМакет) Тогда 
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки, Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.НачатьВывод();
	Пока Истина Цикл 
		ЭлементРезультата = ПроцессорКомпоновки.Следующий();
		Если ЭлементРезультата = Неопределено Тогда 
			Прервать;
		КонецЕсли;
		
		Если ЭлементРезультата.Макет = ИскомыйМакет Тогда 
			ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		
		ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
		
	КонецЦикла;
	
	ПроцессорВывода.ЗакончитьВывод();
	
КонецПроцедуры
Показать
Общий смысл, думаю, понятен. Дальше дело вкусовщины.
Можно пойти дальше и повторить при печати шапку на всех документах не смотря на выведенный заголовок и наличие отборов и параметров
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ДокументРезультат.Очистить();
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	// Теперь проанализируем тело макета 
	// и найдем макет шапки списка
	// Он всегда идет перед первой группировкой списка
	ОписаниеМакетаШапки = Новый Структура("Имя,Высота", "", 0);
	Для Каждого ЭлементТелаМакета Из МакетКомпоновки.Тело Цикл 
		Если Тип(ЭлементТелаМакета) = Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда 
			ОписаниеМакетаШапки.Имя = ЭлементТелаМакета.Макет;
			ОписаниеМакетаШапки.Высота = МакетКомпоновки.Макеты[ЭлементТелаМакета.Макет].Макет.Количество();
		ИначеЕсли Тип(ЭлементТелаМакета) = Тип("ГруппировкаМакетаКомпоновкиДанных") 
			И ЭлементТелаМакета.Имя = "ИменованнаяГруппировка" Тогда 
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки, Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.НачатьВывод();
	Пока Истина Цикл 
		ЭлементРезультата = ПроцессорКомпоновки.Следующий();
		Если ЭлементРезультата = Неопределено Тогда 
			Прервать;
		КонецЕсли;
		
		ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
		
		Если ЭлементРезультата.Макет = ОписаниеМакетаШапки.Имя Тогда 
			// Когда встретили макет шапки
			// указали его для табличного документа 
			// как повторяющиеся при печати строки
			ДокументРезультат.ПовторятьПриПечатиСтроки = 
			ДокументРезультат.Область(
			ДокументРезультат.ВысотаТаблицы - ОписаниеМакетаШапки.Высота + 1,,
			ДокументРезультат.ВысотаТаблицы,);
		КонецЕсли;
		
	КонецЦикла;
	
	ПроцессорВывода.ЗакончитьВывод();
	
КонецПроцедуры
Показать
Почему 1С не дал нам нормальных возможностей анализировать макеты и тело макета компоновки для меня остается загадкой. приходится работать с тем, что есть и надеяться на светлое будущее.
Оставьте свое сообщение