Добрый день. Мне нужно,чтобы выводилось несколько табличный документов, но к сожалению метод ТабДокумент.Показать() не работает в модуле объекта.
Если просто делать Возврат ТабДок, то выводится только последий табличный документ из цикла. Есть ли каки-либо альтернативы? Желательно, чтобы никуда не пришлось уходить из модуля объекта.

```1c
    Для каждого стрНаимТовара Из ТабНаименованияТоваров Цикл
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПечатьКМ";

    текНаимТовара = СокрЛП(стрНаимТовара.Наименование);

    КМТовара = рез.НайтиСтроки(Новый Структура("Наименование",текНаимТовара));
    Если КМТовара.Количество() = 0
    ИЛИ (КМТовара.Количество() = 1 И СокрЛП(КМТовара[0].КМ) = ") Тогда

    Сообщить("В отсканированном файле не найдено кодов для товара '"+текНаимТовара+"'!");
    Продолжить;
    КонецЕсли;

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

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

Предлагать всё, что поможет вывести несколько табличный документов, которые находятся в модуле объекта)
---
Значит делаем массив, возвращаем на форму и каждую позицию массива делаем показать.
---
Спасибо, а как теперь передать массив с модуля объекта на модуль формы?
---
Так же как передавали сам табличный документ. Просто передаете массив и обходите в цикле. Никаких ошибок передачи мутабельного с сервера на клиент (в общем случае) не будет.
---
Я не понимаю, как передается ТабличныйДокумент, мне как новенькому, всучили старую обработку и сказали переделать ее под 8.3. С такими стенами текста я блужу по обработке

```1c
    &НаСервере
    Процедура ОбновитьСписокПечатныхФормОбъекта()

    ПараметрыРегистрации = ЭтотОбъект().СведенияОВнешнейОбработке();

    Элементы.СписокПечатныхФормОбъекта.СписокВыбора.Очистить();

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

    ПечатнаяФорма = Элементы.СписокПечатныхФормОбъекта.СписокВыбора[0].Значение;

    КонецПроцедуры //ОбновитьСписокПечатныхФормОбъекта()

    // Конструктор для параметра КоллекцияПечатныхФорм процедуры Печать.
    //
    // ВозвращаемоеЗначение:
    // ТаблицаЗначений - пустая коллекция печатных форм:
    // * ИмяМакета - Строка - идентификатор печатной формы;
    // * ИмяВРЕГ - Строка - идентификатор в верхнем регистре символов для быстрого поиска;
    // * СинонимМакета - Строка - представление печатной формы;
    // * ТабличныйДокумент - ТабличныйДокумент - печатная форма;
    // * Экземпляров - Число - количество копий, которое необходимо вывести на печать;
    // * Картинка - Картинка - (не используется);
    // * ПолныйПутьКМакету - Строка - используется для быстрого перехода к редактированию макета печатной формы;
    // * ИмяФайлаПечатнойФормы - Строка - имя файла;
    // - Соответствие - имена файлов для каждого объекта:
    // ** Ключ - ЛюбаяСсылка - ссылка на объект печати;
    // ** Значение - Строка - имя файла;
    // * ОфисныеДокументы - Соответствие - коллекция печатных форм в формате офисных документов:
    // ** Ключ - Строка - адрес во временном хранилище двоичных данных печатной формы;
    // ** Значение - Строка - имя файла печатной формы.
    Функция ПодготовитьКоллекциюПечатныхФорм(Знач ИменаМакетов) Экспорт

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

    Если ТипЗнч(ИменаМакетов) = Тип("Строка") Тогда
    ИменаМакетов = СтрРазделить(ИменаМакетов, ",");
    КонецЕсли;

    Для Каждого ИмяМакета Из ИменаМакетов Цикл
    Макет = Макеты.Найти(ИмяМакета, "ИмяМакета");
    Если Макет = Неопределено Тогда
    Макет = Макеты.Добавить();
    Макет.ИмяМакета = ИмяМакета;
    Макет.ИмяВРЕГ = ВРег(ИмяМакета);
    Макет.Экземпляров = 1;
    Иначе
    Макет.Экземпляров = Макет.Экземпляров + 1;
    КонецЕсли;
    КонецЦикла;

    Возврат Макеты;

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

    Процедура УстановитьОграниченияТипа()

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

    //Установим заголовок формы
    ЭтаФорма.Заголовок = "Отладка внешних печатных форм: " + РегистрационныеДанные.Наименование;

    ВидОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок[РегистрационныеДанные.Вид];
    // ПолноеНазначениеЗначение = ДополнительныеОтчетыИОбработки.ПолучитьПолноеНазначениеПоВидуДополнительнойВнешнейОбработки­(ВидОбработки);

    СписокОграниченияТипа = Новый Массив;

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

    Если СписокОграниченияТипа.Количество() > 0 Тогда
    Для А = 0 По СписокОграниченияТипа.Количество() - 1 Цикл
    ЭлементМассива = СписокОграниченияТипа[А];
    ПозицияРазделителя = Найти(ЭлементМассива, ".");
    Если Лев(ЭлементМассива, ПозицияРазделителя - 1) = "Документ" Тогда
    ТипДокумента = Документы[Сред(ЭлементМассива, ПозицияРазделителя + 1)].ПустаяСсылка();
    ЭлементМассива = ТипЗнч(ТипДокумента);
    ИначеЕсли Лев(ЭлементМассива, ПозицияРазделителя - 1) = "Справочник" Тогда
    ТипСправочника = Справочники[Сред(ЭлементМассива, ПозицияРазделителя + 1)].ПустаяСсылка();
    ЭлементМассива = ТипЗнч(ТипСправочника);
    КонецЕсли;
    СписокОграниченияТипа[А] = ЭлементМассива;
    КонецЦикла;
    Элементы.СсылкаНаОбъект.ОграничениеТипа = Новый ОписаниеТипов(СписокОграниченияТипа);
    КонецЕсли;

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

    // Возвращает экземпляр текущего объекта
    //
    //
    &НаСервере
    Функция ЭтотОбъект()

    Обработка = РеквизитФормыВЗначение("Объект");
    Возврат Обработка;

    КонецФункции // ЭтотОбъект()

    ////////////////////////////////////////////////////////////­////////////////////
    // ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    //Устанавливаем ограничение типа для поля СсылкаНаОбъект
    УстановитьОграниченияТипа();

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

    &НаКлиенте
    Процедура ВыполнитьОтладку(Команда)

    ВыполнитьПечать();

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

    &НаКлиенте
    Процедура СсылкаНаОбъектПриИзменении(Элемент)

    ОбновитьСписокПечатныхФормОбъекта();

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

    Процедура ВыполнитьПечать()

    МассивОбъектовНазначения = Новый Массив;
    МассивОбъектовНазначения.Добавить(Объект.СсылкаНаОбъект);

    ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();

    ОбъектыПечати = Новый СписокЗначений;

    КоллекцияФорм = ПодготовитьКоллекциюПечатныхФорм(ПечатнаяФорма);

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

    ТабличноеПоле.Очистить();

    Для каждого СтрокаТаблицы Из КоллекцияФорм Цикл
    Если СтрокаТаблицы.ТабличныйДокумент <> Неопределено Тогда
    ТабличноеПоле = СтрокаТаблицы.ТабличныйДокумент;
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```
---
Вы привели текст модуля формы, который универсально тестирует внешнюю печатную форму, подключаемую через БСП. Несколько табличных документов не поддерживается. Комплект документов не подойдёт, т.к. это одна печатная форма.
В Предприятии вообще не будет никакой формы – будет использоваться только экспортная процедура Печать в модуле внешней обработки, которая по сути заполняет реквизит ТабличныйДокумент в таблице значений КоллекцияПечатныхФорм.
---
Так, а можно ли что-то сделать в таком случае?
---
Спасибо, а как теперь передать массив с модуля объекта на модуль формы? Как тебе вообще дали реальную задачу?
---
Можно посмотреть в сторону ПакетОтображаемыхДокументов, но это больше для печати/сохранения на диск.
---
В модуле объекта внешней обработке в функции СведенияОВнешнейОбработке в свойстве Использование команды можете указать тип команды "ОткрытиеФормы". Тогда, когда пользователь нажмёт на соответствующую команду печати, просто откроется форма вашей внешней обработки, в которой уже можно колхозить делать всё, что душе угодно. В частности можете сформировать массив табличных документов, отдать их на клиент и открывать через метод Показать() в цикле.
---
Спасибо, получилось!

когда пользователь нажмёт на соответствующую команду печати, просто откроется форма вашей внешней обработки

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