Доброго всем здоровья!
Друзья,прошу помочь. В модуле документов есть несколько процедур печати: ПечатьИмя1,ПечатьИмя2,ПечатьИмя3 и т.д. В общем модуле в процедуре известен объект,назову его: ЭтотДокумент и в переменной определяется имя печатной формы,например:Имя2,то есть в какой=то переменной мы имеем имя процедуры ,пусть,ПФ="ПечатьИмя2". Как обратиться к процедуре объекта ПечатьИмя2? Через Выполнить не получается. Спасибо.
---
а почему через выполнить не получается?
этот код отрабатывает
```1c
    ИмяФункции = "ФамилияИмяОтчество";
    ФИО = Неопределено;
    Выполнить("ФИО = ФизическиеЛицаКлиентСервер." + ИмяФункции + "("Фамилия Имя Отчество")");
    Сообщить(ФИО);
```
выдаетСтруктура
---
Как обратиться к процедуре объекта ПечатьИмя2? Через Выполнить не получается.
Это УФ или ОФ? Модуль менеджера, объекта, формы?
Как вариант:
Выполнить("ДокументОбъект."+ИмяПФ+"()");
---
а почему через выполнить не получается?
этот код отрабатывает
```1c
    ИмяФункции = "ФамилияИмяОтчество";
    ФИО = Неопределено;
    Выполнить("ФИО = ФизическиеЛицаКлиентСервер." + ИмяФункции + "("Фамилия Имя Отчество")");
    Сообщить(ФИО);
```
выдаетСтруктура
---
"выполнить" невыгодно использовать

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

```1c
    Если ИмяПеременной = "Имя1" Тогда
    ДокументОбъект.ПечатьИмя1();
    ИначеЕсли ИмяПеременной = "Имя2" Тогда
    ДокументОбъект.ПечатьИмя2();
    КонецЕсли
```
---
наверно нужен универсальный метод, когда имена команд печати неизвестны заранее. Чтобы каждый раз не править общий модуль.
Хотя можно использовать единую точку входа в каждом документе, в которую и передавалось бы имя вызываемой команды. И уже в ней вызывалась нужная команда.
---
Все именно так делается , как вам уже даже 2 раза написали...
Вы там что-то сами просто не допонимаете....
У вас ИмяПФ и не надо вызыывать! Переменная должна быть в ЕСЛИ , а вызывать надо то что надо в зависимости от значения ИмяПФ
---
Для начала вы бы все же уточнили для каких форм вы ищете решение?
---
Альфа-Авто 4.1 ,древняя. Получение печатных форм зашито в dll. Все печатные формы получаются стандартно через обращение к защищенной функции зфПечать.
Все процедуры печати в документах начинаются со слова Печать+ИмяФормы.
Цель замены функции зфПечать в том,что в ней много не нужных проверок.
 В исходной функции эти действия и другие зашиты в компоненте DLL и обрабатываются вызовом
     Рез = ОбработкаЗащиты.Компонента.зфПечать(пЭтотОбъект, пНазваниеПечатнойФормы, пКоличествоЭкземпляров, пНаПринтер, пДокумент);

Делаю новую функцию

```1c
    Функция зфПечатьУ(ЭтотОбъект, НазваниеПечатнойФормы=", КоличествоЭкземпляров, НаПринтер, Документ) Экспорт
    // вызывается из форм всех документов
    // в модулях документов процедуры печатных форм называются:
    // ПечатьТТН,ПечатьТорг12,ПечатьАкта и т.д. Документы разные Альфа Авто
    // пусть Выбрали печать Реализация автомобилей

    пЭтотОбъект = ЭтотОбъект;

    // 1 Восстанавливаем название печатной формы,например: Торг12
    пНазваниеПечатнойФормы = ВосстановитьЗначение(пЭтотОбъект.Ссылка.Метаданные().Имя+"ПечатнаяФорма");
    // пНазваниеПечатнойФормы="Реализация автомобилей"

    // 2 Обращаемся в процедуру модуля документа и в структуре получаем имена всех печатных форм
    СтруктураПечатныхФорм = пЭтотОбъект.ПолучитьСписокПечатныхФорм();
    //Ключ Значение
    //"РеализацияАвтомобилей" "Реализация автомобилей"
    //"ТОРГ12_17112018" "ТОРГ-12 (Товарная накладная с подписями)"
    //"ТОРГ12" "ТОРГ-12 (Товарная накладная)"
    //"ТТН" "1-Т (Товарно-транспортная накладная)" //ВыпП = Представление(пЭтотОбъект)+"."+ИмяПФ+"()";

    // 3 Ищем название печ. формы по значению структуры
    Для Каждого ПечатнаяФорма Из СтруктураПечатныхФорм Цикл
    Если ПечатнаяФорма.Значение = НазваниеПечатнойФормы Тогда
    ИмяПФ= ПечатнаяФорма.Ключ;
    КонецЕсли;
    КонецЦикла;
    // не нашли - пробуем найти название печ. формы по ключу структуры
    Для Каждого ПечатнаяФорма Из СтруктураПечатныхФорм Цикл
    Если ПечатнаяФорма.Ключ = НазваниеПечатнойФормы Тогда
    ИмяПФ = ПечатнаяФорма.Ключ;
    КонецЕсли;
    КонецЦикла;
    ИмяПФ = "Печать"+ИмяПФ;
    // 4 в переменной ИмяПФ получили значение ПечатьРеализацияАвтомобилей

    // 5 Теперь надо обратится к функции модуля объекта пЭтотОбъект ПечатьРеализацияАвтомобилей.
    // функция вернет таб.документ,то есть печатную форму.
    // вот как это сделать ,я не знаю.

    КонецФункции
```
---
Для модуля объекта так же работает

```1c
    ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    ИмяФункции = "ВременныеТаблицыДанныхДокумента";
    ВременныеТаблицы = Неопределено;
    Выполнить("ВременныеТаблицы = ДокументОбъект." + ИмяФункции + "();");
    Сообщить(ВременныеТаблицы);
```
МенеджерВременныхТаблиц

Для модуля менеджера надо по другому...
---
Всем,Спасибо,что откликнулись. Все получилось:
 Выполнить("пЭтотОбъект"+"."+ИмяПФ+"(пДокумент)"); Потупил с передачей параметра.
---
Выполнить("пЭтотОбъект"+"."+ИмяПФ+"(пДокумент)");
Зачем лишняя конкатенация для точки?
(4) не читали или игнорируете?
---
Спасибо за замечание. Ошибся.
---
Как быть в случае когда 1С.Fresh против выполнить и вычислить?

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

Есть идеи?