Столкнувшись с достаточно типовой проблемой при разработке отчетов на системе компоновки данных(СКД), вставка разрыва страницы после в конце группировки, на форумах и в документации не нашел простого решения этой задачи. Пост-обработкой табличного документа заниматься не хотелось, хотя совсем этого избежать пока не удалось 🙂 , поэтому было найдено не сложное решение которым я хочу с вами поделиться.
Отчет будем формировать программно переопределив событие «ПриКомпоновкеРезультата»
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка=ЛОжь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.НачатьВывод();
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Пока ЭлементРезультата <> Неопределено Цикл
Если ЭлементРезультата.ЗначенияПараметров.Количество()=1 Тогда
Если ЭлементРезультата.ЗначенияПараметров[0].Значение = «Разорвать» Тогда
ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
Как вы видите здесь все шаблонно, весь фокус находится в анализе ЭлементРезультата, в нем нужно определить когда собсвенно резать. Как я это решил для себя:
В СКД был добавлен Параметр РазрывСтраницы с типом строка и заданным значением «Разорвать»
В моей задачи мне нужно было выводить показатели списка врачей, при этом каждый врач должен был печататься на своем листе. В настройках отчета я сделал именованную группировку:
В настройка этой группировки я убрал Авто поля и вставил свой парметр РазрывСтраницы.
Далее для этой группировки сделал свой макет:
Чтобы сделать группировку не видимой я в настройках, для этой группировки установил условное оформление: цвета текста, фона, линий — белые.
На закладке Другие настройки установил: Тип макета — вертикально, Выводить отбор — не выводить.
Для чего все это было сделано, напомню кусочек кода:
Если ЭлементРезультата.ЗначенияПараметров.Количество()=1 Тогда
Если ЭлементРезультата.ЗначенияПараметров[0].Значение = «Разорвать» Тогда
ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
КонецЕсли;
Для группировки ГруппировкаРазрыв у нас количество в коллекции ЗначенияПараметров будет равно 1. Всегда будет 1 параметр и его значение будет всегда равно нашей строке «Разорвать» Благодаря этому и появляется выловить его при обходе результата. В пост обработки табличного документа придется удалить 2 последние строки, иначе у нас будет печататься пустая страница.
С уважение Петр Юрьевич Чечин




Столкнувшись с достаточно типовой проблемой при разработке отчетов на системе компоновки данных(СКД), вставка разрыва страницы в конце группировки, на форумах и в документации не нашел простого решения этой задачи. Пост-обработкой табличного документа заниматься не хотелось, хотя совсем этого избежать пока не удалось 🙂 , поэтому было найдено не сложное решение которым я хочу с вами поделиться.
Перейти к публикации
Спасибо за хорошую публикацию, но почему-то, как ни старался, не могу посмотреть картинки к ней. Вместо них — лишь рамка с красным крестиком
Не знаю , почему у тебя проблеммы с картинками у меня отображаются нормально.
stoptime, как раз искал решение такой задачи месяц назад. В итоге решил тупо пост-обработкой(. Ваш вариант интереснее!
Да я тоже раньше постобработкой справлялся, просто нужно было сделать серию отчетов, и не все достаточно простые, для разбора потом табличного документа. Вот и придумал этот фокус. Нужда заставляет нас творить чудеса
1С расчетные листки в ЗУПе постобработкой режет
А если в СКД в макете создать макет заголовка группировки для врачей, создать именную область макета в свойствах которой в группе Параграф указать «Начало страницы» ???
(6) Saipl, Пробовал. вставлять разрыв страницы в макете, настраивать параграф. Убирамть макет оформления. в нем кстате нельзя настроить Параграф. Вобщем я досточно пошарился по всему механизму работы с макетами. Все пробовал на платформе 8.2.13, надо будет посмотреть может в следующих они испавят это поведение
Все это здорово напоминает удаление гланд через задний проход. Виртуозно, да. А через рот не пробовали? ( в смысле, обязательно КАЖДЫЙ отчет делать в СКД? Это религия такая?)
Гениально просто. Это зачёт.
Тоже думал над этой проблемой в СКД. Попробую такой вариант.
(10) Если получится что то добавить к придумке, сообщи. Статью расширим
Спасибо!!! хоть появился еще один вариант, кроме постобработки.
Гениально. Спасибо
Присоединяюсь к плюсующим. Спасибо за идею.
Большое спасибо, вы очень помогли
спасибо за идею, воспользовался!
Спасибо
Что бы группировка-пустышка не выводилась я дописал чуть-чуть:
Все гениальное просто! Это надо взять на вооружение
Спасибо, отличная идея!
Но в конце поста левая картинка с правилами обмена данными, или они сюда каким-то боком относятся.
(19) Это я на редактировал. правил 2 статьи сразу.
Голь на выдумки хитра) Автору большое спасибо!
Т.е. снова «пустышку» выводим?
Ничего в 1С не меняется… 🙁
Спасибо за классную идею! буду пробовать ее реализовать
Как уже было сказано выше, группировку-пустышку можно просто не выводить при поэлементном выводе отчета.
Это сразу несколько плюшек дает:
1) не выводится лишняя строка
2) отпадает необходимость настраивать оформление группировки-пустышки, обеспечивая её условную невидимость
3) а самое вкусное — не надо удалять строки с «хвостовым» разрывом строки. Т.к. после последнего разрыва теперь нет данных для вывода, то пустой лист не выгоняется.
Спасибо за идею.
Можно перед выводом элементов, найти в схеме компоновки данных макет, в котором присутствует нужный параметр и далее в цикле проверять, что в элементе результата содержится этот макет.
Замечу следующее: если требуется выводить итоги к группировки (в вашем случае направивший врач) — то разделитель некорректно выводится. Мои рекомендации — в макете, где выводятся итоги (в вашем случае итогов нет, но в это относится к параметру «РазрывСтраницы» см. рис) слово итоги сделать параметром, а параметр можно заполнять в параметрах макета.
Гениально и просто! Спасибо за публикацию!
(17) Armando,
можно и так
Показать
МОжно подробней…? нету такого свойства у ТабДока…. и негде нету об этом ( как зделать чтобы при печати по умолчанию стояла «по ширине страницы»???
(29) Тебе наверное здесь спрашивать нужно было . Табличный документ имеет свойства АвтоМасштаб. А по ширине страницы это в настройках печати нужно смотреть. а не в свойствах элемента.(меню файл, параметры страницы)
Спасибо за статью!
Чтобы не терять расшифровки добавил бы:
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);
Спасибо за идею. С СКД в полной мере начинаю только работать. Механизм рабочий, даже скажу больше — делит на печатные страницы отлично.
Хорошее решение.
Спасибо!
удивляюсь что все еще актуально. 🙂
(25) Имена Макетов в СКД «Макет1», «Макет2» и т.д. НЕ совпадут и похожими именами макетов при выводе. Порядковые номера макетов в СКД завися от порядка их создания, а номера макетов при выводе связаны с порядком Группировок в структуре отчета.
Спасибо. Очень к стати публикация.
Здравствуйте.
Подскажите, а в какую часть модуля нужно вставить процедуру «ПриКомпоновкеРезультата»?
Я сделала всё как описано, но ничего не получилось, программа просто не заходит в процедуру «Процедура ПриКомпоновкеРезультата».
(39) Это событие объекта «Отчет». Соответственно — в модуль отчета (не формы).
Что значит «программно переопределив событие «ПриКомпоновкеРезультата»»?
Как это сделать?
Я скопировала полностью процедуру «ПриКомпоновкеРезультата» , вставила её в модуль отчета, но программа туда не заходит.
Наверно, нужно что-то ещё написать. Подскажите, пожалуйста.
Спасибо.
(41)
1) Может и заходит. Если клиент-сервер, то без перевода сервера в отладочный режим серверный модуль отладить не получится
2) Да нет, копирования должно быть достаточно. Для переопределения события объекта (не формы) достаточно правильной сигнатуры процедуры.
Для очистки совести можете в конфигураторе в модуле нажать Ctrl+Alt+P. Если «ПриКомпоновкеРезультата» будет в угловых скобках в конце списка — значит, не переопределилась (ошибка в названии или списке параметров). Ну или удалить всю вашу писанину и выбрать событие в угловых скобках из списка процедур/событий. Тогда конфигуратор сам переопределит событие, а вы внутрь скопируете все остальное.
3) честно говоря, судя по уровню знаний, у вас в чем угодно может быть затык. В таких случаях бывает сложно удаленно диагностировать 🙂
Я делаю согласно написанной инструкции, значит этот метод не ко всем отчетам подходит, либо инструкция так написана.
Уровень знаний у меня нормальный, с скд только сейчас столкнулась.
(42), » в модуле нажать Ctrl+Alt+P. Если «ПриКомпоновкеРезультата»» — я так и делаю. Не заходит программа в процедуру «ПриКомпоновкеРезультата».
(44)
Большое спасибо за статью!
Выручила!
сама не пробовала, но подумалось, чтобы не устанавливать цвет белый, может быть можно сделать пустым значение поля?
вот так:
ЭлементРезультата.ЗначенияПараметров[0].Значение = «»;
или так нельзя изменять?
(46) Читай комментарии. Смотри (17), (24), (28)
Я делал так:
Показать
(47) Спасибо!
Разрыв страницы работает только, если отчет «нарисован» в макете?
В таблице разделитель страниц не работает, но зато правильно расставляет параметр в группировке.
Спасибо!
каряво работает, пол документа выводит разрыв другую половину нет
(52) Отчет можно посмотреть?
(53)
либо я запутался
либо отчет криво написал
пытался вместо параметра сделать через вычисляемое поле, результат тот же
(54)Или закомментируйте Э
Показать
(55)
Спасибо что откликнулись!
уже разобрался
проблема была в моей невнимательности
просто не указал
в начале процедуры вывода
Если нельзя вклиниться в типовой вывод, можно использовать еще один велосипед в дополнение к статье:
Показать
P.S: это пример деления на 2 части, можно переделать под массив