#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 точно не известно" так сказать на будущее.
#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.Реквизит отчета типа ТаблицаЗначений не сохранился в контексте формы скорее всего из-за того, что вы не создали в форме отчета реквизиты формы: колонки этой ТЗ. Тогда будет именно такое поведение, строки есть а колонок нет. Автоматически эти реквизиты формы (колонки) в рантайме не создаются. А в дизайнтайме они не известны, объявить колонки ТЗ у реквизита отчета типа ТЗ конфигуратор не позволяет.
#17
by sagitt
Уважаемый DmitrO 1.Я и не говорю, что мне нужно передать на клиент значение серверной переменной: у меня при попытке доступа из СЕРВЕРНОЙ функции формы. Но Вы правы, Экземпляр ОтчетОбъект каждый раз создается заново из данных формы. 2. Не понял, а в объекте отчете он тоже не сохранился? Разве написав об.ТЗДляПередачи... я получаю доступ к контексту формы, а не реквизиту объекта отчета?
#18
by sagitt
Уважаемый Вафель Так я и создаю реквизит отчета, но он "гоняется" только будучи текстовым, а ТЗ - не "гоняется"
#23
by sagitt
Уважаемый DmitrO Вы явно чего-то не договариваете, или я не могу корректно сформулировать. Какая разница, как формируется форма со всеми ее реквизитами, колонками и т.д. самому объекту отчету? Данные то теряются именно в его реквизите, а не в реквизитах формы! Я всегда считал, что форма тем или иным образом отражает состояние объекта, в данном случае - отчета, у которого могут быть реквизиты вообще не отраженные в форме, а не наоборот. В данном же случае я получаю из РЕКВИЗИТА ОБЪЕКТА не то, ЧТО ТУДА ЗАПИСЫВАЛОСЬ! Подчеркиваю: объекта! p/s.Я так понял, что пример кода вы написали для иллюстрации мысли, а не практического применения(в ПриКомпоновкеРезультата не доступна ЗначениеВРеквизитФормы)
#24
by DmitrO
наверно я не договариваю то, что совсем уж всем давно известно: Данные теряются при перобразовании из экземпляра объекта типа ОтчетОбъект.МойОтчет, в экземпляр объекта типа ДанныеФормыСтруктура (реквизит формы с именем Объект), после этого экземпляр ОтчетОбъект.МойОтчет уничтожается. При следующем серверном вызове происходит преобразование в обратном направлении, он создается уже другой, новый экземпляр объекта типа ОтчетОбъект.МойОтчет.
#25
by DmitrO
++ пример был написан для контекстного серверного вызова формы разумеется, именно это ведь вопрос отражен в теме..
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- Объясните принцип работы кнопок ОБНОВИТЬ и НАСТРОЙКА
- СКД: Как правильно составить запрос для СКД, некорректные данные
- СКД: СКД. Понимает ли СКД ссылки на МенеджерВременныхТаблиц?
- СКД: СКД. Как задать устанавливать параметры вложенных схем СКД?
- СКД: СКД: Программное обращение к полям группировки СКД
- СКД: СКД. Как переоределить действие кнопки "Сформировать" отчета, созданного в СКД?
- СКД vs OLAP что не хватает в СКД?
- СКД и МоментВремени. Нужно ли брать границу, когда получаю остатки с помощью СКД
- Пароль на модуль - Есть ли возможность установить пароль на общий модуль программно?
В этой группе 1С
- Автозаполнения поля в документе из регистра сведений при выборе номенклатуры (1С 8.2)
- Где хранить COM соединение.?
- ЗУП 8.3 галочка дополнять представление в карточке, как убрать по все м сотрудникам?
- Синхронизация данных БП 3.0 без полных прав
- СКД. Отбор неликвидных товаров на складе
- УТ 10.3 на одной кассе товар с НДС и Без НДС
- Динамический список по программно созданной таблице значений. Возможно ли?
- mysql, очистка таблицы
- Посчитать количество цифр в числе?
- Не работает группировка в Динамическом списке
- УНФ 1.6 ошибка значение объектного типа ЕГАИС
- как поменять значения КПП в справочнике Организация?
- Получить настройки отбора СКД
- Удалили настройку синхронизации в Рознице 2.2 с УТ10.3
- в Торговле 11.3.4.21 не происходит открытие смены (подключен АТОЛ 55ф)
- Розница 2.2 Несколько ККМ в магазине
- Элвес МФ с интерфейсной платой
- как в запросе к регистру ХозрасчетныйОстатки получить остатки по всем счетам и субсчетам
- Вывод табличного поля в табличный документ
- Заполнение приходного кассового ордера по розничной продаже