Повторятьприпечатистроки в отчете 1с 8 примеры

Обновлено: 07.07.2024

Основная сложность при решении задачи состоит в определении области шапки отчета, которую нужно затем указать в свойстве табличного документа "ПовторятьПриПечатиСтроки".

Повторение шапки получается по следующему алгоритму:

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

2. При выводе отчета "по элементно" анализируем "Элементы вывода компоновки" и высоту табличного документа (Результата), откуда определяем первую и последнюю строчку "Шапки отчета".

3. ОбластьШапки = ТабличныйДокумент.Область(НачальнаяСтрокаШапки, , КонечнаяСтрокаШапки).

4. ТабличныйДокумент.ПовторятьПриПечатиСтроки = ОбластьШапки.

Ну, вот и все. Дело в шляпе.

Колонтитулы это просто.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Часто в печатных формах требуется вывести номер страницы над шапкой таблицы.
Андрей Андревич, есть ли способ доработать Ваш алгоритм в этом направлении? Спасибо, зачастую это крайне необходимо (особенно при массивных отчетах) Спасибо. Пока нет необходимости, но была ситуация, когда надо было. И пришлось играться гем. А что произойдет с областью шапки если пользователь изменит вариант отчета? И накидает вместо одной группировки 5, а еще к области шапки добавится вывод Параметров отчета и его отборы. Я не увидел решение этой задачи. (15) logarifm, хоть 5, хоть 10 группировок, область шапки отчета будет прочитана в любом случае, а иначе какой кайф от предложенного подхода. Отчет скачал и посмтрел все сделано грамотно. Просто в статье не указано всего. Старайтесь излагать все в статье. (16) logarifm, по-моему изложено все, что необходимо.
Не разобрана функция "ПолучитьМакетШапки", так отсылаю в код отчета, более того идея функции взята из типовых конфигураций. Не хочется в статье построчно код отчета комментировать. Проще открыть отчет в конфигураторе, посмотреть выполнение с помощью отладчика. Код прост, разобраться не сложно.
Можно конечно вдаться в разбор макета компоновки, но это тема для отдельной статьи. У кого не выводиться колонтитул, надо отрегулировать ширину поля
Результат.ПолеСверху = 20;

Я думал будет пример с управляемой формой.

В управляемой форме в процедуре ПриКомпоновкеРезультата не работает.

На управляемых формах тоже всё работает, нужно только слегка подпилить. Стоящая фича, спасибо, мне понравилось! Хм. недавно искала информацию по данной теме - и ничего не нашла. а ваша статья от 12 года!
Попробую применить.
Спасибо! Как вывести колонтитулы на Управляемых формах (БП 3.0)? Отчет сам запускается, а колонтитулов нет

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

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

КомпановщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

//фиксировать шапку можно только для ОДНОЙ таблицы или группировки

КоличествоТаблиц = 0;
ВысотаШапки = 0;
ВерхОбластиДанных = 1;

Для Каждого ЭлементТела из МакетКомпановки.Тело Цикл

Если ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных")
ИЛИ ТипЭлементаТела = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда//Тут надо уточнить что значат другие типы в теле макета

КоличествоТаблиц = КоличествоТаблиц + 1;
ИначеЕсли ТипЭлементаТела <> Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
КоличествоТаблиц = 99;
КонецЕсли;

Если КоличествоТаблиц > 1 Тогда
Прервать;
КонецЕсли;

Если ТипЭлементаТела = Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.Макет].Макет.Количество();
ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;
ИначеЕсли ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда
ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.МакетШапки].Макет.Количество();
ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;
КонецЕсли;

ДокументРезультат.ПовторятьПриПечатиСтроки = ДокументРезультат.Область(ВерхОбластиДанных - ВысотаШапки,,ВерхОбластиДанных-1,);

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

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

КомпановщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

//фиксировать шапку можно только для ОДНОЙ таблицы или группировки

КоличествоТаблиц = 0;
ВысотаШапки = 0;
ВерхОбластиДанных = 1;

Для Каждого ЭлементТела из МакетКомпановки.Тело Цикл

Если ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных")
ИЛИ ТипЭлементаТела = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда//Тут надо уточнить что значат другие типы в теле макета

КоличествоТаблиц = КоличествоТаблиц + 1;
ИначеЕсли ТипЭлементаТела <> Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
КоличествоТаблиц = 99;
КонецЕсли;

Если КоличествоТаблиц > 1 Тогда
Прервать;
КонецЕсли;

Если ТипЭлементаТела = Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.Макет].Макет.Количество();
ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;
ИначеЕсли ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда
ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.МакетШапки].Макет.Количество();
ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;
КонецЕсли;

ДокументРезультат.ПовторятьПриПечатиСтроки = ДокументРезультат.Область(ВерхОбластиДанных - ВысотаШапки,,ВерхОбластиДанных-1,);

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

Основная сложность при решении задачи состоит в определении области шапки отчета, которую нужно затем указать в свойстве табличного документа "ПовторятьПриПечатиСтроки".

Повторение шапки получается по следующему алгоритму:

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

2. При выводе отчета "по элементно" анализируем "Элементы вывода компоновки" и высоту табличного документа (Результата), откуда определяем первую и последнюю строчку "Шапки отчета".

3. ОбластьШапки = ТабличныйДокумент.Область(НачальнаяСтрокаШапки, , КонечнаяСтрокаШапки).

4. ТабличныйДокумент.ПовторятьПриПечатиСтроки = ОбластьШапки.

Ну, вот и все. Дело в шляпе.

Колонтитулы это просто.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Часто в печатных формах требуется вывести номер страницы над шапкой таблицы.
Андрей Андревич, есть ли способ доработать Ваш алгоритм в этом направлении? Спасибо, зачастую это крайне необходимо (особенно при массивных отчетах) Спасибо. Пока нет необходимости, но была ситуация, когда надо было. И пришлось играться гем. А что произойдет с областью шапки если пользователь изменит вариант отчета? И накидает вместо одной группировки 5, а еще к области шапки добавится вывод Параметров отчета и его отборы. Я не увидел решение этой задачи. (15) logarifm, хоть 5, хоть 10 группировок, область шапки отчета будет прочитана в любом случае, а иначе какой кайф от предложенного подхода. Отчет скачал и посмтрел все сделано грамотно. Просто в статье не указано всего. Старайтесь излагать все в статье. (16) logarifm, по-моему изложено все, что необходимо.
Не разобрана функция "ПолучитьМакетШапки", так отсылаю в код отчета, более того идея функции взята из типовых конфигураций. Не хочется в статье построчно код отчета комментировать. Проще открыть отчет в конфигураторе, посмотреть выполнение с помощью отладчика. Код прост, разобраться не сложно.
Можно конечно вдаться в разбор макета компоновки, но это тема для отдельной статьи. У кого не выводиться колонтитул, надо отрегулировать ширину поля
Результат.ПолеСверху = 20;

Я думал будет пример с управляемой формой.

В управляемой форме в процедуре ПриКомпоновкеРезультата не работает.

На управляемых формах тоже всё работает, нужно только слегка подпилить. Стоящая фича, спасибо, мне понравилось! Хм. недавно искала информацию по данной теме - и ничего не нашла. а ваша статья от 12 года!
Попробую применить.
Спасибо! Как вывести колонтитулы на Управляемых формах (БП 3.0)? Отчет сам запускается, а колонтитулов нет

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

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

КомпановщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

//фиксировать шапку можно только для ОДНОЙ таблицы или группировки

КоличествоТаблиц = 0;
ВысотаШапки = 0;
ВерхОбластиДанных = 1;

Для Каждого ЭлементТела из МакетКомпановки.Тело Цикл

Если ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных")
ИЛИ ТипЭлементаТела = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда//Тут надо уточнить что значат другие типы в теле макета

КоличествоТаблиц = КоличествоТаблиц + 1;
ИначеЕсли ТипЭлементаТела <> Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
КоличествоТаблиц = 99;
КонецЕсли;

Если КоличествоТаблиц > 1 Тогда
Прервать;
КонецЕсли;

Если ТипЭлементаТела = Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.Макет].Макет.Количество();
ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;
ИначеЕсли ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда
ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.МакетШапки].Макет.Количество();
ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;
КонецЕсли;

ДокументРезультат.ПовторятьПриПечатиСтроки = ДокументРезультат.Область(ВерхОбластиДанных - ВысотаШапки,,ВерхОбластиДанных-1,);

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

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

КомпановщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

//фиксировать шапку можно только для ОДНОЙ таблицы или группировки

КоличествоТаблиц = 0;
ВысотаШапки = 0;
ВерхОбластиДанных = 1;

Для Каждого ЭлементТела из МакетКомпановки.Тело Цикл

Если ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных")
ИЛИ ТипЭлементаТела = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда//Тут надо уточнить что значат другие типы в теле макета

КоличествоТаблиц = КоличествоТаблиц + 1;
ИначеЕсли ТипЭлементаТела <> Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
КоличествоТаблиц = 99;
КонецЕсли;

Если КоличествоТаблиц > 1 Тогда
Прервать;
КонецЕсли;

Если ТипЭлементаТела = Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.Макет].Макет.Количество();
ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;
ИначеЕсли ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда
ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.МакетШапки].Макет.Количество();
ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;
КонецЕсли;

ДокументРезультат.ПовторятьПриПечатиСтроки = ДокументРезультат.Область(ВерхОбластиДанных - ВысотаШапки,,ВерхОбластиДанных-1,);

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

В 1С Предприятии для представления табличной информации существует специальный вид файлов "Табличный документ". Файлы могут быть созданы в 1С Конфигураторе или в 1С Предприятии. Для создания новых файлов необходимо перейти в главном меню Файл->Новый. В языке программирования 1С существует одноименный объект ТабличныйДокумент, который позволяет программно создавать, сохранять и выводить табличные документы.

Область печати

В табличном документе может быть определена область печати. В этом свойстве можно указать ту область, которая будет напечатана на принтере. Такое может потребоваться если нужно распечатать часть документа. Это можно сделать двумя способами. Задать можно только одну область.

1. Через пользовательские настройки

Область печати может быть задана непосредственно через главное меню Таблица->Настройка печати->Задать область печати. Так же через главное меню можно удалить область печати Таблица->Настройка печати->Удалить область печати. Добавляемая и удаляемая области должны быть выделены.

На печать будет выведена 3 строка с 1 по 7 колонку. Остальные области будут проигнорированы.

2. Средствами встроенного языка

Другой вариант определить область печати - программный. Используя объект встроенного языка ТабличныйДокумент, можно задать какую область печатать. Для этого есть специальное свойство ОбластьПечати. В этом свойстве определяется ОбластьЯчеекТабличногоДокумента, которая будет печататься.

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

Повторяющаяся область печати

Табличный документ широко применяется при создании печатных форм. Довольно часто, при создании печатных форм может потребоваться повторять какую либо информацию вверху на каждой последующей странице. Например, это может быть шапка таблицы. Задать можно только одну область.

1. Через пользовательские настройки

Повторяющуюся область можно задать через главное меню Таблица->Настройки печати->Повторять на каждом листе. Для удаления области, в главном меню нужно выбрать Таблица->Настройки печати->Удалить повторение. Добавляемая и удаляемая области должны быть выделены.

На всех последующих страницах, вверху, будет повторяться вывод 3 строки. Остальные области будут выводиться как обычно.

2. Средствами встроенного языка

Для решения задачи вывода повторяющейся области, в объекте ТабличныйДокумент есть специальные свойства: ПовторятьПриПечатиСтроки и ПовторятьПриПечатиКолонки. Как видно из названия, в первом свойстве ПовторятьПриПечатиСтроки определяется область строк (тип: ОбластьЯчеекТабличногоДокумента, задается только номерами строк), а во втором ПовторятьПриПечатиКолонки задается область колонок (тип: ОбластьЯчеекТабличногоДокумента, задается только номерами колонок).

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

Комментарии (1)

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

Итак, что же понимается под постобработкой в СКД. Обычно (если не всегда) такое словосочетание применяется для отчетов, построенных на СКД. В результате выполнения отчета пользователем мы имеем какой-то табличный документ. Не всегда с помощью функционала СКД удается получить необходимую форму табличного документа. Поэтому после (пост) выполнения отчета, с помощью методов объекта ТабличныйДокумент выполняется некоторая доработка результата до приемлемого вида (формы).

Чтобы вклиниться в процесс формирования отчета вам необходимо программно получить результат отчета. Поэтому постобработка ВСЕГДА связана с программным формированием отчета. Можно конечно на форме сделать специальную кнопку, чтобы пользователь нажимал ее после формирования отчета, но это будет выглядеть нелепо. Поэтому будем считать, что для постработки отчет на 1С СКД формируется программно всегда.

Есть два способа как можно программно выполнить отчет на СКД:

  • Простой. Из формы отчета (нужно чтобы у отчета была форма) вызвать метод СкомпоноватьРезультат. Вы заменяете стандартную кнопку Сформировать собственной командой. В этой команде вызываете указанный выше метод, передав (в случае управляемой формы) режим компоновки – Непосредственно. Затем выполняете постобработку над полученным табличным документом (обычно это реквизит «Результат»). Метод неудобен тем, что нужно добавлять форму (если ее нет), нужно формировать отчет непосредственно, плюс довольно часто для доработки табличного документа нужно переходить на сервер (что не есть хорошо)
  • Чуть сложнее. В модуле отчета в предопределенной процедуре «ПриКомпоновкеРезультата» программно формируете отчет. Стандартный шаблон (код) для этого приведен ниже. После получения табличного документа вы выполняете свой код постобработки. Для этого подхода существует еще один вариант реализации, когда обработка выполняется не после формирования табличного документа, а в процессе. Делается это с помощью поэлементного вывода в табличный документ с помощью методов процессора компоновки данных – НачатьВывод, Следующий, ВывестиЭлемент.

С помощью этого шаблона вы можете программно формировать отчет на СКД:

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

Вывод картинок

До недавнего времени только с помощью постобработки в отчетах на СКД можно было вывести картинки в отчете. Начиная с релиза платформы 8.3.14 в СКД 1С:Предприятие 8 появилась возможность вывода картинок без постобработки.

Вот такой кусок кода в ПриКомпоновкеРезультата выводить после программного формирования картинку в колонке прайса:

Отчет прайс лист мы разбирали в нашем курсе по СКД

Нумерация колонок отчета

Здесь мы рассмотрим вариант постобработки из формы отчета

Повторение шапки отчета и вывод колонтитулов

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

Повторение шапки реализуется кодом:

Вывод колонтитулов реализуется через свойство ВерхнийКолонтитул табличного документа:

«Красивые» заголовки для группировок колонок таблицы

Вот так заголовки выводятся совсем некрасиво:


Вот так чуть лучше:


Настройка для такого варианта (для второй и третей группировок колонок):


И только постобработкой (хотя может быть есть какой-то другой секретный способ) можно сделать так:


Вставить разрыв страницы для группировки

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

Читайте также: