Получение формы внешней обработки

1. user820492 29.01.19 10:23 Сейчас в теме
Добрый день!
Есть две обработки.. Обе загружены в 1с.. БП 3.0
Как из одной обработки получить форму другой?

Более подробней о проблеме: есть обработку создания документов по данным Exel. Она отрабатывает на отлично.. Вторая обработка - печать этих документов в нужном виде..у этой обработки создана форма, с возможностью ввода дополнительных параметров.

Как из первой обработки, получить форму второй обработки (не открыть форму, а получить)?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
16. kar911 29.01.19 12:36 Сейчас в теме
(1)
Вот пример
&НаКлиенте
Процедура Команда1(Команда)
        
    ПараметрыКоманды = Новый Структура;
   	ОткрытьФорму("ВнешняяОбработка.юи_ВыгрузкаВБухгалтерию.Форма.Форма", ПараметрыКоманды, ЭтаФорма, , ВариантОткрытияОкна.ОтдельноеОкно,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаСервере
Функция Получить()
	
	ИмяВременногоФайла = КаталогВременныхФайлов()+"юи_ВыгрузкаВБухгалтерию.epf";
   ДвоичныеДанные = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоРеквизиту("ИмяОбъекта","юи_ВыгрузкаВБухгалтерию").ХранилищеОбработки.Получить();
   ДвоичныеДанные.Записать(ИмяВременногоФайла);
   ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла);
 	

КонецФункции
Показать
17. AlexO 135 29.01.19 13:19 Сейчас в теме
(16) ну откроете вы форму. Данные вы как получите с неё? Их "получит" та обработка, которой она принадлежит.
В первой обработке, откуда вы открываете форму, вы не получите ничего. Можете только параметры передать "туда", на форму, чтобы учесть их при открытии.
18. kar911 29.01.19 14:17 Сейчас в теме
(17)При закрытии второй формы можно сделать ОповеститьОВыборе() и обработать на форме
19. AlexO 135 29.01.19 16:42 Сейчас в теме
(18) можно. Только вы уверены, что получите все? ТЗ, например? Ссылки?
21. kar911 29.01.19 17:02 Сейчас в теме
(19) это можно во временное хранилище закинуть
22. AlexO 135 29.01.19 17:14 Сейчас в теме
(21)там тоже куча ограничений )
Это тогда уж с хранением инфы в базе в виде бинарных файлов заморачиваться, но оно нам надо? )
23. kar911 29.01.19 17:18 Сейчас в теме
(22)Возможно, ему будет достаточно этого, мы не можем быть уверены)
25. AlexO 135 29.01.19 17:25 Сейчас в теме
(23)если теряется универсальность (ограничение на хранение типов данных, запись-чтение) - жди беды: обязательно понадобится, и придется переписывать и поддерживать два параллельных механизма хранения, либо - все переделывать.
26. kar911 29.01.19 17:27 Сейчас в теме
(25) тогда пускай всё в одну обработку запихнёт
27. acanta 29.01.19 17:29 Сейчас в теме
(26) Обработки поддерживают два разных разработчика?
28. AlexO 135 29.01.19 17:47 Сейчас в теме
(27)я полагаю, он подразумевал "вставить обе формы - в одну, нужную обработку". Тут не нужна поддержка двух разработчиков ))
29. acanta 29.01.19 17:54 Сейчас в теме
(28) я полагаю, что если бы это не являлось проблемой, вопроса добавить в обработку форму, вторую, третью не возникло бы.
Если два разработчика работают над разными обработками и существует такая необходимость открыть одну из другой, не меняя чужую обработку и не копируя ни форму в целом, ни какую-либо часть кода, то на УФ насколько это сложно?
30. AlexO 135 29.01.19 17:59 Сейчас в теме
(29) тут все дело - обойти "якобы изолированность" клиента от сервера, которое 1С ввела для программистов (но не для исполнения всевозможного кода, загрузки форм и ЭУ).
Я предлагаю оптимальный вариант, чтобы не возвращаться к этому вопросу и к этой форме в дальнейшем. Но можно и костылями, их тут множество уже предложено )
2. SedovSU@mail.ru 297 29.01.19 10:27 Сейчас в теме
Во второй обработке написать код вида (если конечно обработка вставлена в конфигурацию
Форма = Обработки.Обработка2.ПолучитьФорму("Форма");
3. user820492 29.01.19 10:43 Сейчас в теме
(2) я видимо не так выразился.. Обработки находятся в справочнике "Дополнительные отчеты и обработки", а не в конфигурации..
4. lefthander 29.01.19 10:44 Сейчас в теме
(3)Тогда найти по наименованию в справочнике дополнительные отчеты и обработки
6. user820492 29.01.19 10:56 Сейчас в теме
(4) И что мне это даст?
8. SedovSU@mail.ru 297 29.01.19 11:23 Сейчас в теме
(3) Можно так попробывать

ИмяВрФайла = ПолучитьИмяВременногоФайла();
ДопОбработка = Справочники.ДополнительныеОбработкиОтчеты.НайтиПоНаименованию("КакоеТоНазваниеОбработки");
ДвоичныеДанные = ДопОбработка.ХранилищеВнешнейОбработки.Получить();
Если ДвоичныеДанные = Неопрделено Тогда
Возрат
КонецЕсли

ДвоичныеДанные.Записать(ИмяВрФайла);
ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВрФайла);
ФормаОбработки = ВнешниеОбработки.ПолучитьФорму("ИмяФормы");
5. Fril 29.01.19 10:50 Сейчас в теме
(2) Как то давно писал так
 Процедура ПечатьУПД()
	
	Объект = Документ.ПолучитьОбъект();
	КоличествоЭкземпляров = 1; 
	НаПринтер = Ложь;
	
	ЭтоДокумент = Метаданные.Документы.Содержит(Объект.Метаданные());
	
	Если ЭтоДокумент И Объект.Метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить 
		и Не УправлениеДопПравамиПользователей.РазрешитьПечатьНепроведенныхДокументов(Объект.Проведен) Тогда
		
		Сообщить("Недостаточно полномочий для печати непроведенного документа!"); 
		Возврат;
		
	КонецЕсли;
	
	Попытка
		СтруктураВнутреннихПечатныхФорм = Объект.ПолучитьСтруктуруПечатныхФорм()
	Исключение
		СтруктураВнутреннихПечатныхФорм = Новый Структура;
	КонецПопытки;
	
	ДеревоМакетов = УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати(Объект.Ссылка, СтруктураВнутреннихПечатныхФорм);
	
	СтрокаПоУмолчанию = УниверсальныеМеханизмы.ПолучитьСтрокуДереваМакетовПоУмолчанию(Объект.Метаданные().Имя, ДеревоМакетов);
	
	Если СтрокаПоУмолчанию = Неопределено Тогда
		
		Сообщить("Для данного вида " + ?(ЭтоДокумент, "документа ", "") + "не назначено ни одной печатной формы!"); 
		Возврат;
		
	КонецЕсли;
	
	Расшифровка = СтрокаПоУмолчанию.Расшифровка;
	Если ТипЗнч(Расшифровка) = Тип("Структура") и Расшифровка.ВидПечатнойФормы = Перечисления.ВидыДополнительныхВнешнихОбработок.ПечатнаяФорма Тогда
		Если Не РаботаСДиалогами.ПроверитьМодифицированность(Объект) Тогда
			Возврат;
		КонецЕсли;
		
		ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(Объект.Ссылка, Расшифровка);
		УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, 
			?(ЭтоДокумент, ОбщегоНазначения.СформироватьЗаголовокДокумента(Объект), Строка(Объект)), Объект.Ссылка);
	Иначе
		//Объект.Печать(Расшифровка, КоличествоЭкземпляров, НаПринтер);
	КонецЕсли;
		
КонецПроцедуры // ПечатьУПД()

////////////////////////////////////////////////////////////­//////////////////////////
////////////////ИЛИ ЧЕРЕЗ КОНСТАНТУ В КОТОРУЮ ЗАПИСАНА ВН. ОБРАБОТКА//////////////////

//ВыбраннаяСтрока = Справочники.ВнешниеОбработки.НайтиПоКоду("OSN000001");
ВыбраннаяСтрока = Константы.ОбработкаДляОтправкиСМС.Получить(); //Константа расположена на ОБЩЕЙ форме НастройкаПараметровУчета	

Выборка = ПолучаемКонтрагентовИзСправочникаРассылкаСМС();
Если Выборка = Неопределено Тогда
	Возврат;
КонецЕсли; 

Попытка
	
	ИмяФайла = ПолучитьИмяВременногоФайла(); //Имя временного файла
	ДвоичныеДанные = ВыбраннаяСтрока.ХранилищеВнешнейОбработки.Получить();
	ДвоичныеДанные.Записать(ИмяФайла);
	
	Форма = ВнешниеОбработки.ПолучитьФорму(ИмяФайла);
	
	Если Не Форма = Неопределено Тогда
		Форма.Открыть();
	Иначе
		ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяФайла);
	КонецЕсли;
	
	ТЧ = Форма.ОбработкаОбъект.Контрагенты; //Через форму получаем объект и ТЧ Контрагенты
	ТЧ.Очистить();
	Пока Выборка.Следующий()  Цикл
		СтрТЧ = ТЧ.Добавить();
		СтрТЧ.Контрагент = Выборка.Контрагент;
	КонецЦикла;
	
Исключение
	Предупреждение("Выбранный файл не является внешней обработкой.
	|Либо, данная обработка не предназначена для
	|запуска в этой конфигурации.");
КонецПопытки; 
Показать
7. user820492 29.01.19 11:13 Сейчас в теме
(5) Это для обычных форм, а как для управляемых?
9. user633533_encantado 11 29.01.19 11:27 Сейчас в теме
(7)

 &НаКлиенте
Процедура ПроцедураМоейКоманды(Команда)
		
	ПараметрыКоманды = Новый Структура;
	
	ОткрытьФорму("ВнешняяОбработка.МояВнешняяОбработка.Форма.Форма", ПараметрыКоманды, ЭтаФорма, , ВариантОткрытияОкна.ОтдельноеОкно,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры
10. user820492 29.01.19 11:50 Сейчас в теме
Сделал примерно так:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    //Помещаем обработку во временном хранилище
    АдресХранилища = "";
    Результат = ПоместитьФайл(АдресХранилища, "C:\ВнешняяОбработка.epf", , Ложь);           
    ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
    
    // Откроем форму подключенной внешней обработки
    ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма");
КонецПроцедуры
&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища)
    Возврат ВнешниеОбработки.Подключить(АдресХранилища); 
КонецФункции 
Показать


Теперь при выполнении действий во второй обработке, появляется ошибка "Неизвестный идентификатор формы".. Кто-нибудь знает как от нее избавиться?
12. AlexO 135 29.01.19 11:57 Сейчас в теме
(10)
Теперь при выполнении действий во второй обработке, появляется ошибка "Неизвестный идентификатор формы"
Потому и появляется, что вы пытаетесь форму из другого объекта "притянуть за уши" к первому объекту.
Так в УФ не получится. Либо делайте форму "родной" для первого объекта, либо - через передачу данных между формами передавайте параметры.
11. AlexO 135 29.01.19 11:53 Сейчас в теме
В 1С - напрямую никак без танцев.
Ну автор же явно пишет, что хочет получить форму, т.е. форму и данные на ней! В УФ нельзя получить или вызвать форму другого объекта, только - пересоздав новый экземпляр, и заполнив её заново.
Тут нужно либо - включить ту, вторую, форму с параметрами, целиком в первую обработку, либо - сохранять данные из второй формы в третьем месте (Хранилище, регистр, etc), и уже оттуда их брать как параметры для первой обработки.
13. acanta 29.01.19 12:00 Сейчас в теме
Но ведь есть же общие формы в метаданных? В УФе в принципе можно использовать расширение и добавить общую форму. Или тоже будет неверный идентификатор?
14. AlexO 135 29.01.19 12:13 Сейчас в теме
(13)
Но ведь есть же общие формы в метаданных?
Ну так и здесь вы получите форму. Но только форму, голую структуру, без данных.
И то её надо пересоздавать заново для второго объекта из метаданных обработки, а не как автор пытается - получить готовую, ранее уже созданную, форму второй обработки - в первой.
15. AlexO 135 29.01.19 12:15 Сейчас в теме
1С там че-то мутила типа "можно получить открытую форму по ключу..." бла-бла... но там столько нюансов и ограничений, притом, что не получишь до конца реальную форму с реальными данными на ней, что проще не связываться, а сделать передачу данных с формы на форму.
20. acanta 29.01.19 16:46 Сейчас в теме
Т.е. вы предлагаете помещать на сервер в Хранилище значения из одной формы и получать в другой? Как делаются длительные операции? Но это же на сервере, а как в файловой версии?
24. AlexO 135 29.01.19 17:23 Сейчас в теме
(20)увы, Хранилище значения - это не аналог использования реквизитов обработки в ОФ. Плюс - не забываем про дополнительное преобразование РеквизитФормыВЗначение.
31. Alex_E 2355 30.01.19 06:23 Сейчас в теме
(20) Вы будете смеяться, но хранилище на сервере не зависит от того, используется ли база в файловом варианте или в клиент-серверном...
32. AlexO 135 30.01.19 11:40 Сейчас в теме
(31) они бы лучше реквизиты вернули на место )
33. Alex_E 2355 30.01.19 11:42 Сейчас в теме
(32) Кто они и где их место?
34. AlexO 135 30.01.19 12:30 Сейчас в теме
(33) 1С. А место реквизитов - в свободном доступе как на форме, так и в модуле объекта, если уж 1С придумала сама себе такое искусственное разделение.
35. user1194102 10.02.20 16:38 Сейчас в теме
Объясните еще пожалуйста, мы открываем внешнюю печатную форму и передаем на нее параметр в виде структуры. А на самой форме которую открываем, каким образом получить этот параметр для использования на форме, например для отбора по запросу в самой форме?
Оставьте свое сообщение

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