Создание внешней печатной формы без формирования табличного документа
Пытаюсь создать внешнюю печатную форму, на стандартных механизмах, но без формирования табличного документа, т.е. мне необходимо вывести некий шаблон в формате word сохраненный в макете обработки.
все в принципе отрабатывает, т.е. файл word формируется и открывается, но выходит сообщение:
{ОбщийМодуль.УправлениеПечатью.Модуль(1522)}: В обработчике печати не был сформирован табличный документ для: ПриемДМО
ВызватьИсключение(ТекстСообщенияОбОшибке);
ошибка выходит в Процедуре ПечатьПоВнешнемуИсточнику
если передать в модуле документа обработки в процедуру Печать() некий табличный документ, допустим пустой то он выводится дополнительно, а это какбы не нужно, хотя ошибкатоже не красиво.
никто не пытался сделать подобное.
немогу придумать как сие можно подобороть....
все в принципе отрабатывает, т.е. файл word формируется и открывается, но выходит сообщение:
{ОбщийМодуль.УправлениеПечатью.Модуль(1522)}: В обработчике печати не был сформирован табличный документ для: ПриемДМО
ВызватьИсключение(ТекстСообщенияОбОшибке);
ошибка выходит в Процедуре ПечатьПоВнешнемуИсточнику
если передать в модуле документа обработки в процедуру Печать() некий табличный документ, допустим пустой то он выводится дополнительно, а это какбы не нужно, хотя ошибкатоже не красиво.
никто не пытался сделать подобное.
немогу придумать как сие можно подобороть....
По теме из базы знаний
- Создание внешних печатных форм для 1С 8.1 на основе типовых. (Через подмену контекста).
- Создание внешних печатных форм под управляемым приложением с нуля
- Создание внешней печатной формы под УП с возможностью передачи параметров (для конфигураций на БСП)
- Корректная двусторонняя печать табличных документов + Простой пример создания внешней печатной формы
- Создание внешней печатной формы в формате документа Word
Найденные решения
В сведениях о внешней обработке:
Создаете форму, и печать из нее уже программируете. Пример модуля процедуры Печать в самой форме:
P.S. Для приведенного примера тип макета - двоичные данные.
НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
НоваяКоманда.Модификатор = "Печать";
Создаете форму, и печать из нее уже программируете. Пример модуля процедуры Печать в самой форме:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Объект.СсылкаНаОбъект = ОбъектыНазначения[0];
ДанныеДляЗаполнения = ПолучитьДанныеДляЗаполнения(Объект.СсылкаНаОбъект);
МакетФайл = ПолучитьМакет("Макет");
ИмяФ = ПолучитьИмяВременногоФайла("docx");
МакетФайл.Записать(ИмяФ);
MSWord = Новый COMОбъект("Word.Application");
Doc = MSWord.Documents.ADD(ИмяФ);
Попытка
Для каждого СтрСтруктуры Из ДанныеДляЗаполнения Цикл
СтрокаПоиска = "{" + СтрСтруктуры.Ключ + "}";
Replace = Doc.Content.Find;
FindText = СтрокаПоиска; // что искать - имя_шаблона
MatchCase = Ложь; // использовать регулярные выражения
MatchWholeWord = Истина; // искать слово целиком
MatchWildcards = Ложь; // испоьзовать регулярные выражения
MatchSoundsLike = Неопределено; // искать созвучные
MatchAllWordForms = Неопределено; // искать все формы слова
Forward = Истина; // искать вперед
Wrap = Неопределено; // что должен вернуть Find-объект
Format_ = Ложь; // использовать форматирование
ReplaceWith = СтрСтруктуры.Значение; // текст, на который надо заменить имя_шаблона
Попытка
Replace.Execute(
FindText,
MatchCase,
MatchWholeWord,
MatchWildcards,
MatchSoundsLike,
MatchAllWordForms,
Forward,
Wrap,
Format_,
ReplaceWith, 2);
Исключение
Сообщить("Ошибка при замене: " + СтрокаПоиска + " на " + СтрСтруктуры.Значение);
КонецПопытки;
КонецЦикла;
ТаблицаВорд = MSWord.ActiveDocument.Tables(3);
ЗаполнитьТаблицуДокумента(Объект.СсылкаНаОбъект);
Если НЕ Объект.ЕстьСкидка Тогда
ТаблицаВорд.Columns.Item(6).Delete();
ТаблицаВорд.Columns.Item(5).Delete();
ТаблицаВорд.Columns.Item(2).Width = 300;
КонецЕсли;
Строка = 2;
Для каждого СтрТовары Из Объект.ТаблицаДокумента Цикл
ТаблицаВорд.Rows.Add();
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 1).Range;
КолонкаТаблицы.Text = СтрТовары.НомСтр;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 2).Range;
КолонкаТаблицы.Text = СтрТовары.Номенклатура;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 3).Range;
КолонкаТаблицы.Text = СтрТовары.Количество;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 4).Range;
КолонкаТаблицы.Text = СтрТовары.Сумма;
Если Объект.ЕстьСкидка Тогда
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 5).Range;
КолонкаТаблицы.Text = СтрТовары.СуммаСкидки;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 6).Range;
КолонкаТаблицы.Text = СтрТовары.Итого;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 7).Range;
КолонкаТаблицы.Text = СтрТовары.ДатаКон;
Иначе
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 5).Range;
КолонкаТаблицы.Text = СтрТовары.ДатаКон;
КонецЕсли;
Строка = Строка + 1;
КонецЦикла;
// Вывод документа
MSWord.Application.Visible = 1;
MSWord.Activate();
//+чтобы документ Word открылся перед лицом пользователя, нужен такой лайфхак
MSWord.Application.WindowState = 2; //сворачиваем
MSWord.Application.WindowState = 1; //разворачиваем
Исключение
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;
КонецПроцедуры // Печать()
&НаСервере
Функция ПолучитьМакет(ИмяМакета)
Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
КонецФункции
ПоказатьP.S. Для приведенного примера тип макета - двоичные данные.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Если нужно вывести в Word, то я бы сделал через открытие формы.
В форме в таком случае доступен контекст вызова печатной формы:
В отладчике можно глянуть, чего еще в нее передается, там достаточно широкий набор данных
В форме в таком случае доступен контекст вызова печатной формы:
ИдентификаторКоманды = Параметры.ИдентификаторКоманды;
ДополнительнаяОбработкаСсылка = Параметры.ДополнительнаяОбработкаСсылка;
ОбъектыНазначения.ЗагрузитьЗначения(Параметры.ОбъектыНазначения);
В отладчике можно глянуть, чего еще в нее передается, там достаточно широкий набор данных
(5) Я привел пример процедуры ПриСозданииНаСервере(), в которой можно определить имя команды, ссылку на саму обработку как справочник, а также массив объектов печати. Помимо них есть и другие поля, состав навскидку не помню. В отладчике можно глянуть, чего система передает параметрами перед открытием формы.
Приложил пример печатной формы для БП 3.0, где две команды рисуют табличный документ (общепринятое поведение), а другие две - открывают формы и шаманят там.
Приложил пример печатной формы для БП 3.0, где две команды рисуют табличный документ (общепринятое поведение), а другие две - открывают формы и шаманят там.
Прикрепленные файлы:
БП_АктСписания.epf
(8)
да и именно так, спасибо.
вроде получается все по "Создаете форму, и печать из нее уже программируете"....
сейчас пробую...
А я понял так, что мешает штатная обработка табличного документа. Если он пустой, выдается окно ошибки, если нет - выводится табличный документ. А ни того, ни другого автору не требуется, нужно именно блокировать вывод
да и именно так, спасибо.
вроде получается все по "Создаете форму, и печать из нее уже программируете"....
сейчас пробую...
В сведениях о внешней обработке:
Создаете форму, и печать из нее уже программируете. Пример модуля процедуры Печать в самой форме:
P.S. Для приведенного примера тип макета - двоичные данные.
НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
НоваяКоманда.Модификатор = "Печать";
Создаете форму, и печать из нее уже программируете. Пример модуля процедуры Печать в самой форме:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Объект.СсылкаНаОбъект = ОбъектыНазначения[0];
ДанныеДляЗаполнения = ПолучитьДанныеДляЗаполнения(Объект.СсылкаНаОбъект);
МакетФайл = ПолучитьМакет("Макет");
ИмяФ = ПолучитьИмяВременногоФайла("docx");
МакетФайл.Записать(ИмяФ);
MSWord = Новый COMОбъект("Word.Application");
Doc = MSWord.Documents.ADD(ИмяФ);
Попытка
Для каждого СтрСтруктуры Из ДанныеДляЗаполнения Цикл
СтрокаПоиска = "{" + СтрСтруктуры.Ключ + "}";
Replace = Doc.Content.Find;
FindText = СтрокаПоиска; // что искать - имя_шаблона
MatchCase = Ложь; // использовать регулярные выражения
MatchWholeWord = Истина; // искать слово целиком
MatchWildcards = Ложь; // испоьзовать регулярные выражения
MatchSoundsLike = Неопределено; // искать созвучные
MatchAllWordForms = Неопределено; // искать все формы слова
Forward = Истина; // искать вперед
Wrap = Неопределено; // что должен вернуть Find-объект
Format_ = Ложь; // использовать форматирование
ReplaceWith = СтрСтруктуры.Значение; // текст, на который надо заменить имя_шаблона
Попытка
Replace.Execute(
FindText,
MatchCase,
MatchWholeWord,
MatchWildcards,
MatchSoundsLike,
MatchAllWordForms,
Forward,
Wrap,
Format_,
ReplaceWith, 2);
Исключение
Сообщить("Ошибка при замене: " + СтрокаПоиска + " на " + СтрСтруктуры.Значение);
КонецПопытки;
КонецЦикла;
ТаблицаВорд = MSWord.ActiveDocument.Tables(3);
ЗаполнитьТаблицуДокумента(Объект.СсылкаНаОбъект);
Если НЕ Объект.ЕстьСкидка Тогда
ТаблицаВорд.Columns.Item(6).Delete();
ТаблицаВорд.Columns.Item(5).Delete();
ТаблицаВорд.Columns.Item(2).Width = 300;
КонецЕсли;
Строка = 2;
Для каждого СтрТовары Из Объект.ТаблицаДокумента Цикл
ТаблицаВорд.Rows.Add();
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 1).Range;
КолонкаТаблицы.Text = СтрТовары.НомСтр;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 2).Range;
КолонкаТаблицы.Text = СтрТовары.Номенклатура;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 3).Range;
КолонкаТаблицы.Text = СтрТовары.Количество;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 4).Range;
КолонкаТаблицы.Text = СтрТовары.Сумма;
Если Объект.ЕстьСкидка Тогда
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 5).Range;
КолонкаТаблицы.Text = СтрТовары.СуммаСкидки;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 6).Range;
КолонкаТаблицы.Text = СтрТовары.Итого;
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 7).Range;
КолонкаТаблицы.Text = СтрТовары.ДатаКон;
Иначе
КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 5).Range;
КолонкаТаблицы.Text = СтрТовары.ДатаКон;
КонецЕсли;
Строка = Строка + 1;
КонецЦикла;
// Вывод документа
MSWord.Application.Visible = 1;
MSWord.Activate();
//+чтобы документ Word открылся перед лицом пользователя, нужен такой лайфхак
MSWord.Application.WindowState = 2; //сворачиваем
MSWord.Application.WindowState = 1; //разворачиваем
Исключение
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;
КонецПроцедуры // Печать()
&НаСервере
Функция ПолучитьМакет(ИмяМакета)
Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
КонецФункции
ПоказатьP.S. Для приведенного примера тип макета - двоичные данные.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот