Имя: Пароль:
1C
1С v8
Объясните принцип передачи данных модуль объекта-форма СКД
,
0 sagitt
 
29.07.17
07:06
Столкнулся с такой "проблемой"
Пишу отчет СКД. В качестве внешнего набора данных используется Таблица значений "ТЗ"
Таблица формируется достаточно долго в связи с тем, что идет обращение к Web-сервисам.
Эти данные необходимы при расшифровке некоторых ячеек. Чтобы сократить время ожидания решил передать ТЗ из модуля отчета(ТЗ формируется в ПриКомпоновкеРезультата()) в форму, чтобы можно было использовать в РезультатОбработкаРасшифровки()

Пробовал 3 варианта:
во всех вариантах из ПриКомпоновкеРезультата() вызывается функция  
&НаСервере
функция РасшифроватьВРАботеСервер()
где я пытаюсь получить ТЗ


1.Создаю в модуле отчета пе переменную
перем ТЗДляПередачи экспорт;
В ПриКомпоновкеРезультата() :
ТЗДляПередачи=ТЗ.Скопировать();

Результат в РасшифроватьВРАботеСервер() (смотрю под отладчиком):
ТЗДляПередачи= Неопределено.

2.Создаю Реквизит объекта ТЗДляПередачи с типом значения "ТаблицаЗначений"
(объявление переменной убрал)

Результат в РасшифроватьВРАботеСервер()
ТЗДляПередачи содержит столько же строк, сколько ТЗ, но ни одной колонки.Т.е. Фактически данные не переданы.

3.Создаю Реквизит объекта ТЗДляПередачи с типом значения "Строка" неограниченной длины

В ПриКомпоновкеРезультата() :
    ТЗДляПередачи= значениевстрокувнутр(тз);

в РезультатОбработкаРасшифровки():
РасшифроватьВРАботеСервер(сп);
...

&об=реквизитформывзначение("Отчет");

ТЗРасшифровкиВРаботе =значениеизстрокивнутр(об.ТЗДляПередачи);

Так работает.

Объясните мне,пожалуйста, почему данные теряются в первых двух случаях?
1 Мимохожий Однако
 
29.07.17
07:55
Из СП:
Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
2 Мимохожий Однако
 
29.07.17
07:56
Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: ValueTable
3 sagitt
 
29.07.17
11:11
Я что- то не совсем вас понял: моя ТЗ используется только на серверной стороне (как в модуле, так и в процедуре из формы) при чем здесь XDTO?
И если невозможно передавать ТЗ через реквизит(даже в рамках сервера) зачем тогда такой тип ввели вообще?
4 MrStomak
 
29.07.17
11:22
1. Во-первых, из ПриКомпоновкеРезультата ты не можешь вызвать  серверную функцию формы, так как сама ПриКомпоновкеРезультата находится в модуле объекта.
Поэтому становится не понятно, что ты там на самом деле вызываешь и откуда куда передаешь.

2. Время жизни объявленных серверных переменных в форме - один серверный вызов.

3. Если ты используешь реквизит формы ТЗ, то он живет всегда вместе с формой, но для добавления в неё колонок нужно использовать технику программной работы с реквизитами формы и метод ИзменитьРеквизиты.
5 Bogdana Nikolaeva
 
29.07.17
15:05
Абсолютно правильного рецепта для решения подобной задачи нет. Все зависит от конкретной задачи.
6 sagitt
 
29.07.17
18:01
Уважаемый MrStomak,

1.Вы пишите, что я не могу вызвать Серверную функцию. Ну я всегда считал, что на клиенте ТаблицаЗначений не доступна( в смысле тз=новый ТаблицаЗначений; не прокатывает) , поэтому и написал, что все происходит на сервере.

2.Я считал, что время жизни переменной, описанной в модуле объекта равно времени жизни объекта. Я снова не прав?

3.Я создаю реквизит не формы, а объекта. Или это не имеет значения?

Уважаемый BogdanaNikolaeva, в принципе я конечно получил решение своей задачи, но хотелось бы понять ошибки не с точки зрения "почему так", а не "работает и слава Богу, а почему не работает вар1 и вар2 точно не известно" так сказать на будущее.
7 Злопчинский
 
29.07.17
18:14
(6) "Я создаю реквизит не формы, а объекта"
я что-то не понял... что есть "объект"
8 sagitt
 
29.07.17
22:01
Объект в моем случае - это внешний отчет.
9 Сергиус
 
29.07.17
23:15
(0)В 1-м случае скорее всего происходит несколько серверных вызовов. А между ними ничего не сохраняется в форме. Т.е. ПриКомпоновкеРезультата это 1-й вызов, а уже когда ты из него вызываешь РасшифроватьВРАботеСервер, то это как бы 2-й вызов. Возможно(не помню уже точно) в твоем случае прокатило бы создание реквизита ФОРМЫ с типом таблица значений и соответственно сохранение данных в него.
10 MrStomak
 
30.07.17
08:55
(6)
1. Я писал не про невозможность вызова серверной функции. Я писал про невозможность вызова серверной функции модуля формы из ПриКомпоновкеРезультата модуля объекта.
2. Время жизни объявленных серверных переменных в форме - один серверный вызов.
3. Имеет значение. В объекте ты не можешь создавать колонки. А в реквизите формы - можешь. Поэтому надо использовать реквизит формы, да.
11 sagitt
 
31.07.17
09:52
Уважаемый MrStomak
Вот теперь понятно, Спасибо.

Непонятно только, почему в отладчике при записи в реквизит объекта (отчета)типа ТЗ колонки видны, значит они там все-таки есть и непосредственно в ПриКомпоновкеРезультата() их можно использовать. А при анализе того же реквизита этого же объекта из серверной функции формы - пропадают. Нелогично.
Я же пытаюсь создавать колонки не в табличной части объекта, а в реквизите с типом ТЗ.
12 sagitt
 
31.07.17
10:01
Уважаемый   Сергиус, я сохраняю значение в переменной, объявленной в модуле объекта(1 вар) или в реквизите объекта (отчета) 2 вар). Вы хотите сказать, что данные объекта(значения его реквизитов) не сохраняются между обращениями к серверу? Тогда почему сериализованные значения сохраняются?

И не совсем понятно, как получить доступ до реквизитов формы из ПриКомпоновкеРезультата(). Ну скорее всего я здесь чего-то не знаю.
13 DmitrO
 
31.07.17
10:19
(0)эта задача имеет простое и элегантное решение (и самое правильное с точки зрения клиент-серверного взаимодействия):

1.В процедуре ПриКомпоновкеРезультата ТЗ полученную от вебсервиса надо сохранить в дополнительных свойствах настроек СКД сохраняемых в расшифровке.

ДанныеРасшифровки.Настройки.ДополнительныеСвойства.Вставить("Данные", Данные); //сохраняем ТЗ с данными

2.При обработке расшифровки использовать сохраненную ТЗ в серверном вызове, получая ее из доп. свойств настроек СКД.

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

Сохраненными данными можно будет пользоваться даже в другой форме, если адрес расшифровки передать например параметром:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ДанныеРасшифровки = ПолучитьИзВременногоХранилища(Параметры.АдресРасшифровки);
ТЗ = ДанныеРасшифровки.Настройки.ДополнительныеСвойства.Данные; //получение нашей ТЗ
14 sagitt
 
31.07.17
10:40
Спасибо,DmitrO.
Решение действительно неплохое, обязательно возьму но вооружение.
Лишний раз показано, что одну и ту же задачу можно решать разными способами.

Однако суть вопроса не объясняет: почему в первых двух вариантах данные теряются?
15 DmitrO
 
31.07.17
11:27
(14)
1.Значения серверных переменных модуля объекта не сериализуются и не передаются на клиент, т.к. не являются данными объекта отображающимися в данные контекста формы. Экземпляр ОтчетОбъект каждый раз создается заново из данных формы.

2.Реквизит отчета типа ТаблицаЗначений не сохранился в контексте формы скорее всего из-за того, что вы не создали в форме отчета реквизиты формы: колонки этой ТЗ. Тогда будет именно такое поведение, строки есть а колонок нет. Автоматически эти реквизиты формы (колонки) в рантайме не создаются. А в дизайнтайме они не известны, объявить колонки ТЗ у реквизита отчета типа ТЗ конфигуратор не позволяет.
16 Вафель
 
31.07.17
11:34
если нужно туда-сюда данные гонять, то нужно создавать реквизиты отчета
17 sagitt
 
31.07.17
14:07
Уважаемый DmitrO
1.Я и не говорю, что мне нужно передать на клиент значение серверной переменной: у меня при попытке доступа из СЕРВЕРНОЙ функции формы. Но Вы правы, Экземпляр ОтчетОбъект каждый раз создается заново из данных формы.
2. Не понял, а в объекте отчете он тоже не сохранился? Разве написав
об=реквизитформывзначение("Отчет");
об.ТЗДляПередачи...
я получаю доступ к контексту формы, а не реквизиту объекта отчета?
18 sagitt
 
31.07.17
14:08
Уважаемый Вафель
Так я и создаю реквизит отчета, но он "гоняется" только будучи текстовым, а ТЗ - не "гоняется"
19 Вафель
 
31.07.17
14:18
(18) Создай табличную часть
20 sagitt
 
31.07.17
14:20
Табличную часть с неизвестными заранее колонками?
21 DmitrO
 
31.07.17
14:49
(17)
ОтчетОбъект = Отчеты.МойОтчет.Создать();
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Колонка1");
ТЗ.Добавить();
ОтчетОбъект.ТЗДляПередачи = ТЗ;

ЗначениеВРеквизитФормы("Отчет", ОтчетОбъект); //вот на этой операции, если реквизиты-колонки в форме не созданы, данные уже будут потеряны. В твое примере эта операция происходит внутренне, платформой, в рамках построения отчета и вызова ПриКомпоновкеРезультата

ОтчетОбъект2 = РеквизитФормыВЗначение("Отчет");
//ОтчетОбъект2.ТЗДляПередачи ТЗ есть, строки есть, колонок нет
22 DmitrO
 
31.07.17
14:53
++поправка:
ЗначениеВРеквизитФормы(ОтчетОбъект, "Отчет"); //..
23 sagitt
 
31.07.17
22:38
Уважаемый DmitrO Вы явно чего-то не договариваете, или я не могу корректно сформулировать. Какая разница, как формируется форма со всеми ее реквизитами, колонками и т.д. самому объекту отчету? Данные то теряются именно в его реквизите, а не в реквизитах формы! Я всегда считал, что форма тем или иным образом отражает состояние объекта, в данном случае - отчета, у которого могут быть реквизиты вообще не отраженные в форме, а не наоборот. В данном же случае я получаю из РЕКВИЗИТА ОБЪЕКТА не то, ЧТО ТУДА ЗАПИСЫВАЛОСЬ!
Подчеркиваю: объекта!

p/s.Я так понял, что пример кода вы написали для иллюстрации мысли, а не практического применения(в  ПриКомпоновкеРезультата() не доступна ЗначениеВРеквизитФормы())
24 DmitrO
 
31.07.17
23:06
(23)наверно я не договариваю то, что совсем уж всем давно известно:

Данные теряются при перобразовании из экземпляра объекта типа ОтчетОбъект.МойОтчет, в экземпляр объекта типа ДанныеФормыСтруктура (реквизит формы с именем Объект), после этого экземпляр ОтчетОбъект.МойОтчет уничтожается.

При следующем серверном вызове происходит преобразование в обратном направлении, он создается уже другой, новый экземпляр объекта типа ОтчетОбъект.МойОтчет.
25 DmitrO
 
31.07.17
23:08
++
пример был написан для контекстного серверного вызова формы разумеется, именно это ведь вопрос отражен в теме..
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс