Групповая печать документов из динамического списка

Пример как можно реализовать групповую печать документов в 1с

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

Для примера возьмем список документов «Квитанции» (документ добавлен мной в конфигурацию Бухгалтерия 3.0). И выполним по порядку следующие действия:

  • получим ссылки на документы из списка (динамический список)
  • обратимся к функции модуля документа «Квитанция» для формировании ТабличногоДокумента (печатной формы)
  • сохраним ТабличныеДокументы в массиве
  • добавим диалоговое окно «ДаНет»
  • отправим массив ТабличныхДокументов на печать (без окна выбора принтера, сразу на печать принтера установленного в системе «по умолчанию»)

Добавим кнопку печати

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

&НаКлиенте
Процедура ПечатьВсе(Команда)
		
	Режим = РежимДиалогаВопрос.ДаНет;  //спрашиваем пользователя печатать или нет
	Ответ = Вопрос("Напечатать все квитанции?",Режим,0);
	Если Ответ = КодВозвратаДиалога.Да Тогда
		Массив = ПечатьВсеНаСервере();
		Для Каждого ЭлементМассива из Массив Цикл
		    ЭлементМассива.Напечатать();
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

В модуле объекта создадим экспортную функцию «Сформировать», которая возвращает ТабличныйДокумент:

Функция Сформировать(Услуга, Объект) Экспорт
	
	Услуга = ПолучитьУслугуПеревозка(Объект);
	ТабЗнач = Объект.ТабличнаяЧастьКвитанция.Выгрузить();
	ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.АвтоМасштаб			= Истина;
	ТабДокумент.ОриентацияСтраницы	= ОриентацияСтраницы.Портрет;
	
	Макет = ПолучитьМакет("МакетКвитанция");
	
	//Шапка
	ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка");
	ОбластьМакетаШапка.Параметры.Заголовок = "ТОВАРНО-ТРАНСПОРТНАЯ НАКЛАДНАЯ" + " № " + Объект.Номер + " от " + Формат(Объект.Дата, "ДФ=dd.MM.yyyy");
	ОбластьМакетаШапка.Параметры.ПунктОтправления = Объект.СтанцияОтправления;
	ОбластьМакетаШапка.Параметры.ПунктПрибытия = Объект.СтанцияПрибытия;
	ОбластьМакетаШапка.Параметры.НаименованиеОтправления = Объект.НаименованиеОтправления;
	
	СведенияОбОрганизации = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Объект.Организация, Объект.Дата);
	ОбластьМакетаШапка.Параметры.ПредставлениеИсполнителя = ПредставлениеКонтрагента(СведенияОбОрганизации);
	СведенияОКонтрагенте    = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Объект.Отправитель, Объект.Дата);
	ОбластьМакетаШапка.Параметры.ПредставлениеГрузоотправителя = ПредставлениеКонтрагента(СведенияОКонтрагенте);
	СведенияОКонтрагенте    = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Объект.Получатель, Объект.Дата);
	ОбластьМакетаШапка.Параметры.ПредставлениеГрузополучателя = ПредставлениеКонтрагента(СведенияОКонтрагенте);
	СведенияОКонтрагенте    = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Объект.Плательщик, Объект.Дата);
	ОбластьМакетаШапка.Параметры.ПредставлениеПлательщика = ПредставлениеКонтрагента(СведенияОКонтрагенте);

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

	//Подвал
	ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал");
	ОбластьМакетаПодвал.Параметры.Итого = Объект.Итого;
	ОбластьМакетаПодвал.Параметры.НДС = Объект.НДС;
	ОбластьМакетаПодвал.Параметры.СтрокаИтог = "Полная стоимость на сумму " + Объект.Итого + " " + Объект.ВалютаДокумента;
	ОбластьМакетаПодвал.Параметры.СуммаПрописью = ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью(Объект.Итого, Объект.ВалютаДокумента);
	ОбластьМакетаПодвал.Параметры.Принял = Строка(Объект.Принял) + " /               /";
	ОбластьМакетаПодвал.Параметры.Сдал = Строка(Объект.Сдал) + " /               /";
	ТабДокумент.Вывести(ОбластьМакетаПодвал);
	
	Возврат ТабДокумент;

КонецФункции

Функция ПредставлениеКонтрагента(СведенияОКонтрагенте) Экспорт
	
	Представление = СведенияОКонтрагенте.ПолноеНаименование + ", ИНН " + СведенияОКонтрагенте.ИНН + ", " + СведенияОКонтрагенте.ЮридическийАдрес + ", " + СведенияОКонтрагенте.Телефоны;
	Возврат Представление;
	
КонецФункции

Функция ПолучитьУслугуПеревозка(Объект) Экспорт
	
	//Получаем услугу из документа квитанция, которая входит в группу "Услуги перевозки" в справочнике "Номенклатура"
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ал_КвитанцияТабличнаяЧастьКвитанция.Ссылка,
		|	ал_КвитанцияТабличнаяЧастьКвитанция.НаименованиеУслуги,
		|	ал_КвитанцияТабличнаяЧастьКвитанция.Сумма
		|ИЗ
		|	Документ.ал_Квитанция.ТабличнаяЧастьКвитанция КАК ал_КвитанцияТабличнаяЧастьКвитанция
		|ГДЕ
		|	ал_КвитанцияТабличнаяЧастьКвитанция.Ссылка = &Ссылка
		|	И ал_КвитанцияТабличнаяЧастьКвитанция.НаименованиеУслуги В ИЕРАРХИИ(&Номенклатура)";
	Запрос.Параметры.Вставить("Ссылка", Объект.Ссылка);
	Запрос.Параметры.Вставить("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("00-00000025")); 
		
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Услуга = Выборка.НаименованиеУслуги;
	КонецЦикла;

	Возврат Услуга;
	
КонецФункции

Если нужен выбор принтера для печати то добавьте параметр Напечатать(РежимИспользованияДиалогаПечати.Использовать). В нашем примере это лучше не использовать, так как окно выбора принтера будет появляться столько раз сколько у нас документов.

У ТабличногоДокумента есть параметр «ИмяПринтера». Можно придумать окно выбора принтера перед печатью, а потом когда будет перебираться массив ТабличныхДокументов задавать принтер каждому.

Спасибо!

Теперь редакторы в курсе.