Как программно напечатать документы с внешней печатной формой?
Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
Только осваиваю БСП. Не могу найти точку "впиха".
Есть типовой документ Х. У него есть внешняя печатная форма (с правильной регистрацией "СведенияОВнешнейОбработке").
Есть обработка групповой печати, которая по нажатию на кнопочку должна список этих документов отправить на печать (на принтер сразу / на предпросмотр).
Пытался прикрутить "УправлениеПечатью.СформироватьПечатныеФормы", что-то не вышло.
Подскажите верный путь. Попутно можно отослать на годные статьи и процедурное описание БСП.
Есть типовой документ Х. У него есть внешняя печатная форма (с правильной регистрацией "СведенияОВнешнейОбработке").
Есть обработка групповой печати, которая по нажатию на кнопочку должна список этих документов отправить на печать (на принтер сразу / на предпросмотр).
Пытался прикрутить "УправлениеПечатью.СформироватьПечатныеФормы", что-то не вышло.
Подскажите верный путь. Попутно можно отослать на годные статьи и процедурное описание БСП.
Найденные решения
Процедура печати может выглядеть примерно так:
где Объект.ПечатнаяФормаСчет - реквизит обработки печати типа строка - куда нужно будет выбрать печатную форму, например заполнив список выбора для поля ввода формы можно создать в серверной процедуре, примерно такой:
МассивСчетов - массив документов, который нужно передать в процедуру печати.
Ничего не исправлял - это рабочие процедуры из реально использующейся обработки...думаю, для начального точка, будет достаточно?
&НаКлиенте
Процедура ПечатьСчета(МассивСчетов)
Если Не ЗначениеЗаполнено(Объект.ПечатнаяФормаСчет) Тогда
Предупреждение("Выберите печатную форму счета!!!");
КонецЕсли;
ПараметрыПечати = Новый Структура("ЗаголовокФормы", "Счет");
Если ТипЗнч(МассивСчетов) = Тип("Массив") Тогда
Иначе
МассивСчетов = Новый Массив;
ВыделенныеСтроки = Элементы.СписокДокументов.ВыделенныеСтроки;
Для Каждого стр Из ВыделенныеСтроки Цикл
ТекущаяСтрока = Элементы.СписокДокументов.ДанныеСтроки(стр);
Если ЗначениеЗаполнено(ТекущаяСтрока.Счет) Тогда
МассивСчетов.Добавить(ТекущаяСтрока.Счет);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если МассивСчетов.Количество() Тогда
СтрСпПечФормСчет = СоздатьСпиокЗначенийДляВыбора("СчетНаОплатуПокупателю", Истина, Объект.ПечатнаяФормаСчет);
Если ЗначениеЗаполнено(ТабПечФорм[0].ВариантЗапуска) Тогда
ПечатьВнешнейПечатнойФормы(МассивСчетов)
Иначе
//ПечатьВстроеннойФормы(МассивСчетов, ТабПечФорм[0].ИсточникКомандыПечати, ТабПечФорм[0].СпПечатныхФорм, ПараметрыПечати);
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
ТабПечФорм[0].МенеджерПечати,
ТабПечФорм[0].Идентификатор,
МассивСчетов,
Неопределено,
ПараметрыПечати
);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показатьгде Объект.ПечатнаяФормаСчет - реквизит обработки печати типа строка - куда нужно будет выбрать печатную форму, например заполнив список выбора для поля ввода формы можно создать в серверной процедуре, примерно такой:
Функция СоздатьСписок(ИдМетаданных, Док, ИмяКоманды, ТабПечФорм) Экспорт
Список = Новый СписокЗначений;
Если Не ИмяКоманды = "" Тогда
ТабПечФорм.Очистить();
КонецЕсли;
//Списки печатных форм документов
ДозаполнитьТабПечФорм = Ложь;
ЭтоНазначаемыеОбработки = Истина;
ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма;
ЭтоФормаОбъекта = Истина;
ИмяРаздела = "";
КомандыПечати = УправлениеПечатью.СоздатьКоллекциюКомандПечати();
Если Док Тогда
//ВрОбъект = Метаданные.Документы[ИдМетаданных];
//"Документ.АктСверкиВзаиморасчетов"
СписокКомандПечати = УправлениеПечатью.КомандыПечатиФормы("Документ."+ИдМетаданных+".Форма." + ?(ИдМетаданных = "РеализацияТоваровУслуг", "ФормаДокументаОбщая", "ФормаДокумента"));//.ОсновнаяФормаОбъекта);
Иначе
//ВрОбъект = Метаданные.Обработки[ИдМетаданных];
//СписокКомандПечати = ВрОбъект.Команды;//УправлениеПечатью.КомандыПечатиФормы("Обработка."+ИдМетаданных);//+".Форма.Форма");
Список.Добавить("Квитанция");
Возврат Список;
КонецЕсли;
Для Каждого стр Из СписокКомандПечати Цикл //ВрОбъект.Команды Цикл
Если стр.Представление = ИмяКоманды Тогда
НовСоотв = ТабПечФорм.Добавить();
ЗаполнитьЗначенияСвойств(НовСоотв, стр);
Если Не стр.Обработчик = "" Тогда //Печать встроенной формы, ничего больше не надо
Возврат Истина;
Иначе
ДозаполнитьТабПечФорм = Истина;
КонецЕсли;
Прервать;
КонецЕсли;
Список.Добавить(стр.Представление);//стр.Синоним);
КонецЦикла;
Если ДозаполнитьТабПечФорм Тогда
ЭтоНазначаемыеОбработки = Истина;
ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма;
Запрос = ДополнительныеОтчетыИОбработки.НовыйЗапросПоДоступнымКомандам(ВидОбработок, ?(Док, "Документ." + ИдМетаданных, "Обработка."+ИдМетаданных), ЭтоФормаОбъекта);
ДоступныеКоманды = Запрос.Выполнить().Выгрузить();
Отбор = Новый Структура();
Отбор.Вставить("Представление",ТабПечФорм[0].Представление);
Строки = ДоступныеКоманды.НайтиСтроки(Отбор);
Если Строки.Количество() > 0 Тогда
ЗаполнитьЗначенияСвойств(НовСоотв, Строки[0]);
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Список;
КонецФункции
ПоказатьМассивСчетов - массив документов, который нужно передать в процедуру печати.
Ничего не исправлял - это рабочие процедуры из реально использующейся обработки...думаю, для начального точка, будет достаточно?
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Процедура печати может выглядеть примерно так:
где Объект.ПечатнаяФормаСчет - реквизит обработки печати типа строка - куда нужно будет выбрать печатную форму, например заполнив список выбора для поля ввода формы можно создать в серверной процедуре, примерно такой:
МассивСчетов - массив документов, который нужно передать в процедуру печати.
Ничего не исправлял - это рабочие процедуры из реально использующейся обработки...думаю, для начального точка, будет достаточно?
&НаКлиенте
Процедура ПечатьСчета(МассивСчетов)
Если Не ЗначениеЗаполнено(Объект.ПечатнаяФормаСчет) Тогда
Предупреждение("Выберите печатную форму счета!!!");
КонецЕсли;
ПараметрыПечати = Новый Структура("ЗаголовокФормы", "Счет");
Если ТипЗнч(МассивСчетов) = Тип("Массив") Тогда
Иначе
МассивСчетов = Новый Массив;
ВыделенныеСтроки = Элементы.СписокДокументов.ВыделенныеСтроки;
Для Каждого стр Из ВыделенныеСтроки Цикл
ТекущаяСтрока = Элементы.СписокДокументов.ДанныеСтроки(стр);
Если ЗначениеЗаполнено(ТекущаяСтрока.Счет) Тогда
МассивСчетов.Добавить(ТекущаяСтрока.Счет);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если МассивСчетов.Количество() Тогда
СтрСпПечФормСчет = СоздатьСпиокЗначенийДляВыбора("СчетНаОплатуПокупателю", Истина, Объект.ПечатнаяФормаСчет);
Если ЗначениеЗаполнено(ТабПечФорм[0].ВариантЗапуска) Тогда
ПечатьВнешнейПечатнойФормы(МассивСчетов)
Иначе
//ПечатьВстроеннойФормы(МассивСчетов, ТабПечФорм[0].ИсточникКомандыПечати, ТабПечФорм[0].СпПечатныхФорм, ПараметрыПечати);
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
ТабПечФорм[0].МенеджерПечати,
ТабПечФорм[0].Идентификатор,
МассивСчетов,
Неопределено,
ПараметрыПечати
);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показатьгде Объект.ПечатнаяФормаСчет - реквизит обработки печати типа строка - куда нужно будет выбрать печатную форму, например заполнив список выбора для поля ввода формы можно создать в серверной процедуре, примерно такой:
Функция СоздатьСписок(ИдМетаданных, Док, ИмяКоманды, ТабПечФорм) Экспорт
Список = Новый СписокЗначений;
Если Не ИмяКоманды = "" Тогда
ТабПечФорм.Очистить();
КонецЕсли;
//Списки печатных форм документов
ДозаполнитьТабПечФорм = Ложь;
ЭтоНазначаемыеОбработки = Истина;
ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма;
ЭтоФормаОбъекта = Истина;
ИмяРаздела = "";
КомандыПечати = УправлениеПечатью.СоздатьКоллекциюКомандПечати();
Если Док Тогда
//ВрОбъект = Метаданные.Документы[ИдМетаданных];
//"Документ.АктСверкиВзаиморасчетов"
СписокКомандПечати = УправлениеПечатью.КомандыПечатиФормы("Документ."+ИдМетаданных+".Форма." + ?(ИдМетаданных = "РеализацияТоваровУслуг", "ФормаДокументаОбщая", "ФормаДокумента"));//.ОсновнаяФормаОбъекта);
Иначе
//ВрОбъект = Метаданные.Обработки[ИдМетаданных];
//СписокКомандПечати = ВрОбъект.Команды;//УправлениеПечатью.КомандыПечатиФормы("Обработка."+ИдМетаданных);//+".Форма.Форма");
Список.Добавить("Квитанция");
Возврат Список;
КонецЕсли;
Для Каждого стр Из СписокКомандПечати Цикл //ВрОбъект.Команды Цикл
Если стр.Представление = ИмяКоманды Тогда
НовСоотв = ТабПечФорм.Добавить();
ЗаполнитьЗначенияСвойств(НовСоотв, стр);
Если Не стр.Обработчик = "" Тогда //Печать встроенной формы, ничего больше не надо
Возврат Истина;
Иначе
ДозаполнитьТабПечФорм = Истина;
КонецЕсли;
Прервать;
КонецЕсли;
Список.Добавить(стр.Представление);//стр.Синоним);
КонецЦикла;
Если ДозаполнитьТабПечФорм Тогда
ЭтоНазначаемыеОбработки = Истина;
ВидОбработок = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма;
Запрос = ДополнительныеОтчетыИОбработки.НовыйЗапросПоДоступнымКомандам(ВидОбработок, ?(Док, "Документ." + ИдМетаданных, "Обработка."+ИдМетаданных), ЭтоФормаОбъекта);
ДоступныеКоманды = Запрос.Выполнить().Выгрузить();
Отбор = Новый Структура();
Отбор.Вставить("Представление",ТабПечФорм[0].Представление);
Строки = ДоступныеКоманды.НайтиСтроки(Отбор);
Если Строки.Количество() > 0 Тогда
ЗаполнитьЗначенияСвойств(НовСоотв, Строки[0]);
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Список;
КонецФункции
ПоказатьМассивСчетов - массив документов, который нужно передать в процедуру печати.
Ничего не исправлял - это рабочие процедуры из реально использующейся обработки...думаю, для начального точка, будет достаточно?
добавлю ещё пару процедур оттуда же:
&НаКлиенте
Процедура ДополнительныеОтчетыИОбработкиКлиент_ВыполнитьСерверныйМетод Обработки(
ВнешняяОбработка,
ВидОбработки,
ИдентификаторКоманды,
БезопасныйРежим,
ПоказыватьОповещение,
Модификатор,
ОбъектыНазначенияМассив)
Если ПоказыватьОповещение Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Обработка выполняется...'"));
КонецЕсли;
Если ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка()
ИЛИ ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет() Тогда
//ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим);
ВызовДопОтч(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим);
ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов() Тогда
ТипыСозданныхОбъектов = Новый Массив;
//ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ТипыСозданныхОбъектов);
ВызовДопОтч(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ТипыСозданныхОбъектов);
Для Каждого Тип Из ТипыСозданныхОбъектов Цикл
ОповеститьОбИзменении(Тип);
КонецЦикла;
ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма()
И Модификатор = "ПечатьMXL" Тогда
ПараметрыИсточника = Новый Структура;
ПараметрыИсточника.Вставить("ИдентификаторКоманды", ИдентификаторКоманды);
ПараметрыИсточника.Вставить("ОбъектыНазначения", ОбъектыНазначенияМассив);
ПараметрыИсточника.Вставить("БезопасныйРежим", БезопасныйРежим);
ПараметрыОткрытия = Новый Структура("ИсточникДанных,ПараметрыИсточника");
ПараметрыОткрытия.ИсточникДанных = ВнешняяОбработка;
ПараметрыОткрытия.ПараметрыИсточника = ПараметрыИсточника;
//ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия); //ninch 01.11.2011
// Получим ключ уникальности открываемой формы
ВрКлючУникальности = Строка(Новый УникальныйИдентификатор); //ninch 01.11.2011
ВрВладелецФормы = Неопределено; //ninch 01.11.2011
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ВрВладелецФормы, ВрКлючУникальности); //ninch 01.11.2011
ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта() Тогда
ИзмененныеОбъекты = Новый Массив;
//ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ИзмененныеОбъекты);
ВызовДопОтч(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ИзмененныеОбъекты);
Для Каждого Тип Из ИзмененныеОбъекты Цикл
ОповеститьОбИзменении(Тип);
КонецЦикла;
ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма()
ИЛИ ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет() Тогда
//ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив);
ВызовДопОтч(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив);
КонецЕсли;
Если ПоказыватьОповещение Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Обработка завершена...'"));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПечатьВнешнейПечатнойФормы(МассивОбъектовНазначения)
ДополнительныеОтчетыИОбработкиКлиент_ВыполнитьСерверныйМетод Обработки(
ТабПечФорм[0].Ссылка,
"ПечатнаяФорма",
ТабПечФорм[0].Идентификатор,
Истина,
ТабПечФорм[0].ПоказыватьОповещение,
ТабПечФорм[0].Модификатор,
МассивОбъектовНазначения);
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот