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