Добрый день!
Подскажите, пожалуйста, как можно реализовать?
Есть документ "Мат. отчет". В этом документе есть табличная часть с одним реквизитом "Документ" с составным типом из 3-х разных доков.
Необходимо в документе "Мат. отчет" сделать кнопку "Печать", которая отображала и печатала бы типовые печатные формы документов из табличной части "Документы". Т.е. пользователь нажал на строку 1 в ТЧ "Документы". Там у нас документ "расходный ордер". Так вот если он потом нажмет на кнопку печать, то выпадет меню со всеми печатными формами из документа "расходный ордер". Это нужно для того, чтобы не проваливаться в сам документ и не печатать оттуда. Реально ли такое сделать? Конфигурация 1С БИТ Строительство, платформа 8.3.
---
Хмм. Подозреваю, что через метаданные документов можно получить список макетов созданных для этих документов. Такой список можно создать и в ручную для каждого типа документа ("расходный ордер" и прочие). Таким образом можно сформировать тот самый выпадающий список для выбора печатной формы для текущего документа. Сами функции печати можно перенести в наш новый документ "Мат отчет" и формировать соответствующий выбранному макету (печатной форме) табличный документ при помощи этих самых функций печати из модулей оригинальных документов. Кстати, возможно что код этих функций печати и не нужно будет переносить, насколько я помню, эти функции экспортные.

upd: только что проверил на документе "ТребованиеНакладная". Из внешней обработки работает такой код:

```1c
    СсылкаНаОбъект.ПолучитьОбъект().Печать("М11");
```

СсылкаНаОбъект - реквизит внешней обработки в котором хранится ссылка на документ (как у вас в табличной части),
"М11" - название макета в конфигурации.

В модуле документа "ТребованиеНакладная" есть экспортная функция Печать():

```1c
    // Процедура осуществляет печать документа. Можно направить печать на
    // экран или принтер, а также распечатать необходимое количество копий.
    //
    // Название макета печати передается в качестве параметра,
    // по переданному названию находим имя макета в соответствии.
    //
    // Параметры:
    // НазваниеМакета - строка, название макета.
    //
    Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, НепосредственнаяПечать = Ложь) Экспорт

    // Получить экземпляр документа на печать
    Если ИмяМакета = "Накладная" Тогда
    ТабДокумент = ПечатьТребованиеНакладная();

    ИначеЕсли ИмяМакета = "М11" Тогда
    ТабДокумент = ПечатьМ11();

    КонецЕсли;

    УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(Ссылка), НепосредственнаяПечать);

    КонецПроцедуры // Печать()
```

Эта функция успешно выполняется и по нажатию кнопки во внешнем отчете формируется печатная форма соответствующего документа.
---
zlakizla, реально. На кнопку вешаешь функцию анализатор активной строки ТЧ.

Анализатор отработал, вернул нужный документ и там уже работает над выводом меню с нужными строками.

Весь код можно подсмотреть в модуле документов, только анализатор самому написать.
---
zlakizla, что то подобно было для авизовок...могу только немного показать

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Для каждого Док из Метаданные.Документы Цикл

    ВидыДокументов.Добавить(Док.Имя,Док.Синоним,Истина);

    КонецЦикла;
    ПереключательПроведенНепроведен = 1;
    //ТекущаяДата="31.01.2014";
    Период.ДатаНачала = НачалоМесяца(ТекущаяДата());
    Период.ДатаОкончания =КонецМесяца(ТекущаяДата());
    КонецПроцедуры

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    ПоказатьНастройки = Истина;
    ПоказатьНастройки(Неопределено);
    КонецПроцедуры

    &НаСервере
    Процедура АВИЗО()
    СписокВидовДокументов = ";
    ТабДок.Очистить();
    Макет1 = ПолучитьМакетНаСервере();

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

    Область.Параметры.Период = "+Период;
    ТабДок.Вывести(Область);
    сч = 0;

    Для каждого зн из ВидыДокументов Цикл
    Если НЕ зн.Пометка Тогда
    Продолжить;
    КонецЕсли;
    ТекВид = зн.Значение;

    Если ТекВид=" Тогда ТабДок.Очистить();
    Возврат;
    КонецЕсли;

    Выборка=Документы[ТекВид].Выбрать(Период.ДатаНачала,КонецДня(Период.ДатаОкончания));
    ....
    Синоним=ТекДокумент.метаданные().Имя;
    Если Синоним= "АвизоРасчетыВходящее" Тогда //у меня д.было определить имя ТЧ, т.к. они разные были в разных вида авизо, ну а у Вас просто ссылку определить
    ПереченьТабЧастей=Метаданные.Документы["АвизоРасчетыВходящее"].ТабличныеЧасти; //определяем перечень имен табличных частей
    КонецЕсли;
```

ну и про экспортные функции печати уже сказали, у меня всё дублировалось в своих макетах и хардкодом определялся макет вывода почему то, щас уже не помню
---
ben19791010, почему-почему. Исторически наверное так сложилось:) Я это к тому, что иногда так сделать проще и быстрее. Да не красиво и топорно, но работает! Некоторые программы так и нужно писать.
---
Хмм. Подозреваю, что через метаданные документов можно получить список макетов созданных для этих документов. Такой список можно создать и в ручную для каждого типа документа ("расходный ордер" и прочие). Таким образом можно сформировать тот самый выпадающий список для выбора печатной формы для текущего документа. Сами функции печати можно перенести в наш новый документ "Мат отчет" и формировать соответствующий выбранному макету (печатной форме) табличный документ при помощи этих самых функций печати из модулей оригинальных документов. Кстати, возможно что код этих функций печати и не нужно будет переносить, насколько я помню, эти функции экспортные.

upd: только что проверил на документе "ТребованиеНакладная". Из внешней обработки работает такой код:

```1c
    СсылкаНаОбъект.ПолучитьОбъект().Печать("М11");
```

СсылкаНаОбъект - реквизит внешней обработки в котором хранится ссылка на документ (как у вас в табличной части),
"М11" - название макета в конфигурации.

В модуле документа "ТребованиеНакладная" есть экспортная функция Печать():

```1c
    // Процедура осуществляет печать документа. Можно направить печать на
    // экран или принтер, а также распечатать необходимое количество копий.
    //
    // Название макета печати передается в качестве параметра,
    // по переданному названию находим имя макета в соответствии.
    //
    // Параметры:
    // НазваниеМакета - строка, название макета.
    //
    Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, НепосредственнаяПечать = Ложь) Экспорт

    // Получить экземпляр документа на печать
    Если ИмяМакета = "Накладная" Тогда
    ТабДокумент = ПечатьТребованиеНакладная();

    ИначеЕсли ИмяМакета = "М11" Тогда
    ТабДокумент = ПечатьМ11();

    КонецЕсли;

    УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(Ссылка), НепосредственнаяПечать);

    КонецПроцедуры // Печать()
```

Эта функция успешно выполняется и по нажатию кнопки во внешнем отчете формируется печатная форма соответствующего документа.