Объясните принцип передачи данных модуль объекта-форма СКД #802141


#0 by sagitt
Пишу отчет СКД. В качестве внешнего набора данных используется Таблица значений "ТЗ" Таблица формируется достаточно долго в связи с тем, что идет обращение к Web-сервисам. Эти данные необходимы при расшифровке некоторых ячеек. Чтобы сократить время ожидания решил передать ТЗ из модуля отчета(ТЗ формируется в ПриКомпоновкеРезультата) в форму, чтобы можно было использовать в РезультатОбработкаРасшифровки Пробовал 3 варианта: во всех вариантах из ПриКомпоновкеРезультата вызывается функция   &НаСервере функция РасшифроватьВРАботеСервер где я пытаюсь получить ТЗ 1.Создаю в модуле отчета пе переменную перем ТЗДляПередачи экспорт; В ПриКомпоновкеРезультата : Результат в РасшифроватьВРАботеСервер (смотрю под отладчиком): ТЗДляПередачи= Неопределено. 2.Создаю Реквизит объекта ТЗДляПередачи с типом значения "ТаблицаЗначений" (объявление переменной убрал) Результат в РасшифроватьВРАботеСервер ТЗДляПередачи содержит столько же строк, сколько ТЗ, но ни одной колонки.Т.е. Фактически данные не переданы. 3.Создаю Реквизит объекта ТЗДляПередачи с типом значения "Строка" неограниченной длины В ПриКомпоновкеРезультата : ... &об=реквизитформывзначение("Отчет"); Объясните мне,пожалуйста, почему данные теряются в первых двух случаях?
#1 by МимохожийОднако
Из СП: Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
#2 by МимохожийОднако
Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {}. Имя типа XDTO: ValueTable
#3 by sagitt
Я что- то не совсем вас понял: моя ТЗ используется только на серверной стороне (как в модуле, так и в процедуре из формы) при чем здесь XDTO? И если невозможно передавать ТЗ через реквизит(даже в рамках сервера) зачем тогда такой тип ввели вообще?
#4 by MrStomak
1. Во-первых, из ПриКомпоновкеРезультата ты не можешь вызвать  серверную функцию формы, так как сама ПриКомпоновкеРезультата находится в модуле объекта. Поэтому становится не понятно, что ты там на самом деле вызываешь и откуда куда передаешь. 2. Время жизни объявленных серверных переменных в форме - один серверный вызов. 3. Если ты используешь реквизит формы ТЗ, то он живет всегда вместе с формой, но для добавления в неё колонок нужно использовать технику программной работы с реквизитами формы и метод ИзменитьРеквизиты.
#5 by BogdanaNikolaeva
Абсолютно правильного рецепта для решения подобной задачи нет. Все зависит от конкретной задачи.
#6 by sagitt
1.Вы пишите, что я не могу вызвать Серверную функцию. Ну я всегда считал, что на клиенте ТаблицаЗначений не доступна( в смысле тз=новый ТаблицаЗначений; не прокатывает) , поэтому и написал, что все происходит на сервере. 2.Я считал, что время жизни переменной, описанной в модуле объекта равно времени жизни объекта. Я снова не прав? 3.Я создаю реквизит не формы, а объекта. Или это не имеет значения? Уважаемый BogdanaNikolaeva, в принципе я конечно получил решение своей задачи, но хотелось бы понять ошибки не с точки зрения "почему так", а не "работает и слава Богу, а почему не работает вар1 и вар2 точно не известно" так сказать на будущее.
#7 by Злопчинский
"Я создаю реквизит не формы, а объекта" я что-то не понял... что есть "объект"
#8 by sagitt
Объект в моем случае - это внешний отчет.
#9 by Сергиус
В 1-м случае скорее всего происходит несколько серверных вызовов. А между ними ничего не сохраняется в форме. Т.е. ПриКомпоновкеРезультата это 1-й вызов, а уже когда ты из него вызываешь РасшифроватьВРАботеСервер, то это как бы 2-й вызов. Возможно(не помню уже точно) в твоем случае прокатило бы создание реквизита ФОРМЫ с типом таблица значений и соответственно сохранение данных в него.
#10 by MrStomak
1. Я писал не про невозможность вызова серверной функции. Я писал про невозможность вызова серверной функции модуля формы из ПриКомпоновкеРезультата модуля объекта. 2. Время жизни объявленных серверных переменных в форме - один серверный вызов. 3. Имеет значение. В объекте ты не можешь создавать колонки. А в реквизите формы - можешь. Поэтому надо использовать реквизит формы, да.
#11 by sagitt
Уважаемый MrStomak Вот теперь понятно, Спасибо. Непонятно только, почему в отладчике при записи в реквизит объекта (отчета)типа ТЗ колонки видны, значит они там все-таки есть и непосредственно в ПриКомпоновкеРезультата их можно использовать. А при анализе того же реквизита этого же объекта из серверной функции формы - пропадают. Нелогично. Я же пытаюсь создавать колонки не в табличной части объекта, а в реквизите с типом ТЗ.
#12 by sagitt
Уважаемый   Сергиус, я сохраняю значение в переменной, объявленной в модуле объекта(1 вар) или в реквизите объекта (отчета) 2 вар). Вы хотите сказать, что данные объекта(значения его реквизитов) не сохраняются между обращениями к серверу? Тогда почему сериализованные значения сохраняются? И не совсем понятно, как получить доступ до реквизитов формы из ПриКомпоновкеРезультата. Ну скорее всего я здесь чего-то не знаю.
#13 by DmitrO
эта задача имеет простое и элегантное решение (и самое правильное с точки зрения клиент-серверного взаимодействия): 1.В процедуре ПриКомпоновкеРезультата ТЗ полученную от вебсервиса надо сохранить в дополнительных свойствах настроек СКД сохраняемых в расшифровке. 2.При обработке расшифровки использовать сохраненную ТЗ в серверном вызове, получая ее из доп. свойств настроек СКД. 3.Время жизни этой ТЗ на сервере будет определяться временем жизни экземпляра данных расшифровки, а оно зависит от времени жизни формы отчета. Сохраненными данными можно будет пользоваться даже в другой форме, если адрес расшифровки передать например параметром:
#14 by sagitt
Спасибо,DmitrO. Решение действительно неплохое, обязательно возьму но вооружение. Лишний раз показано, что одну и ту же задачу можно решать разными способами. Однако суть вопроса не объясняет: почему в первых двух вариантах данные теряются?
#15 by DmitrO
1.Значения серверных переменных модуля объекта не сериализуются и не передаются на клиент, т.к. не являются данными объекта отображающимися в данные контекста формы. Экземпляр ОтчетОбъект каждый раз создается заново из данных формы. 2.Реквизит отчета типа ТаблицаЗначений не сохранился в контексте формы скорее всего из-за того, что вы не создали в форме отчета реквизиты формы: колонки этой ТЗ. Тогда будет именно такое поведение, строки есть а колонок нет. Автоматически эти реквизиты формы (колонки) в рантайме не создаются. А в дизайнтайме они не известны, объявить колонки ТЗ у реквизита отчета типа ТЗ конфигуратор не позволяет.
#16 by Вафель
если нужно туда-сюда данные гонять, то нужно создавать реквизиты отчета
#17 by sagitt
Уважаемый DmitrO 1.Я и не говорю, что мне нужно передать на клиент значение серверной переменной: у меня при попытке доступа из СЕРВЕРНОЙ функции формы. Но Вы правы, Экземпляр ОтчетОбъект каждый раз создается заново из данных формы. 2. Не понял, а в объекте отчете он тоже не сохранился? Разве написав об.ТЗДляПередачи... я получаю доступ к контексту формы, а не реквизиту объекта отчета?
#18 by sagitt
Уважаемый Вафель Так я и создаю реквизит отчета, но он "гоняется" только будучи текстовым, а ТЗ - не "гоняется"
#19 by Вафель
Создай табличную часть
#20 by sagitt
Табличную часть с неизвестными заранее колонками?
#21 by DmitrO
#22 by DmitrO
++поправка: ЗначениеВРеквизитФормы(ОтчетОбъект, "Отчет"); //..
#23 by sagitt
Уважаемый DmitrO Вы явно чего-то не договариваете, или я не могу корректно сформулировать. Какая разница, как формируется форма со всеми ее реквизитами, колонками и т.д. самому объекту отчету? Данные то теряются именно в его реквизите, а не в реквизитах формы! Я всегда считал, что форма тем или иным образом отражает состояние объекта, в данном случае - отчета, у которого могут быть реквизиты вообще не отраженные в форме, а не наоборот. В данном же случае я получаю из РЕКВИЗИТА ОБЪЕКТА не то, ЧТО ТУДА ЗАПИСЫВАЛОСЬ! Подчеркиваю: объекта! p/s.Я так понял, что пример кода вы написали для иллюстрации мысли, а не практического применения(в  ПриКомпоновкеРезультата не доступна ЗначениеВРеквизитФормы)
#24 by DmitrO
наверно я не договариваю то, что совсем уж всем давно известно: Данные теряются при перобразовании из экземпляра объекта типа ОтчетОбъект.МойОтчет, в экземпляр объекта типа ДанныеФормыСтруктура (реквизит формы с именем Объект), после этого экземпляр ОтчетОбъект.МойОтчет уничтожается. При следующем серверном вызове происходит преобразование в обратном направлении, он создается уже другой, новый экземпляр объекта типа ОтчетОбъект.МойОтчет.
#25 by DmitrO
++ пример был написан для контекстного серверного вызова формы разумеется, именно это ведь вопрос отражен в теме..
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С