Имя: Пароль:
1C
1С v8
Как открыть форму второй дополнительной обработки с параметрами, не меняя её код
,
0 1C_coder
 
27.03.20
21:09
Как из одной дополнительной обработки открыть форму форму второй дополнительной обработки с параметрами, не меняя программный код второй обработки?
(Если бы можно было менять программный код второй обработки, тогда первая вообще бы не понадобилась.)

Пользователи хотят, чтобы из одной дополнительной обработки можно было открыть форму другой дополнительной обработки на определённой странице (их там много) с указанием периода. И, главное, чтобы табличная часть на этой странице была заполнена документами только по фильтру, установленному в форме первой обработки.

Форма второй обработки:
https://b.radikal.ru/b16/2003/52/7373aca03653.png

Пока остановился на таком коде.
Форма второй обработки открывается, но на передаваемые параметры не реагирует. Форма основная.


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

    ОткрытьФорму("ВнешняяОбработка."+ИмяОбработки+".Форма", Отбор);
КонецПроцедуры

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

&НаСервере
Функция ПодключитьДопОбработку(АдресВоВременномХранилище)
    Возврат ВнешниеОбработки.Подключить(АдресВоВременномХранилище);
КонецФункции


Статью https://helpf.pro/faq/view/1398.html прочитал.
1 Сергиус
 
27.03.20
22:04
(0)Если во 2-й форме нет обработчика этих параметров, то не получится. И что мешает писать код в форме доп.обработки?
2 Сияющий в темноте
 
27.03.20
23:24
метод открытия формы возвращает форму,странички в ней можно переключить,а также установить некоторые реквизиты,но вот вызвать неэкспортные методы не получится.
3 RomanYS
 
27.03.20
23:42
(0)
Ф = ОткрытьФорму("ВнешняяОбработка."+ИмяОбработки+".Форма");
Ф.НачПериода = НачалоДня(Период.ДатаНачала);//если НачПериода реквизит формы
или
Ф.Объект.НачПериода = НачалоДня(Период.ДатаНачала);//если реквизит обработки
4 Сергиус
 
28.03.20
02:42
(3)В чем смысл после открытия формы устанавливать значения переменных?
5 palsergeich
 
28.03.20
03:18
(0) параметры формы по без кода действуют ТОЛЬКО на основной реквизит.
В твоём случае можно сделать похитрее.
УпрФорма= ОткрытьФорму.....
Дальше через УпрФорма.ИмяСписка ты можешь наложить отборы например так
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(УпрФорма.ИмяСписка....
6 palsergeich
 
28.03.20
03:19
То есть отличие будет в том, что списко у тебя находится не в текущей форме, а по УпрФорма.ИмяСписка
7 НичегоНе Понятно
 
28.03.20
06:14
(0) ОткрытьФорму возвращает тебе форму. Дальше ты можешь делать все, что тебе нужно, с элементами которые лежат на форме. Открывать нужные закладки, загружать нужные данные в нужные тч и тод.
8 1C_coder
 
28.03.20
14:28
Получилось открыть форму на нужной странице:

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


Как теперь обращаться к этой второй доп обработке как к объекту, чтобы изменять значения реквизитов?
Нужно ведь изменять значения реквизитов именно этой открытой сейчас обработки.

    МеркурийО.НачПериода = НачалоДня(Период.ДатаНачала);
    МеркурийО.КонПериода = КонецДня(Период.ДатаОкончания);


Допустим, сейчас эта доп обработка хранится во временном файле "C:\Users\user\AppData\Local\Temp\v8_4752_14.tmp".
Получать объект обработки из временного файла v8_4752_14.tmp?

Не пойму, как это сделать.
9 RomanYS
 
28.03.20
14:37
(8) обработка - основной реквизит формы

МеркурийО = МеркурийФ.Объект;
МеркурийО.НачПериода = НачалоДня(Период.ДатаНачала);
10 1C_coder
 
28.03.20
16:12
(9) Спасибо! Работает.

Только синтаксис:
МеркурийО = МеркурийФ.ЭтотОбъект;
11 1C_coder
 
28.03.20
17:57
Хотя МеркурийФ.ЭтотОбъект - это ещё не объект обработки, а объект самой формы. С его помощью возможно изменить только реквизиты формы.

Всё-таки, видимо, объект нужно отдельно получить в процедуре &НаСервере.

Если так пишу, выдаёт ошибку "Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа":

&НаКлиенте
Процедура ОткрытьДокументыДляАннулирования(Команда)
    ИмяФайла = "";
    АдресВоВременномХранилище = "";
    ВременныйФайлОбработки = ПолучитьИмяФайлаВнешнейОбработки(ИмяФайла);
    ХранениеФайла = ПоместитьФайл(АдресВоВременномХранилище, ВременныйФайлОбработки, , Ложь);          
    ИмяОбработки = ПодключитьДопОбработку(АдресВоВременномХранилище);
    
    МеркурийФ = ОткрытьФорму("ВнешняяОбработка."+ИмяОбработки+".Форма");
    МеркурийФормаОбъект = МеркурийФ.ЭтотОбъект;
    МеркурийФормаОбъект.НачПериода = НачалоДня(Период.ДатаНачала);   //  чтобы работать с реквизитами формы обработки
    МеркурийФормаОбъект.КонПериода = КонецДня(Период.ДатаОкончания);
    
    МеркурийОбработкаОбъект = МеркурийФ.Объект;                      //  чтобы работать с реквизитами объекта обработки
    ИсходнаяТаблицаТТНЗаполнитьСписокТТННаСервере(МеркурийОбработкаОбъект, МеркурийФормаОбъект);
    
    МеркурийФ.Открыть();
    МеркурийФ.ТекущийЭлемент = МеркурийФ.Элементы.ИсходнаяТаблицаТТН;
КонецПроцедуры
12 1C_coder
 
28.03.20
18:01
Проблема в том, что нужно обрабатывать в отдельной процедуре &НаСервере реквизиты и формы, и объекта обработки.
13 RomanYS
 
28.03.20
18:15
(10) этотобъет это САМА форма. Тебе нужен основной реквизит формы, С вероятностью 90 % он называется объект.
(12) чужую форму на сервер не унесёшь. Возвращай нужное с сервера и присваивай на клиенте
14 1C_coder
 
29.03.20
08:36
На стороне сервера нужно выполнить кучу процедур с кучей запросов, которым для параметров запросов нужна куча реквизитов чужой формы.
Пришлось запихнуть реквизиты чужой формы в структуру и передать на сервер.

Данные в табличную часть загружаются. Это и в отладчике видно, и через сообщения пользователю можно посмотреть.
Но почему-то в табличной части на форме не отображается ни одной строки, она как будто пустая.

Из-за чего это может быть?

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


&НаСервере
Процедура ИсходнаяТаблицаТТНЗаполнитьСписокТТННаСервере(МеркурийОбработкаОбъект, МеркурийФормаСтруктура)
    
    Запрос = ПолучитьЗапросПоТТН( , , , МеркурийОбработкаОбъект, МеркурийФормаСтруктура);
    Результат = Запрос.Выполнить();
    ДанныеВыгрузки = Результат.Выгрузить();
    
    ИсходнаяТаблицаТТН = ОбработкаИсходнойТаблицы(ДанныеВыгрузки, , МеркурийОбработкаОбъект, МеркурийФормаСтруктура);
    МеркурийОбработкаОбъект.ИсходнаяТаблицаТТН.Загрузить(ИсходнаяТаблицаТТН.Выгрузить());
    
КонецПроцедуры
15 RomanYS
 
29.03.20
08:47
(14)  МеркурийФормаОбъект = МеркурийФ.ЭтотОбъект;//это глупость: МеркурийФ и МеркурийФормаОбъект у тебя одно и то же

у тебя точно не две формы открывается?
МеркурийФ = ОткрытьФорму("ВнешняяОбработка."+ИмяОбработки+".Форма");
...
МеркурийФ.Открыть();

По ощущениям при передаче МеркурийОбработкаОбъект на сервер должна ошибка быть. Странно, что у тебя работает.
16 1C_coder
 
29.03.20
10:46
Убрал "МеркурийФормаОбъект = МеркурийФ.ЭтотОбъект;" и "МеркурийФормаОбъект.Открыть();".

Конечный результат такой же (см. картинку).
https://d.radikal.ru/d31/2003/81/e1b1c9cf465d.png

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

&НаСервере
Процедура ИсходнаяТаблицаТТНЗаполнитьСписокТТННаСервере(МеркурийОбработкаОбъект, МеркурийФормаСтруктура)
    
    Запрос = ПолучитьЗапросПоТТН( , , , МеркурийОбработкаОбъект, МеркурийФормаСтруктура);
    Результат = Запрос.Выполнить();
    ДанныеВыгрузки = Результат.Выгрузить();
    
    ИсходнаяТаблицаТТН = ОбработкаИсходнойТаблицы(ДанныеВыгрузки, , МеркурийОбработкаОбъект, МеркурийФормаСтруктура);
    МеркурийОбработкаОбъект.ИсходнаяТаблицаТТН.Загрузить(ИсходнаяТаблицаТТН.Выгрузить());
    
КонецПроцедуры
17 RomanYS
 
29.03.20
11:00
(16) Может отбор какой стоит на форме

выложи куда-нибудь обработки
18 1C_coder
 
30.03.20
13:09
Дело не в настройках отображения на форме.

Нужна конструкция типа такой:
    ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
    ОбъектНаСервере.ИсходнаяТаблицаТТН.Загрузить(ИсходнаяТаблицаТТН.Выгрузить());
    ЗначениеВРеквизитФормы(ОбъектНаСервере, "Объект");


Но она не работает в данном случае, потому что такая конструкция может работать только применительно к своей обработке.
Нельзя её применить к чужой обработке, вызванной из своей.

В общем, пустая затея была.
19 RomanYS
 
30.03.20
17:16
(18) Если тебе нужно на форме что-то заполнить (почти любые данные формы или основного реквизита формы ) - то можно.
Если  тебе не экспортные методы вызвать - то нельзя.

В твоем примере можно обойтись без РеквизитФормыВЗначение и заполнить ТЧ на клиенте построчно.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.