Использование отчета как печатной формы документа

20.02.21

Задачи пользователя - Адаптация типовых решений

Пользователь попросил создать новый отчёт, но чтобы была возможность его распечатать из документа (в таком случае отчёт должен формироваться по этому документу), плюс при печати из документа должен быть заголовок и подвал с подписями. Однако, вид у внешней обработки может быть либо "Дополнительный отчет", либо "Печатная форма" (может быть ещё "Отчет" - для документа, но это тоже "либо" и задача была использовать типовой механизм формирования печатных форм). Чтобы не делать, по сути, два одинаковых отчёта, напрашивается мысль создать отдельно отчёт и печатную форму, но печатная форма должна вызывать формирование отчёта. В данной публикации представлен один из способов такой реализации.

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

Предположим, что необходимо создать отчёт по заказам клиента для конфигурации "Управление торговлей 11". В отчёт выводится товар из заказа, заказанное количество, остаток по заказу и остаток на складе с группировкой по заказам. Дополнительно необходимо распечатывать отчёт непосредственно из документа "Заказ клиента". В таком случае отчёт должен формироваться только по этому заказу и должны присутствовать шапка и подвал с подписью ответственного.

Итак, приступим. Для начала разработаем сам отчёт.

Создадим новый отчет и добавим основную схему компоновки данных.

 

 

Добавим в наборы данных запрос с типом "запрос" ЗаказыКлиентов.

 

 

 
 Текст запроса ЗаказыКлиентов

Добавим ещё один набор данных с типом "запрос" ОстаткиТоваров.

 

 

 
 Текст запроса ОстаткиТоваров

Настроим связи наборов данных.

 

 

Определим ресурсы.

 

 

И настроим основной вариант отчёта.

 

 

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

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
	ПараметрыРегистрации.Наименование = НСтр("ru='Анализ заказов клиентов'");
	ПараметрыРегистрации.Информация = НСтр("ru='Анализ заказов клиентов'");
	ПараметрыРегистрации.Версия = "1.0";
	
	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Идентификатор = "АнализЗаказовКлиентов";
	Команда.Представление = НСтр("ru='Анализ заказов клиентов'");
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

Теперь можно добавить отчёт в список дополнительных отчётов и обработок, и пользователи могут им пользоваться.

 

 

Настало время добавить возможность печати отчета из документов "Заказ клиента" согласно поставленной задачи.

Для начала, создадим и настроим новый вариант отчета ПоЗаказуКлиента.

 

 

Для шапки и подвала зададим макет.

 

 

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

Создадим новую внешнюю обработку.

Для подключения обработки как дополнительной  в ИБ реализуем функцию СведенияОВнешнейОбработке.

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.Наименование = НСтр("ru='Анализ заказа клиента (печ. форма)'");
	ПараметрыРегистрации.Информация = НСтр("ru='Печатная форма ""Анализ заказа клиента""'");
	ПараметрыРегистрации.БезопасныйРежим = Ложь;
	ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказКлиента");

	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Идентификатор = "АнализЗаказаКлиента";
	Команда.Представление = НСтр("ru='Анализ заказа клиента'");
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
	Команда.Модификатор = "ПечатьMXL";
	Команда.ПоказыватьОповещение = Ложь;

	Возврат ПараметрыРегистрации;
	
КонецФункции

Добавим процедуру печати, которая будет вызывать функцию формирования печатной формы.

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "АнализЗаказаКлиента") Тогда
		
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
			КоллекцияПечатныхФорм,
			"АнализЗаказаКлиента",
			НСтр("ru='Анализ заказа клиента'"),
			ПечатьАнализЗаказаКлиента(МассивОбъектов, ОбъектыПечати));
		
	КонецЕсли; 

КонецПроцедуры

Теперь необходимо в функции печати ПечатьАнализЗаказаКлиента реализовать формирование отчета.

Для начала необходимо получить ссылку на дополнительный отчет АнализЗаказовКлиентов, добавленный в дополнительные отчеты и обработки.

Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
|	ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка,
|	ДополнительныеОтчетыИОбработки.Публикация КАК Публикация,
|	ДополнительныеОтчетыИОбработки.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
|	Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
|ГДЕ
|	ДополнительныеОтчетыИОбработки.ИмяОбъекта = ""АнализЗаказовКлиентов""");

РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
	ВызватьИсключение НСтр("ru='Отсутствует дополнительный отчет ""Анализ заказов клиентов"".'");
КонецЕсли; 
	
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();

Можно дополнительно проверить, чтобы отчёт был не помечен на удаление и опубликован.

Если Выборка.ПометкаУдаления Тогда
	ВызватьИсключение НСтр("ru='Дополнительный отчет ""Анализ заказов клиентов"" помечен на удаление.'");
ИначеЕсли Выборка.Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена Тогда
	ВызватьИсключение НСтр("ru='Публикация дополнительного отчета ""Анализ заказов клиентов"" отключена.'");
КонецЕсли; 

Подключим найденный отчёт для возможности его использования.

ИмяОтчета = ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Выборка.Ссылка);

Создадим объект отчета.

ОтчетОбъект = ВнешниеОтчеты.Создать(ИмяОтчета);

Загрузим настройки варианта отчета ПоЗаказуКлиента.

СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
ВариантОтчетаПоЗаказу = СхемаКомпоновкиДанных.ВариантыНастроек.ПоЗаказуКлиента;
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ВариантОтчетаПоЗаказу.Настройки);

Инициализируем табличный документ, в который будут выводиться результаты отчета.

ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_АнализЗаказаКлиента";
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабличныйДокумент.АвтоМасштаб = Истина;

Осталось пройти по массиву документов (пользователь может выбрать несколько документов в списке) и по каждому сформировать отчёт с выводом в табличный документ.

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

Задача решена.

Далее всё стандартно. Пользователь может распечатать отчёт из формы документа.

 

 

Или из формы списка, выбрав несколько документов.

 

 

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

 
 Полный код модуля обработки печатной формы

См. также

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

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    5139    11    5    

20

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3520    8    0    

27

Адаптация типовых решений Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    4713    dimanich70    15    

20

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    3562    dimanich70    8    

16

Адаптация типовых решений Программист Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

27.10.2023    2775    21    avmartynov    14    

53

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2850    43    progmaster    8    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sys1c 20.02.21 08:28 Сейчас в теме

а почему не
ЗаказКлиентаТовары.Ссылка.Дата Между &НачалоПериода И &КонецПериода
3. ltfriend 969 20.02.21 09:01 Сейчас в теме
(1) Чтобы параметры "НачалоПериода" и "КонецПериода" были необязательными.
2. rpgshnik 3746 20.02.21 08:40 Сейчас в теме
Я более лениво делал черновые печатные формы с помощью макета - https://infostart.ru/public/1021869/ и https://infostart.ru/1c/articles/872573/ :)
4. ltfriend 969 20.02.21 09:03 Сейчас в теме
(2) Тут смысл в том, чтобы один и тот же отчёт можно было использовать, собственно, как отчёт и как печатную форму конкретного документа и при этом избежать дублирование кода (т.е. не реализовывать два раза как отчет и как печатную форму).
5. PerlAmutor 130 27.02.21 06:30 Сейчас в теме
Из-за того, что разработчики БСП вяло развивают механизм дополнительных отчетов и обработок приходится такое реализовывать.
У меня есть 2 обработки, которые работают в цепочке. Одна обработка с видом Заполнение объекта, а другая просто как обработка в котором есть еще и регламентное задание до кучи, помимо команд с открытием форм. Первая вызывает вторую, т.к. вторая не умеет быть первой, но
без труда справляется с заполнением объекта и еще на машинке шить умеет...

По-моему надо уже уходить от ВидовОбработки и привязывать виды к конкретным Командам. Чтобы обработки могли быть универсальными.
6. user603532_fan_club_chelsea 01.03.21 16:31 Сейчас в теме
Реализация интересная... а вот подход к работе с клиентом не очень... я бы убедил клиента херней не страдать и сделать в отчете все. Просто добавив сноску с реквизитами для печати... как наподобие типовых отчетов... выводить подписи или нет... ну и собственно заполнял из документа...
Оставьте свое сообщение