Пытаюсь создать внешнюю печатную форму, на стандартных механизмах, но без формирования табличного документа, т.е. мне необходимо вывести некий шаблон в формате word сохраненный в макете обработки.
все в принципе отрабатывает, т.е. файл word формируется и открывается, но выходит сообщение:
{ОбщийМодуль.УправлениеПечатью.Модуль(1522)}: В обработчике печати не был сформирован табличный документ для: ПриемДМО
   ВызватьИсключение(ТекстСообщенияОбОшибке);
ошибка выходит в Процедуре ПечатьПоВнешнемуИсточнику

если передать в модуле документа обработки в процедуру Печать() некий табличный документ, допустим пустой то он выводится дополнительно, а это какбы не нужно, хотя ошибкатоже не красиво.

никто не пытался сделать подобное.
немогу придумать как сие можно подобороть....
---
В сведениях о внешней обработке:

```1c
    НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
    НоваяКоманда.Модификатор = "Печать";
```

Создаете форму, и печать из нее уже программируете. Пример модуля процедуры Печать в самой форме:

```1c
    &НаКлиенте
    Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт

    Объект.СсылкаНаОбъект = ОбъектыНазначения[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, то я бы сделал через открытие формы.

В форме в таком случае доступен контекст вызова печатной формы:

```1c
    ИдентификаторКоманды = Параметры.ИдентификаторКоманды;
    ДополнительнаяОбработкаСсылка = Параметры.ДополнительнаяОбработкаСсылка;
    ОбъектыНазначения.ЗагрузитьЗначения(Параметры.ОбъектыНазначения);
```

В отладчике можно глянуть, чего еще в нее передается, там достаточно широкий набор данных
---
-
---
В отладчике можно глянуть, чего еще в нее передается, там достаточно широкий набор данных
тут совсем не понятно

(4) Создаете форму, и печать из нее уже программируете
а так попробую спасибо!
---
Я привел пример процедуры ПриСозданииНаСервере(), в которой можно определить имя команды, ссылку на саму обработку как справочник, а также массив объектов печати. Помимо них есть и другие поля, состав навскидку не помню. В отладчике можно глянуть, чего система передает параметрами перед открытием формы.

Приложил пример печатной формы для БП 3.0, где две команды рисуют табличный документ (общепринятое поведение), а другие две - открывают формы и шаманят там.
---
у автора сложность именно с макетом MS Word насколько я понял
---
А я понял так, что мешает штатная обработка табличного документа. Если он пустой, выдается окно ошибки, если нет - выводится табличный документ. А ни того, ни другого автору не требуется, нужно именно блокировать вывод
---
А я понял так, что мешает штатная обработка табличного документа. Если он пустой, выдается окно ошибки, если нет - выводится табличный документ. А ни того, ни другого автору не требуется, нужно именно блокировать вывод
да и именно так, спасибо.

вроде получается все по "Создаете форму, и печать из нее уже программируете"....
сейчас пробую...
---
В сведениях о внешней обработке:

```1c
    НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
    НоваяКоманда.Модификатор = "Печать";
```

Создаете форму, и печать из нее уже программируете. Пример модуля процедуры Печать в самой форме:

```1c
    &НаКлиенте
    Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт

    Объект.СсылкаНаОбъект = ОбъектыНазначения[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. Для приведенного примера тип макета - двоичные данные.
---
всем спасибо за оперативные ответы. все получилось.
причем так как все формируется в модуле формы, и отлаживать все можнокак обычную обработку.