Вызов процедуры из модуля объекта по имени в переменной

1. dentoma51 8 05.12.19 21:21 Сейчас в теме
Доброго всем здоровья!
Друзья,прошу помочь. В модуле документов есть несколько процедур печати: ПечатьИмя1,ПечатьИмя2,ПечатьИмя3 и т.д. В общем модуле в процедуре известен объект,назову его: ЭтотДокумент и в переменной определяется имя печатной формы,например:Имя2,то есть в какой=то переменной мы имеем имя процедуры ,пусть,ПФ="ПечатьИмя2". Как обратиться к процедуре объекта ПечатьИмя2? Через Выполнить не получается. Спасибо.
По теме из базы знаний
Найденные решения
9. EVKash 16 06.12.19 10:13 Сейчас в теме
(1) а почему через выполнить не получается?
этот код отрабатывает
ИмяФункции = "ФамилияИмяОтчество";
ФИО = Неопределено;
Выполнить("ФИО = ФизическиеЛицаКлиентСервер." + ИмяФункции + "(""Фамилия Имя Отчество"")");
Сообщить(ФИО);
выдает
Структура
user1981139; ipoloskov; tuzmich007; +3 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. spacecraft 06.12.19 00:15 Сейчас в теме
(1)
Как обратиться к процедуре объекта ПечатьИмя2? Через Выполнить не получается.

Это УФ или ОФ? Модуль менеджера, объекта, формы?
Как вариант:
Выполнить("ДокументОбъект."+ИмяПФ+"()");
9. EVKash 16 06.12.19 10:13 Сейчас в теме
(1) а почему через выполнить не получается?
этот код отрабатывает
ИмяФункции = "ФамилияИмяОтчество";
ФИО = Неопределено;
Выполнить("ФИО = ФизическиеЛицаКлиентСервер." + ИмяФункции + "(""Фамилия Имя Отчество"")");
Сообщить(ФИО);
выдает
Структура
user1981139; ipoloskov; tuzmich007; +3 Ответить
16. user2062737 13.09.24 14:58 Сейчас в теме
(9)

"выполнить" невыгодно использовать

мне вначале очень понравилась идея этой функции когда я только о ней узнал, но на практике она стопорит сильно систему и на поток её использование чревато ставить
2. coollerinc 196 05.12.19 22:06 Сейчас в теме
Если ИмяПеременной = "Имя1" Тогда
ПечатьИмя1();
ИначеЕсли ИмяПеременной = "Имя2" Тогда
ПечатьИмя2();
КонецЕсли
3. dentoma51 8 05.12.19 22:44 Сейчас в теме
(2)Если бы так просто. Имя печатной формы определяется в общем модуле программно и помещается в переменную ИмяПФ. А процедуры печати находятся в модуле документов и надо из общего модуля вызвать,например печать ТТН документа Реализации и т.д.
Если напрямую,то вызов был бы так ДокументОбъект.ПечатьТТН или ДокументОбъект.ПечатьТорг12, а необходима конструкция ДокументОбъект.ИмяПФ,а так нельзя. ИмяПФ-не процедура,а переменная в которой содержится имя вызываемой процедуры.
5. coollerinc 196 06.12.19 01:26 Сейчас в теме
(3)Все равно не понимаю проблемы:

Если ИмяПеременной = "Имя1" Тогда
ДокументОбъект.ПечатьИмя1();
ИначеЕсли ИмяПеременной = "Имя2" Тогда
ДокументОбъект.ПечатьИмя2();
КонецЕсли
YannikAlx; ice-net; +2 Ответить
7. spacecraft 06.12.19 09:11 Сейчас в теме
(5) наверно нужен универсальный метод, когда имена команд печати неизвестны заранее. Чтобы каждый раз не править общий модуль.
Хотя можно использовать единую точку входа в каждом документе, в которую и передавалось бы имя вызываемой команды. И уже в ней вызывалась нужная команда.
6. YannikAlx 27 06.12.19 08:58 Сейчас в теме
(3) Все именно так делается , как вам уже даже 2 раза написали...
Вы там что-то сами просто не допонимаете....
У вас ИмяПФ и не надо вызыывать! Переменная должна быть в ЕСЛИ , а вызывать надо то что надо в зависимости от значения ИмяПФ
8. YannikAlx 27 06.12.19 09:26 Сейчас в теме
Для начала вы бы все же уточнили для каких форм вы ищете решение?
11. dentoma51 8 06.12.19 11:52 Сейчас в теме
(8)Альфа-Авто 4.1 ,древняя. Получение печатных форм зашито в dll. Все печатные формы получаются стандартно через обращение к защищенной функции зфПечать.
Все процедуры печати в документах начинаются со слова Печать+ИмяФормы.
Цель замены функции зфПечать в том,что в ней много не нужных проверок.
В исходной функции эти действия и другие зашиты в компоненте DLL и обрабатываются вызовом
Рез = ОбработкаЗащиты.Компонента.зфПечать(пЭтотОбъект, пНазваниеПечатнойФормы, пКоличествоЭкземпляров, пНаПринтер, пДокумент);

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

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

     // 3 Ищем название печ. формы по значению структуры
	 Для Каждого ПечатнаяФорма Из СтруктураПечатныхФорм Цикл
		  Если ПечатнаяФорма.Значение = НазваниеПечатнойФормы Тогда
		 	  ИмяПФ=  ПечатнаяФорма.Ключ;
		  КонецЕсли;
     КонецЦикла;
     // не нашли - пробуем найти название печ. формы по ключу структуры
     Для Каждого ПечатнаяФорма Из СтруктураПечатныхФорм Цикл
          Если ПечатнаяФорма.Ключ = НазваниеПечатнойФормы Тогда
               ИмяПФ =  ПечатнаяФорма.Ключ;
          КонецЕсли;
	  КонецЦикла;
	  ИмяПФ = "Печать"+ИмяПФ;
   // 4 в переменной ИмяПФ получили значение  ПечатьРеализацияАвтомобилей  
   
   // 5 Теперь надо обратится к функции модуля объекта пЭтотОбъект ПечатьРеализацияАвтомобилей.
   // функция вернет таб.документ,то есть печатную форму.
   // вот как это сделать ,я не знаю.
   
  
   
КонецФункции
Показать
10. EVKash 16 06.12.19 10:34 Сейчас в теме
Для модуля объекта так же работает
ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
ИмяФункции = "ВременныеТаблицыДанныхДокумента";
ВременныеТаблицы = Неопределено;
Выполнить("ВременныеТаблицы = ДокументОбъект." + ИмяФункции + "();");
Сообщить(ВременныеТаблицы);
МенеджерВременныхТаблиц


Для модуля менеджера надо по другому...
12. dentoma51 8 06.12.19 12:24 Сейчас в теме
Всем,Спасибо,что откликнулись. Все получилось:
Выполнить("пЭтотОбъект"+"."+ИмяПФ+"(пДокумент)"); Потупил с передачей параметра.
13. spacecraft 06.12.19 15:01 Сейчас в теме
(12)
Выполнить("пЭтотОбъект"+"."+ИмяПФ+"(пДокумент)");

Зачем лишняя конкатенация для точки?
(4) не читали или игнорируете?
14. dentoma51 8 06.12.19 19:57 Сейчас в теме
(13) Спасибо за замечание. Ошибся.
15. agent00mouse 256 21.03.23 18:15 Сейчас в теме
Как быть в случае когда 1С.Fresh против выполнить и вычислить?

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

Есть идеи?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот