В статье приведен пример как можно реализовать групповую печать документов в 1с.
Я уже рассказывал как можно получить таблицу документов из динамического списка, учитывая все фильтры и отборы. Теперь поговорим о групповой печати документов.
Для примера возьмем список документов «Квитанции» (документ добавлен мной в конфигурацию Бухгалтерия 3.0). И выполним по порядку следующие действия:
- получим ссылки на документы из списка (динамический список);
- обратимся к функции модуля документа «Квитанция» для формировании
ТабличногоДокумента
(печатной формы); - сохраним
ТабличныеДокументы
в массиве; - добавим диалоговое окно «ДаНет»;
- отправим массив
ТабличныхДокументов
на печать (без окна выбора принтера, сразу на печать принтера установленного в системе «по умолчанию»).
Добавим кнопку печати
&НаСервере
Функция ПечатьВсеНаСервере()
Массив = Новый Массив;
СтрокиКвитанция = ПолучитьСписок(); //получаем таблицу из динамического списка
Для Каждого Строки Из СтрокиКвитанция Цикл
Квитанция = Документы.ал_Квитанция.НайтиПоНомеру(Строки.Номер); //получаем ссылку по номеру
Если Квитанция.ПометкаУдаления = Ложь И Квитанция.Проведен = Истина Тогда
//добавляем в массив сформированный ТабличныйДокумент
Массив.Добавить(Квитанция.ПолучитьОбъект().Сформировать("Услуга", Квитанция.ПолучитьОбъект()));
КонецЕсли;
КонецЦикла;
Возврат Массив;
КонецФункции
&НаКлиенте
Процедура ПечатьВсе(Команда)
Режим = РежимДиалогаВопрос.ДаНет; //спрашиваем пользователя печатать или нет
Ответ = Вопрос("Напечатать все квитанции?",Режим,0);
Если Ответ = КодВозвратаДиалога.Да Тогда
Массив = ПечатьВсеНаСервере();
Для Каждого ЭлементМассива из Массив Цикл
ЭлементМассива.Напечатать();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Добавим функцию
В модуле объекта создадим экспортную функцию «Сформировать», которая возвращает ТабличныйДокумент
:
Функция Сформировать(Услуга, Объект) Экспорт
Услуга = ПолучитьУслугуПеревозка(Объект);
ТабЗнач = Объект.ТабличнаяЧастьКвитанция.Выгрузить();
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
Макет = ПолучитьМакет("МакетКвитанция");
//Шапка
ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьМакетаШапка.Параметры.Заголовок = "ТОВАРНО-ТРАНСПОРТНАЯ НАКЛАДНАЯ" + " № " + Объект.Номер + " от " + Формат(Объект.Дата, "ДФ=dd.MM.yyyy");
ОбластьМакетаШапка.Параметры.ПунктОтправления = Объект.СтанцияОтправления;
ОбластьМакетаШапка.Параметры.ПунктПрибытия = Объект.СтанцияПрибытия;
ОбластьМакетаШапка.Параметры.НаименованиеОтправления = Объект.НаименованиеОтправления;
СведенияОбОрганизации = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Объект.Организация, Объект.Дата);
ОбластьМакетаШапка.Параметры.ПредставлениеИсполнителя = ПредставлениеКонтрагента(СведенияОбОрганизации);
СведенияОКонтрагенте = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Объект.Отправитель, Объект.Дата);
ОбластьМакетаШапка.Параметры.ПредставлениеГрузоотправителя = ПредставлениеКонтрагента(СведенияОКонтрагенте);
СведенияОКонтрагенте = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Объект.Получатель, Объект.Дата);
ОбластьМакетаШапка.Параметры.ПредставлениеГрузополучателя = ПредставлениеКонтрагента(СведенияОКонтрагенте);
СведенияОКонтрагенте = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Объект.Плательщик, Объект.Дата);
ОбластьМакетаШапка.Параметры.ПредставлениеПлательщика = ПредставлениеКонтрагента(СведенияОКонтрагенте);
ТабДокумент.Вывести(ОбластьМакетаШапка);
//ЗаголовокТаб
ОбластьМакетаЗаголовокТаб = Макет.ПолучитьОбласть("ЗаголовокТаб");
ТабДокумент.Вывести(ОбластьМакетаЗаголовокТаб);
//Строка
ОбластьМакетаСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого Строки ИЗ ТабЗнач Цикл
ОбластьМакетаСтрока.Параметры.Номер = Строки.НомерСтроки;
ОбластьМакетаСтрока.Параметры.Услуга = Строки.НаименованиеУслуги;
Если Строки.НаименованиеУслуги = Услуга Тогда
ОбластьМакетаСтрока.Параметры.Мест = Объект.Мест;
ОбластьМакетаСтрока.Параметры.Вес = Объект.Вес;
ОбластьМакетаСтрока.Параметры.Объем = Объект.Объем;
Если Объект.Вес/Объект.Мест >= 210 Тогда
Расчет = Лев(Строка(Объект.РасчетныйПараметр),12) + "- Тяж";
Иначе
Расчет = Лев(Строка(Объект.РасчетныйПараметр),12);
КонецЕсли;
Если Объект.Новая = Ложь Тогда
ОбластьМакетаСтрока.Параметры.Рпарам = Объект.РасчетныйПараметр;
Иначе
ОбластьМакетаСтрока.Параметры.Рпарам = Расчет;
КонецЕсли;
Иначе
ОбластьМакетаСтрока.Параметры.Мест = "х";
ОбластьМакетаСтрока.Параметры.Вес = "х";
ОбластьМакетаСтрока.Параметры.Объем = "х";
ОбластьМакетаСтрока.Параметры.Рпарам = "х";
КонецЕсли;
ОбластьМакетаСтрока.Параметры.Сумма = Строки.Сумма;
ТабДокумент.Вывести(ОбластьМакетаСтрока);
КонецЦикла;
//Подвал
ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьМакетаПодвал.Параметры.Итого = Объект.Итого;
ОбластьМакетаПодвал.Параметры.НДС = Объект.НДС;
ОбластьМакетаПодвал.Параметры.СтрокаИтог = "Полная стоимость на сумму " + Объект.Итого + " " + Объект.ВалютаДокумента;
ОбластьМакетаПодвал.Параметры.СуммаПрописью = ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью(Объект.Итого, Объект.ВалютаДокумента);
ОбластьМакетаПодвал.Параметры.Принял = Строка(Объект.Принял) + " / /";
ОбластьМакетаПодвал.Параметры.Сдал = Строка(Объект.Сдал) + " / /";
ТабДокумент.Вывести(ОбластьМакетаПодвал);
Возврат ТабДокумент;
КонецФункции
Функция ПредставлениеКонтрагента(СведенияОКонтрагенте) Экспорт
Представление = СведенияОКонтрагенте.ПолноеНаименование + ", ИНН " + СведенияОКонтрагенте.ИНН + ", " + СведенияОКонтрагенте.ЮридическийАдрес + ", " + СведенияОКонтрагенте.Телефоны;
Возврат Представление;
КонецФункции
Функция ПолучитьУслугуПеревозка(Объект) Экспорт
//Получаем услугу из документа квитанция, которая входит в группу "Услуги перевозки" в справочнике "Номенклатура"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ал_КвитанцияТабличнаяЧастьКвитанция.Ссылка,
| ал_КвитанцияТабличнаяЧастьКвитанция.НаименованиеУслуги,
| ал_КвитанцияТабличнаяЧастьКвитанция.Сумма
|ИЗ
| Документ.ал_Квитанция.ТабличнаяЧастьКвитанция КАК ал_КвитанцияТабличнаяЧастьКвитанция
|ГДЕ
| ал_КвитанцияТабличнаяЧастьКвитанция.Ссылка = &Ссылка
| И ал_КвитанцияТабличнаяЧастьКвитанция.НаименованиеУслуги В ИЕРАРХИИ(&Номенклатура)";
Запрос.Параметры.Вставить("Ссылка", Объект.Ссылка);
Запрос.Параметры.Вставить("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("00-00000025"));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Услуга = Выборка.НаименованиеУслуги;
КонецЦикла;
Возврат Услуга;
КонецФункции
Если нужен выбор принтера для печати то добавьте параметр Напечатать(РежимИспользованияДиалогаПечати.Использовать)
. В нашем примере это лучше не использовать, так как окно выбора принтера будет появляться столько раз сколько у нас документов.
У ТабличногоДокумента
есть параметр ИмяПринтера
. Можно придумать окно выбора принтера перед печатью, а потом когда будет перебираться массив ТабличныхДокументов
задавать принтер каждому.