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

01.09.23

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

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

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

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


 

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

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



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

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

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

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


  

 

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

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

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

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

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

См. также

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

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

10000 руб.

02.09.2020    140083    769    391    

801

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    5127    implecs_team    6    

43

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    5526    43    obmailok    21    

78

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

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2564    2    Yashazz    0    

33

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

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    9420    21    John_d    25    

124

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

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

05.12.2023    6167    PROSTO-1C    13    

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