|
Объясните принцип передачи данных модуль объекта-форма СКД | ☑ | ||
---|---|---|---|---|
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
|
++
пример был написан для контекстного серверного вызова формы разумеется, именно это ведь вопрос отражен в теме.. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |