Здравствуйте! Помогите пожалуйста, мне требуется реализовать внешнюю печатную форму для документа "Командировка" ЗУП 3.1. Обработка мной сделана, но при попытке открыть появляется ошибка:

```1c
    {ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(247)}: В обработчике печати не был сформирован табличный документ для:
    ВызватьИсключение(ТекстСообщенияОбОшибке);
```

Прикладываю модуль обработки и сам файл обработки. Релиз ЗУП 3.1.1.103 платформа 8.3.9.1850

```1c
    Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    ПараметрыРегистрации.Вставить("Назначение", ПолучитьНазначениеОбработки());
    ПараметрыРегистрации.Вставить("Наименование", "Приказ На Служебную Поездку");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("Информация", "Приказ на служебную поездку (внешний)");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

    Команды = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(Команды, "Приказ на служебную поездку (внешний)",
    "ПриказНаСлужебнуюПоездку",
    "ВызовСерверногоМетода",
    Ложь,
    "ПечатьMXL");
    ПараметрыРегистрации.Вставить("Команды", Команды);
    Возврат ПараметрыРегистрации;
    КонецФункции

    Функция ПолучитьНазначениеОбработки()

    Массив= Новый Массив;
    Массив.Добавить("Документ.Командировка");
    Возврат Массив;

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

    Функция ПолучитьТаблицуКоманд()

    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;

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

    Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = ")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
    КонецПроцедуры

    Процедура Печать (МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;

    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПриказНаСлужебнуюПоездку") Тогда
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
    КоллекцияПечатныхФорм,
    "ПриказНаСлужебнуюПоездку",
    НСтр("ru = 'Приказ о направлении в командировку (Т-9)'"),
    ТабличныйДокументПриказОНаправленииСотрудникаВКомандировку(УправлениеПечатью.МакетПечатнойФормы("ПФ_MXL_Т9"), МассивОбъектов, ОбъектыПечати), ,
    "ПФ_MXL_Т9");
    КонецЕсли;

    КонецПроцедуры

    Функция ТабличныйДокументПриказОНаправленииСотрудникаВКомандировку(Макет, МассивОбъектов, ОбъектыПечати)

    НастройкиПечатныхФорм = ЗарплатаКадрыПовтИсп.НастройкиПечатныхФорм();

    ДокументРезультат = Новый ТабличныйДокумент;

    ДокументРезультат.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Командировка_Т9";
    ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
    ДокументРезультат.АвтоМасштаб = Истина;

    // получаем данные для печати
    ДанныеДляПечати = ДанныеДляПечатиКомандировки(МассивОбъектов).Выбрать();
    ПервыйДокумент = Истина;
    Пока ДанныеДляПечати.СледующийПоЗначениюПоля("Ссылка") Цикл

    Если ПервыйДокумент Тогда
    ПервыйДокумент = Ложь;
    Иначе
    // Все документы нужно выводить на разных страницах.
    ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
    КонецЕсли;

    // Запомним номер строки, с которой начали выводить текущий документ.
    НомерСтрокиНачало = ДокументРезультат.ВысотаТаблицы + 1;

    ОбластьМакетаПриказ = Макет.ПолучитьОбласть("Приказ");

    ОбластьМакетаПриказ.Параметры.Заполнить(ДанныеДляПечати);
    ОбластьМакетаПриказ.Параметры.Сотрудник = ДанныеДляПечати.ФИОПолные;

    ОбластьМакетаПриказ.Параметры.ТабельныйНомер = ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИзНомераОбъекта(ДанныеДляПечати.ТабельныйНомер, Истина, Истина);

    РезультатСклонения = ";
    Если ФизическиеЛицаЗарплатаКадры.Просклонять(Строка(ДанныеДляПечати.ФИОПолные), 4, РезультатСклонения, ДанныеДляПечати.Пол) Тогда
    ОбластьМакетаПриказ.Параметры.Сотрудник = РезультатСклонения
    КонецЕсли;

    ОбластьМакетаПриказ.Параметры.НомерДокумента = КадровыйУчетРасширенный.НомерКадровогоПриказа(ДанныеДляПечати.НомерДокумента);

    Если НастройкиПечатныхФорм.ВыводитьПолнуюИерархиюПодразделений И ЗначениеЗаполнено(ОбластьМакетаПриказ.Параметры.Подразделение) Тогда
    ОбластьМакетаПриказ.Параметры.Подразделение = ОбластьМакетаПриказ.Параметры.Подразделение.ПолноеНаименование();
    КонецЕсли;

    ДокументРезультат.Вывести(ОбластьМакетаПриказ);

    // В табличном документе необходимо задать имя области, в которую был
    // выведен объект. Нужно для возможности печати покомплектно.
    УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ДокументРезультат, НомерСтрокиНачало, ОбъектыПечати, ДанныеДляПечати.Ссылка);

    КонецЦикла;

    Возврат ДокументРезультат;

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

    Функция ДанныеДляПечатиКомандировки(МассивОбъектов)

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

    Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);

    Запрос.Текст =
    "ВЫБРАТЬ
    | Командировка.Ссылка КАК Ссылка,
    | Командировка.Сотрудник КАК Сотрудник,
    | Командировка.Организация КАК Организация,
    | Командировка.Дата КАК Дата,
    | Командировка.Дата КАК ДатаДокумента,
    | Командировка.Номер КАК НомерДокумента,
    | ВЫБОР
    | КОГДА Организации.НаименованиеПолное ПОДОБНО ""
    | ТОГДА Организации.Наименование
    | ИНАЧЕ Организации.НаименованиеПолное
    | КОНЕЦ КАК НазваниеОрганизации,
    | Организации.КодПоОКПО КАК КодПоОКПО,
    | Командировка.ДатаНачала КАК ДатаНачала,
    | Командировка.ДатаНачала КАК Период,
    | Командировка.ДатаОкончания КАК ДатаОкончания,
    | Командировка.МестоНазначения КАК МестоНазначения,
    | Командировка.ОрганизацияНазначения КАК ОрганизацияНазначения,
    | Командировка.Основание КАК Основание,
    | Командировка.Цель КАК Цель,
    | Командировка.ДнейВПути КАК ДнейВПути,
    | Командировка.Руководитель КАК Руководитель,
    | Командировка.ДолжностьРуководителя КАК ДолжностьРуководителя,
    | Командировка.КомандировкаЗаСчетСредств
    |ПОМЕСТИТЬ ВТДанныеДокумента
    |ИЗ
    | Документ.Командировка КАК Командировка
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации
    | ПО Командировка.Организация = Организации.Ссылка
    |ГДЕ
    | Командировка.Ссылка В(&МассивОбъектов)";

    Запрос.Выполнить();

    ЗарплатаКадры.СоздатьВТФИООтветственныхЛиц(Запрос.МенеджерВременныхТаблиц, Истина, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("Руководитель"), "ВТДанныеДокумента");

    ОписательВременныхТаблиц = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотруднико­в(
    Запрос.МенеджерВременныхТаблиц,
    "ВТДанныеДокумента");
    КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательВременныхТаблиц, Истина, "ФИОПолные,Подразделение,Должность,ТабельныйНомер,ДокументПредставление,Пол");

    Запрос.Текст =
    "ВЫБРАТЬ
    | Командировка.Ссылка КАК Ссылка,
    | Командировка.ДатаДокумента КАК ДатаДокумента,
    | Командировка.НомерДокумента КАК НомерДокумента,
    | Командировка.Сотрудник КАК Сотрудник,
    | Командировка.Организация КАК Организация,
    | Командировка.НазваниеОрганизации КАК НазваниеОрганизации,
    | Командировка.КодПоОКПО КАК КодПоОКПО,
    | Командировка.ДатаНачала КАК ДатаНачала,
    | Командировка.ДатаОкончания КАК ДатаОкончания,
    | Командировка.МестоНазначения КАК МестоНазначения,
    | РАЗНОСТЬДАТ(Командировка.ДатаНачала, Командировка.ДатаОкончания, ДЕНЬ) + 1 КАК Продолжительность,
    | РАЗНОСТЬДАТ(Командировка.ДатаНачала, Командировка.ДатаОкончания, ДЕНЬ) + 1 - Командировка.ДнейВПути КАК ПродолжительностьЧистая,
    | Командировка.ОрганизацияНазначения КАК ОрганизацияНазначения,
    | Командировка.Основание КАК Основание,
    | Командировка.КомандировкаЗаСчетСредств КАК КомандировкаЗаСчетСредств,
    | Командировка.Цель КАК Цель,
    | КадровыеДанныеСотрудников.ФИОПолные КАК ФИОПолные,
    | КадровыеДанныеСотрудников.ДокументПредставление КАК ДокументПредставление,
    | КадровыеДанныеСотрудников.Подразделение КАК Подразделение,
    | КадровыеДанныеСотрудников.Должность КАК Должность,
    | КадровыеДанныеСотрудников.ТабельныйНомер КАК ТабельныйНомер,
    | КадровыеДанныеСотрудников.Пол КАК Пол,
    | Командировка.ДолжностьРуководителя КАК ДолжностьРуководителя,
    | ФИООтветственныхЛиц.РасшифровкаПодписи КАК РуководительРасшифровкаПодписи
    |ИЗ
    | ВТДанныеДокумента КАК Командировка
    | ЛЕВОЕ СОЕДИНЕНИЕ ВТФИООтветственныхЛиц КАК ФИООтветственныхЛиц
    | ПО Командировка.Ссылка = ФИООтветственныхЛиц.Ссылка
    | И Командировка.Руководитель = ФИООтветственныхЛиц.ФизическоеЛицо
    | ЛЕВОЕ СОЕДИНЕНИЕ ВТКадровыеДанныеСотрудников КАК КадровыеДанныеСотрудников
    | ПО Командировка.Сотрудник = КадровыеДанныеСотрудников.Сотрудник
    | И Командировка.Период = КадровыеДанныеСотрудников.Период
    |
    |УПОРЯДОЧИТЬ ПО
    | Командировка.Ссылка";

    Возврат Запрос.Выполнить();

    КонецФункции
```
---
отставить...

```1c
    Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = ")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
    КонецПроцедуры
```

а где?

```1c
    НоваяКоманда.Идентификатор = Идентификатор;
```
---
Не видно где сформировалась коллекцияПечатныхФорм. Перед тем как проверить нужно ли печатать форму в коллукцию нужно поместить печатную форму что бы УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПриказНаСлужебнуюПоездку") вернула Истину, иначе печать пролетает с указанной вами ошибкой.
---
да, вы правы) сейчас у меня возникла проблема чтобы реализовать возможность отладки данной пф)
---
Массив лучше формировать тут же. Тогда работает.
---
спасибо, но к сожалению у меня та же ситуация...и та же самая ошибка, даже после загрузки вашей обработки.
---
Не вижу отличия от источника в прикрепленном файле. Можно показать с комментарием. В чем ошибка? Почему не выводит на печать?
---
Странно... У меня заработала...
---
я так понимаю вы убрали функцию с формированием массива?
---
Да. Массив тут же в процедуре объявил.
У Вас запрос пустой массив формирует. Когда ссылку ему на документ указываешь... Сейчас отвлекли меня, через полчасика - вернусь.
---
скорее всего в модуле менеджера документа "Командировка" не все функции для обеспечения внешних печатных форм прописаны.

Необходимо посмотреть в модуле менеджера другого документа методы поддержки печатных форм и скопировать в этот
---
сейчас гляну, спасибо.
---
и я лично и до меня в модуль менеджера никто не лазил, думаете есть возможность косяка в релизе? я открываю и формирую данную печатную форму через файл-открыть но если подключить обработку в самой 1с, то отображается ошибка, которую я описал выше.
---
не понял, не исправилось разве?
---
еще раз здравствуйте) через файл-открыть все шикарно, все работает и формируется без проблем но когда я хочу печатать из формы списка или формы документа, у меня ошибка, эта проблема идет у меня еще со вчера:

```1c
    {ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(247)}: В обработчике печати не был сформирован табличный документ для:
    ВызватьИсключение(ТекстСообщенияОбОшибке);
```
---
В обработчике печати не был сформирован табличный документ для:

вот эта пустота после для смущает, такое впечатление что он чего то не находит
---
я тоже заметил, попробую обновиться сейчас. вдруг будет результат.
---
Функция СведенияОВнешнейОбработке() Экспорт

здесь тоже сделай

ДобавитьКоманду(Команды, "Приказ на служебную поездку (внешний)",
        "ПФ_MXL_Т9",
       "ВызовСерверногоМетода",
       Ложь,
       "ПечатьMXL");
---
ничего не поменялось, тот же результат.
---
изменил внеш. печ. форму, сохранил, сделал загрузить в 1С заново, а ошибка та же выходит?
---
да, именно так.
---
для проверки что хоть что то выводится, добавь после строки

Пока ДанныеДляПечати.СледующийПоЗначениюПоля("Ссылка") Цикл

строку сообщалку

Сообщить(ДанныеДляПечати.Ссылка);
---
отставить...

```1c
    Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = ")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
    КонецПроцедуры
```

а где?

```1c
    НоваяКоманда.Идентификатор = Идентификатор;
```
---
это решило проблему, спасибо большое. Пока даже тяжело понимаю за что они отвечают, делал по шаблону, упустил "Идентификатор" видимо.
---
Идентификаторы нужны для вызова по расписанию. Как правило это актуально для обработок.

Но печать документов тоже можно выполнять по расписанию с отправкой по почте, причем вариантов вызова
и для регламентного задания, и для печати, и для открытия отчета(обработки) может быть несколько

тут отвлеченный пример из обработки в качестве примера:

```1c
    Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.0"); // Версия БСП

    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Наименование = "Json выгрузка";
    ПараметрыРегистрации.Версия = "20.04.2017";
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    ПараметрыРегистрации.Информация = "Json выгрузка";

    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = НСтр("ru = 'Json выгрузка по поступлению (регламентное задание)'");
    Команда.Идентификатор = "JsonВыгрузкаПоПоступлениюПоРасписанию"; // Срока, уникальная в пределах данной обработки
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    Команда.ПоказыватьОповещение = Ложь;

    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = НСтр("ru = 'Json выгрузка по реализации (регламентное задание)'");
    Команда.Идентификатор = "JsonВыгрузкаПоРеализацииПоРасписанию";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    Команда.ПоказыватьОповещение = Ложь;

    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = НСтр("ru = 'Json выгрузка по поступлению (ручной режим)'");
    Команда.Идентификатор = "JsonВыгрузкаПоПоступлениюФорма";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    Команда.ПоказыватьОповещение = Истина;

    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = НСтр("ru = 'Json выгрузка по реализации (ручной режим)'");
    Команда.Идентификатор = "JsonВыгрузкаПоРеализацииФорма";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    Команда.ПоказыватьОповещение = Истина;

    Возврат ПараметрыРегистрации;

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

    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт

    // Реализация логики команд вызова по расписанию
    Если ИдентификаторКоманды = "JsonВыгрузкаПоПоступлениюПоРасписанию" Тогда
    JsonВыгрузкаПоПоступлениюСформировать();

    ИначеЕсли ИдентификаторКоманды = "JsonВыгрузкаПоРеализацииПоРасписанию" Тогда
    JsonВыгрузкаПоРеализацииСформировать();

    КонецЕсли;

    КонецПроцедуры
```
---
спасибо, буду знать.