gifts2017

Получение произвольной формы внешней обработки в управляемом приложении

Опубликовал Илья Галицков (galich) в раздел Программирование - Практика программирования

В 8.2 1С подложила разработчикам достаточно большую свинью - получить одну форму внешнего отчета из другой напрямую не получается, т.к. необходимо указать полный путь к форме. Для решения проблемы требуется подключить отчет к конфигурации. Всю голову сломал, пока дошел до данной реализации, надеюсь кому-нибудь поможет...

 

 

Прописываем в форме следующий код:

 

&НаКлиенте

 

Функция ПолучитьФормуВнешнегоОтчета(ИмяФормы)

 

    АдресХранилища = "";

 

    ИмяОтчета = ПолучитьИмяВнешнегоОтчета();

 

    Результат = ПоместитьФайл(АдресХранилища, ИмяОтчета, , Ложь);

 

    ИмяВнешнегоОтчета = ПодключитьВнешнийОтчет(АдресХранилища);

 

    Возврат ПолучитьФорму("ВнешнийОтчет."+ИмяВнешнегоОтчета +".Форма.ФормаСотрудника",,ЭтаФорма);

 

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



&НаСервере

 

Функция ПолучитьИмяВнешнегоОтчета()

 

    Возврат РеквизитФормыВЗначение("Отчет").ИспользуемоеИмяФайла;

 

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

 

&НаСервере

 

Функция ПодключитьВнешнийОтчет(АдресХранилища)

 

    Возврат ВнешниеОтчеты.Подключить(АдресХранилища);

 

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

 


Затем получаем форму на клиенте вызовом процедуры ПолучитьФормуВнешнегоОтчета(ИмяФормы), где ИмяФормы - строка с именем нужной формы.

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

Идея сыровата, но может кому поможет...

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Гладких (yku) 10.03.11 16:54
Тоже как-то надо было. Уж не помню как я это реализовал (но код очень похож), но у меня проблема была в следующем.
Есть отчет. у него две формы: форма1 и форма2. Я открывал получал форму отчета, открывал её, пользователь вносил в неё данные. Получал форму2, открывал её, а в ней нет тех данных что ввели в форму1. Будто бы два объекта создавала. Но тогда я только с 8.2 знакомился, может чего и напутал. С тех пор каждый раз в конфу встраивал и не возвращался к этому вопросу.
2. Eugeneer (Eugeneer) 10.03.11 20:27
Статья баянистая конечно))) Уже давно это изучено почти как полгода назад.
Вот статейка http://infostart.ru/public/77144/
3. Eugeneer (Eugeneer) 10.03.11 20:38
(1) по вашей проблеме ответ тоже в (2)

А для отрытия форм вообще ничего из этой ветки не нужно. Наоборот это вызовет ошибки в случае если форму встроить потом в конфигурацию.

Для автора: Все работает одним методом как для внешней так и в случае внутренней разработки.

ОткрытьФормуМодально("ВнешняяОбработка.SubSysМногофункциональнаяЗагрузкаДокументов.Форма.ФормаВводНоменклатуры",СтруктураПараметров,ЭтаФорма);
и всё. Никакх процедур описанных вообще не нужно. С ними наоборот будут ошибки. Типа - файл не найден. и будет ругаться на каталог из темпа.
Минус за публикацию не поставлю. Но автор пусть мотает на ус и учится.
4. Александр Гладких (yku) 11.03.11 09:14
5. Илья Галицков (galich) 11.03.11 11:12
Eugeneer пишет:

Статья баянистая конечно))) Уже давно это изучено почти как полгода назад.

Вот статейка http://infostart.ru/public/77144/

Не нашел эту статью ) Пришлось самому извращаться.
6. Eugeneer (Eugeneer) 11.03.11 11:25
(5) я и сам искал тогда. не нашел. оказывается где то на партнерских форумах все есть. но нам то от этого не легче.
7. Djon All (wolf2012x) 05.10.11 23:19
Как раз работаю над подобным... Ваша статья мне помогла сократить время... спасибо большое... ставлю +
8. Алекс Ю (AlexO) 09.01.12 17:28
комментарии к http://infostart.ru/public/77144/.
Код от Поручик оттуда же (если кто не нашел или не смог открыть):
&НаКлиенте
Процедура СписокРолей(Команда)
   
   ПараметрыФормы = Новый Структура("СтруктураРолей", СтруктураРолей);
   ОткрытьФормуМодально("ВнешняяОбработка.МатрицаРолейПользователейИБ.Форма.ФормаВыборРолейУправляемоеПриложение", ПараметрыФормы, ЭтаФорма);
   
КонецПроцедуры
...Показать Скрыть


Или такой, из ещё неоконченной работы
   // Откроем форму для редактирования списка адресатов
   Результат = ОткрытьФормуМодально("ВнешняяОбработка.ОтправкаЭлектронныхПисемУФ.Форма.АдреснаяКнига", ПараметрыОткрытия);
9. Алекс Ю (AlexO) 09.01.12 17:29
Почему так - перепост оттуда же:
"Открывая новую форму - создаете новый объект формы.
Это идеология УП: формы как объекты не хранятся на клиенте, поэтому создаются при каждом вызове заново. Соотвественно, никаких общих данных у них нет, а чтобы использовать общие данные - либо сохранять в аналог переменной "ПоместитьВоВременоеХранилище", либо - передавать при открытии через ПараметрыФормы.
Исключение - у форм Справочника можно задать использование единых источников данных БД, и тогда они будут получать одни и те же данные.
Отсюда - еще один неявный вариант хранения данных: использовать сохранние общих данных в объекты БД и брать их оттуда для каждой формы."
10. Алекс Ю (AlexO) 09.01.12 18:13
(0) а в статье сохраняют отчет целиком, чтобы потом взять у него форму с данными..
зачем это - не совсем непонятно.
11. QWE Qwerty (qwe_QWE) 24.03.15 10:54
Немного переделал


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

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

Функция ПолучитьИмяВнешнегоОтчета()
    Возврат РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;
КонецФункции

Функция ПодключитьВнешнийОтчет(АдресХранилища)
    Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
КонецФункции
...Показать Скрыть
12. Алекс Ю (AlexO) 24.03.15 12:42
(11) qwe_QWE, на форуме есть теги "код".
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа