Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=52420)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Отобразить объект выбранного списка в форме внешней обработки
Автор: Gigi 07.06.19, 11:47
Всем привет!
Ну вообщем вопрос такой ...
И для того что бы была хорошо понятна суть вопроса ... и без лишних объяснений, думаю опять уместно затронуть вопрос "велосипедов"
И показать их ... что они собой представляют.
Поэтому вот они ... эти "ВЕЛОСИПЕДЫ" ... опять заново изобретенные
ОБЩИЙ МОДУЛЬ - СЕРВЕР//SubFx_ВнешняяОбработка.ПодключитьВнешнююОбработку(Внешние,АдресХранилища);
Функция ПодключитьВнешнююОбработку(Внешние,АдресХранилища) Экспорт
Если Внешние=Неопределено или Внешние="ВнешниеОбработки" Тогда
Возврат ВнешниеОбработки.Подключить(АдресХранилища);
Иначе
Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
КонецЕсли;
КонецФункции
ОБЩИЙ МОДУЛЬ - КЛИЕНТ//Расширение=Fx_Текст.РасширениеФайла(ИмяФайла);
Функция РасширениеФайла(ИмяФайла) Экспорт
ТекстДлина=СтрДлина(ИмяФайла);
Символ=".";
Count = 0;
CountSymb = 0;
SymbNum = 0;
//---------------------------
Для i = 1 по ТекстДлина Цикл
Count = Count + 1;
char = Сред(ИмяФайла, i, 1);
If char = Символ Then
CountSymb = Count;
EndIf;
КонецЦикла;
//---------------------------
Расширение = Сред(ИмяФайла,CountSymb+1);
Возврат Расширение;
КонецФункции
//ФормаВнешнейОбработки=SubFxКл_ВнешняяОбработка.ОткрытьПолучить("АдресПапки","Получить","ФормаИмя",);
Функция ОткрытьПолучить(АдресПапки,ПолучитьОткрыть,ИмяФайла,ФормаИмя) Экспорт
//======================
Расширение=Fx_Текст.РасширениеФайла(ИмяФайла); //Сообщить(Расширение);
Если Расширение="epf" Тогда
Внешние="ВнешниеОбработки";
Внешний="ВнешняяОбработка";
ИначеЕсли Расширение="erf" Тогда
Внешние="ВнешниеОтчеты";
Внешний="ВнешнийОтчет";
Иначе
Предупреждение("Файл: "+ИмяФайла+" не явяеться внешним отчетом или внешней обработкой!"); Возврат Неопределено;
КонецЕсли;
//======================
ПолноеИмяФайла=СтрЗаменить(АдресПапки+"\"+ИмяФайла,"\\","\");
//======================
Попытка
АдресХранилища = ""; //Помещаем обработку во временном хранилище
Результат = ПоместитьФайл(АдресХранилища,ПолноеИмяФайла, , Ложь);
ИмяОбработки = SubFx_ВнешняяОбработка.ПодключитьВнешнююОбработку(Внешние,АдресХранилища); // Откроем форму подключенной внешней обработки
Исключение
Предупреждение("Обработка: "+ПолноеИмяФайла+" Не найдена!"); Возврат Неопределено;
КонецПопытки;
//======================
Если ФормаИмя=Неопределено Тогда
ФормаАдрес=Внешний+"."+ ИмяОбработки +".Форма";
Иначе
ФормаАдрес=Внешний+"."+ ИмяОбработки +"."+ФормаИмя;
КонецЕсли;
//======================
Если ПолучитьОткрыть="Открыть" Тогда
ОткрытьФорму(ФормаАдрес);
Иначе
Форма=ПолучитьФорму(ФормаАдрес);
КонецЕсли;
//======================
Возврат Форма;
КонецФункции
Это для того что бы было понятно сколько всего опять пришлось кодить и опять изобретать велосипеды.
и все это всего лишь,для того что бы только подойти к поставленной задаче.
ТОЛЬКО ПОДОЙТИ!!! Всего лишь.... пока еще не решив ее а только приступив к ее решению.
И это при том, что еще не факт что вообще пучиться решить задачу...
Так вот, ниже процедура, которая как раз подходит к решению поставленной задачи.
Но которая показывает что подойдя к ней возникает кляуза. И поэтому наводит на мысль, возможно ли это сделать вообще? ... и позволяют ли сделать это возможности системы?
В конце-концов, для решения задачи, зря что ли столько велосипедов изобрел? ))))
Поэтому в указанной процедуре все необходимое уже готово и накодено в общем модуле.
Осталось единственное ... самое главное..
ОТОБРАЗИТЬ ОБЪЕКТ ВЫБРАННОГО СПИСКА В ФОРМЕ ВНЕШНЕЙ ОБРАБОТКИ.
Иными словами передать управления выбранного объекта не на ту форму которая у объекта в конфигурации базы, а на форму внешней обработки.
ВОТ ЧТО НАДО. И вот цель задачи.
И в данном коде видно, что помучившись изобретениями велосипедов, тем самым, сделав все необходимое для подспорья, и наконец поставив все точки на над И, стопор возник в финале
На самом главном. ))))
Поэтому, подскажите уважаемые )) Как решить задачу... По быстрому ...
Короче ... помогите сэкономить время. Которое итак потратил опять на общий модуль. В который уже надоело постоянно заглядывать и писать там кучу строк.
Код&НаКлиенте
Процедура СписокВоВнешнейОбработкеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ФормаВнешнейОбработки=SubFxКл_ВнешняяОбработка.ОткрытьПолучить(Объект.ПапкаВнешнихОбработок,"Получить","ФайлИмя.epf",);
//====================================
Ссылка= Элементы["СписокВоВнешнейОбработке"].ТекущаяСтрока;
ПараметрыФормы = Новый Структура("Ключ", Ссылка);
Форма_ТекОбъект = ПолучитьФорму("Документ.ИмяДокумента.ФормаОбъекта", ПараметрыФормы);
//====================================
ФормаВнешнейОбработки.Объект=Форма_ТекОбъект.Объект; // ЕСТЕСТВЕННО РУГАЕТЬСЯ ... ПИШЕТ: Ошибка при установке значения атрибута контекста (Объект). По причине: Нельзя изменять поле, содержащее объект данных формы
//ФормаВнешнейОбработки.Объект.Ссылка=Форма_ТекОбъект.Объект.Ссылка; // ЕСТЕСТВЕННО РУГАЕТЬСЯ ... ПИШЕТ: Поле объекта недоступно для записи (Ссылка). ФормаВнешнейОбработки.Объект.Ссылка=Форма_ТекОбъект.Объект.Ссылка;
//------------------------------------
//ФормаВнешнейОбработки.Объект.Номер=Форма_ТекОбъект.Объект.Номер;
//ФормаВнешнейОбработки.Объект.Дата=Форма_ТекОбъект.Объект.Дата;
//====================================
ФормаВнешнейОбработки.Открыть();
КонецПроцедуры
Буду признателен!
Автор: Vofka 07.06.19, 12:01
Текста как обычно много, и как обычно ничего не понятно.
Автор: pablo 07.06.19, 12:03
1. Ваша сбойная строка не нужна.2. В качестве ключа передавайте нужную ссылку на документ, а не ссылку на текущую строку списка.
Автор: Gigi 07.06.19, 13:07
Цитата(Vofka @ 07.06.19, 13:01)
Текста как обычно много, и как обычно ничего не понятно.
Да чего тут не понятного ... О Господи
)) Тем более, что много не только текста но и кода. Я старался что бы было как нельзя понятно ...Ладно забыли ...
Цитата(pablo @ 07.06.19, 13:03)
1. Ваша сбойная строка не нужна.2. В качестве ключа передавайте нужную ссылку на документ, а не ссылку на текущую строку списка.
Хммм... на документ? ... Блиин ... извините ... или у меня проблемы с русским потому что не родной язык или не въезжаю.
Поэтому пожалуйста строчку кода вместо "сбойной строки"
Буду благодарен!
Gigi @ Сегодня, 13:09
,
Цитата(pablo @ 07.06.19, 13:03)
передавайте нужную ссылку на документ
Имеется ввиду вот так что ли?
Объект = Ссылка.ПолучитьОбъект();
Но это ведь среда сервера... и как потом полученный объект отобразить в форме внешней обработки, у которой основной реквизит стоит тот же документ базы.
Т.е. в опции тип и прописан тот же документ: "ДокументОбъект.ИмяДокумента".
И включает все те же реквизиты и табличные части что и в самой базе. Т.е. это просто копия того же самого ... отличие только в интерфейсе ФормыОбъекта.
Просто управление выбранного объекта нужно передать на эту форму внешней обработки. Вот и весь вопрос
Короче ... прошу поконкретнее и не на пальцах, а на конкретный пример кода
Буду признателен!
Цитата(Gigi @ 07.06.19, 13:36)
а не ссылку на текущую строку списка.
Да ладно ... какая строка списка?
Когда в линии :
Ссылка=Элементы["СписокВоВнешнейОбработке"].ТекущаяСтрока;
Переменная "Ссылка" это не текущая строка а как раз и есть ССЫЛКА НА ДОКУМЕНТ! ТА САМАЯ...
Уже проверял и давно пережевал ...
Сообщить(ТипЗнч(Ссылка)); // Возврат - Синоним документа
Сообщить(ТипЗнч(Ссылка)=Тип("ДокументСсылка.ДокИмя")); // Возврат - Истина
Короче это я Вас понять не могу. При том что сам куда нельзя понятно изложил
Поэтому вопрос открыт!
Автор: pablo 07.06.19, 13:19
//Ссылка= Элементы["СписокВоВнешнейОбработке"].ТекущаяСтрока;
ПараметрыФормы = Новый Структура("Ключ", Форма_ТекОбъект.Объект.Ссылка);
Форма_ТекОбъект = ПолучитьФорму("Документ.ИмяДокумента.ФормаОбъекта", ПараметрыФормы);
//ФормаВнешнейОбработки.Объект=Форма_ТекОбъект.Объект;
Автор: Gigi 07.06.19, 13:53
Спасибо но не работает. И вообще нонсенс получается..Цитата(pablo @ 07.06.19, 14:19)
//Ссылка= Элементы["СписокВоВнешнейОбработке"].ТекущаяСтрока;
ПараметрыФормы = Новый Структура("Ключ", Форма_ТекОбъект.Объект.Ссылка);
Форма_ТекОбъект = ПолучитьФорму("Документ.ИмяДокумента.ФормаОбъекта", ПараметрыФормы);
//ФормаВнешнейОбработки.Объект=Форма_ТекОбъект.Объект;
Короче не знаю как решить вопрос. Который пока открыт
В конечном счете нужно следующее:
ФормаВнешнейОбработки.Объект= // НУЖНО ПРИСВОИТЬ ОСНОВНОМУ РЕКВИЗИТУ ВНЕШНЕЙ ФОРМЫ ВЫБРАННЫЙ ОБЪЕКТ
Вот и все что надо.
А создать форму внешней обработки не как обработку конкретного документа базы, а как отдельную копию просто формы, это просто целый гемор.
Потому что скопировав готовую форму документа во внешнюю обработку (до этого со всеми реквизитами документа).
И потом в основной реквизит в опции "Тип" поставив вместо прежнего объекта документа, "Внешнюю обработку"...
сделав это все многочисленные элементы формы теряют пусть к данным. И нужно вручную их ставить. Короче целый гемор.
Поэтому вопрос открыт!
Автор: pablo 07.06.19, 14:06
У Вас есть форма во внешней обработке.
Вы хотите ее открыть, чтобы она при открытии заполнилась данными из вашей ссылки? Если да, то какие у вашей формы есть параметры?
Если параметров нет, то создайте его, при открытии формы передайте в него ссылку, а в форме в процедуре ПриСозданииНаСервере прочитайте этот параметр и заполните из него данные.
Автор: Gigi 07.06.19, 14:28
Цитата(pablo @ 07.06.19, 15:06)
У Вас есть форма во внешней обработке.
Вы хотите ее открыть, чтобы она при открытии заполнилась данными из вашей ссылки? Если да, то какие у вашей формы есть параметры?
Если параметров нет, то создайте его, при открытии формы передайте в него ссылку, а в форме в процедуре ПриСозданииНаСервере прочитайте этот параметр и заполните из него данные.
Спасибо ... можно и так но Вам думаю уже нужно поздравить автора ))
ЭВРИКА )))) Наконец то ... нашел решение ... самое мало геморное и легкое ... без лишних хлопот. От которых уже голова кругом.
И ключ решения лег опять на тот же "Велосипед" из общего модуля.
Там кое что нужно было докорректировать... В функции добавить еще один аргумент.
Вот тот самый вариант "велосипеда" из общего модуля, но доработанный//ФормаВнешнейОбработки=SubFxКл_ВнешняяОбработка.ОткрытьПолучить("АдресПапки","Получить",стрПараметрыФормы,"ФормаИмя",);
Функция ОткрытьПолучить(АдресПапки,ПолучитьОткрыть,стрПараметрыФормы,ИмяФайла,ФормаИмя) Экспорт
//======================
Расширение=Fx_Текст.РасширениеФайла(ИмяФайла); //Сообщить(Расширение);
Если Расширение="epf" Тогда
Внешние="ВнешниеОбработки";
Внешний="ВнешняяОбработка";
ИначеЕсли Расширение="erf" Тогда
Внешние="ВнешниеОтчеты";
Внешний="ВнешнийОтчет";
Иначе
Предупреждение("Файл: "+ИмяФайла+" не явяеться внешним отчетом или внешней обработкой!"); Возврат Неопределено;
КонецЕсли;
//======================
ПолноеИмяФайла=СтрЗаменить(АдресПапки+"\"+ИмяФайла,"\\","\");
//======================
Попытка
АдресХранилища = ""; //Помещаем обработку во временном хранилище
Результат = ПоместитьФайл(АдресХранилища,ПолноеИмяФайла, , Ложь);
ИмяОбработки = SubFx_ВнешняяОбработка.ПодключитьВнешнююОбработку(Внешние,АдресХранилища); // Откроем форму подключенной внешней обработки
Исключение
Предупреждение("Обработка: "+ПолноеИмяФайла+" Не найдена!"); Возврат Неопределено;
КонецПопытки;
//======================
Если ФормаИмя=Неопределено Тогда
ФормаАдрес=Внешний+"."+ ИмяОбработки +".Форма";
Иначе
ФормаАдрес=Внешний+"."+ ИмяОбработки +"."+ФормаИмя;
КонецЕсли;
//======================
Если ПолучитьОткрыть="Открыть" Тогда
Если стрПараметрыФормы=Неопределено Тогда
ОткрытьФорму(ФормаАдрес);
Иначе
ОткрытьФорму(ФормаАдрес,стрПараметрыФормы);
КонецЕсли;
Иначе
Если стрПараметрыФормы=Неопределено Тогда
Форма=ПолучитьФорму(ФормаАдрес);
Иначе
Форма=ПолучитьФорму(ФормаАдрес,стрПараметрыФормы);
КонецЕсли;
КонецЕсли;
//======================
Возврат Форма;
КонецФункции
А вот точка над ИИИИИИ ... )))
Которая на этот раз наконец то аж взорвалась успехом ))))
&НаКлиенте
Процедура СписокВоВнешнейОбработкеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
Ссылка= Элементы["СписокВоВнешнейОбработке"].ТекущаяСтрока;
стрПараметрыФормы = Новый Структура("Ключ",Ссылка);
ФормаВнешнейОбработки=SubFxКл_ВнешняяОбработка.ОткрытьПолучить(Объект.ПапкаВнешнихОбработок,"Получить",стрПараметрыФормы,"ФайлИмя.epf",);
ФормаВнешнейОбработки.Открыть();
КонецПроцедуры
Вот что и нужно было.
Ладно ... Всем огромное спасибо за отклик!
Думаю вопрос решен!
Пока!
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua