Всем привет. Опыт программирования небольшой. Прошу помощи...
Сделал внешнюю печ. форму счета.
Если запустить ее как внешнюю обработку - все печатается и из документа "счет" и из документа "Заказ покупателя".
Но если добавить ее как внеш. печ. форму, то при попытке печати из документа Счет, выдает ошибку:
"Значение не является значением объектного типа (Табличный документ)"

Делал вроде как обычно: скопировал код из процедуры "Печать" из модуля менеджера документа Счет,
потом перенес туда процедуры из обработки "ПечатьСчетаНаОплату"
Но в процедуре Печать как-то не так, как было у меня раньше...
Раньше была команда:
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(...
А в этой такой команды нет.
Не могу разобраться, что сделать, чтобы заработало?
---
Вам шашечки или ехать? ;)
Если у вас этот код работает из внешней печ. формы, используйте то, что работает.
Например, так:

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

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

    Возврат ТабДок;
    КонецФункции

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

    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату");
    Если ПечатнаяФорма <> Неопределено Тогда

    ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
    ПечатнаяФорма.ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Универсальные_СчетНаОплатуВнешняя";//Обработки.ПечатьСчетНаОплату.КлючПараметровПечати();
    ПечатнаяФорма.ПолныйПутьКМакету = "ПФ_MXL_СчетНаОплату";//Обработки.ПечатьСчетНаОплату.ПолныйПутьКМакету();
    ПечатнаяФорма.СинонимМакета = "Счет на оплату";//Обработки.ПечатьСчетНаОплату.ПредставлениеПФ(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле);

    Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.СчетНаОплату") Тогда
    ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокумента(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле);
    Иначе
    Ошибки = Неопределено;
    ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокументаЗаказ(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле, Ошибки);
    КонецЕсли;

    Если СтрокаТаблицы.ЧастичнаяОплата Тогда
    Обработки.ПечатьСчетНаОплату.УчестьОсобенностиЧастичнойОплаты(ДанныеОбъектовПечати);
    КонецЕсли;

    ТабДок = СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, Ложь);

    КонецЕсли;

    КонецЦикла;

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

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

    Возврат ТабДок;

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

Я просто перенес ваш код в отдельную функцию, а Печать сделал как обычно.
При этом оставил ее функцией, тогда вызов из формы сохранит работоспособность.
---
Вот файл обработки
---
Печать - это не функция, а процедура. ТабличныйДокумент это реквизит коллекции печатных форм. УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию есть и широко используется, почему его нет у вас не знаю.

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

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

    КонецПроцедуры
```
---
сокращу код, что бы была понятна мысль которую хочу донести:

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

    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату");
    Если ПечатнаяФорма <> Неопределено Тогда

    ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;

    ТабДок = СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, Ложь);

    КонецЕсли;

    КонецЦикла;

    Возврат ТабДок;
    КонецФункции
```
что видим:

0) в цикле, при каждой итерации, пересоздаются переменные ПечатнаяФорма и ТабДок
1) первая переменная за пределы этой функции не выходит, так зачем её создавать и заполнять?
2) вторая - возвращается только последнее значение... тогда зачем нужен цикл и многократное её формирование?

PS как уже сказали выше, что-то в логике у вас совсем не так как надо...
---
RustamZz, благодарю за ответ.

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

Видимо, пойду стандартным путем - сделаю как у вас в (3)
---
Вот в этом и вопрос
наверняка в УНФ есть обработки с именем начинающемся на "Печать"

возьми от туда за образец процедуру Печать, она должна иметь примерно такой вид:

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

    СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);

    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЗаказКлиента") Тогда

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

    КонецЕсли;

    ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, СтруктураТипов, КоллекцияПечатныхФорм);

    КонецПроцедуры
```
PS взял из УТ, грузить УНФ специально для этого сообщения - лень.

(5) Сделал функцией, чтобы отладить печать через запуск формы обработки.
для отладки, в моём примере примере есть "СформироватьПечатнуюФормуЗаказаКлиента()"
в вашем СформироватьПФ(), т.е. делать ещё Печать функцией - не вижу смысла.
---
наверняка в УНФ есть обработки с именем начинающемся на "Печать"

Процедура Печать в модуле менеджера документа "Счет на оплату" (УНФ) выглядит так

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

    ВозможныеВарианты = Обработки.ПечатьСчетНаОплату.МатрицаВозможныхВариантов();
    Для каждого СтрокаТаблицы Из ВозможныеВарианты Цикл

    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, Обработки.ПечатьСчетНаОплату.ИдентификаторПечатнойФормы(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле));
    Если ПечатнаяФорма <> Неопределено Тогда

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

    ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокумента(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле);
    Если СтрокаТаблицы.ЧастичнаяОплата Тогда

    Обработки.ПечатьСчетНаОплату.УчестьОсобенностиЧастичнойОплаты(ДанныеОбъектовПечати);

    КонецЕсли;

    Обработки.ПечатьСчетНаОплату.СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, СтрокаТаблицы.ЧастичнаяОплата);

    КонецЕсли;

    КонецЦикла;

    Если ПараметрыПечати.Свойство("ШаблонПечатиОфисныхДокументов") И ЗначениеЗаполнено(ПараметрыПечати.ШаблонПечатиОфисныхДокументов) Тогда

    Для каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
    Если СтрНачинаетсяС(ПечатнаяФорма.ИмяВРЕГ, ВРег("ПечатьПоШаблонуОфисногоДокумента")) Тогда
    ПечатнаяФорма.ОфисныеДокументы = ПечатьПоШаблонуОфисногоДокумента(МассивОбъектов, ПараметрыПечати.ШаблонПечатиОфисныхДокументов);
    КонецЕсли;
    КонецЦикла;

    КонецЕсли;

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

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

Именно поэтому и возник вопрос: может ли этот код работать во внешней печ. форме?
(ну, в документе "Счет на оплату" он же работает)
Но вот как он работает, я не понимаю... (((
---
Вам шашечки или ехать? ;)
Если у вас этот код работает из внешней печ. формы, используйте то, что работает.
Например, так:

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

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

    Возврат ТабДок;
    КонецФункции

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

    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату");
    Если ПечатнаяФорма <> Неопределено Тогда

    ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
    ПечатнаяФорма.ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Универсальные_СчетНаОплатуВнешняя";//Обработки.ПечатьСчетНаОплату.КлючПараметровПечати();
    ПечатнаяФорма.ПолныйПутьКМакету = "ПФ_MXL_СчетНаОплату";//Обработки.ПечатьСчетНаОплату.ПолныйПутьКМакету();
    ПечатнаяФорма.СинонимМакета = "Счет на оплату";//Обработки.ПечатьСчетНаОплату.ПредставлениеПФ(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле);

    Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.СчетНаОплату") Тогда
    ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокумента(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле);
    Иначе
    Ошибки = Неопределено;
    ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокументаЗаказ(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле, Ошибки);
    КонецЕсли;

    Если СтрокаТаблицы.ЧастичнаяОплата Тогда
    Обработки.ПечатьСчетНаОплату.УчестьОсобенностиЧастичнойОплаты(ДанныеОбъектовПечати);
    КонецЕсли;

    ТабДок = СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, Ложь);

    КонецЕсли;

    КонецЦикла;

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

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

    Возврат ТабДок;

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

Я просто перенес ваш код в отдельную функцию, а Печать сделал как обычно.
При этом оставил ее функцией, тогда вызов из формы сохранит работоспособность.
---
сделал по вашему совету - все получилось.
Благодарю всех за помощь!