Имя: Пароль:
1C
1С v8
Управляемые формы - передача результатов запроса
,
0 Gobo
 
11.04.13
04:25
Доброе время суток !

Создана процедура директивой сервера. В нем выполняется запроса и результат выгружается в ТЗ, методом Выгрузить().
Теперь как его в таком же виде (ТЗ) возвращать процедуру с директивой клиента ?
1 Любопытная
 
11.04.13
04:33
ЗначениеВДанныеФормы (ValueToFormData)
Синтаксис:

ЗначениеВДанныеФормы(<Значение>, <Объект>)
Параметры:

<Значение> (обязательный)

Тип: Произвольный.
Значение прикладного типа, для которого определено преобразование в данные формы.
<Объект> (обязательный)

Тип: ДанныеФормыСтруктураСКоллекцией; ДанныеФормыКоллекция; ДанныеФормыСтруктура.
Данные формы, имеющие совместимую структуру.
Описание:

Преобразует объект прикладного типа в универсальный объект данных.

Доступность:

Сервер, толстый клиент.
2 el-gamberro
 
11.04.13
04:45
Никак, таблица значений не доступна на клиенте.
Извращенный вариант: использовать таблицу - данныеформы коллекция. И сделать ее невидимой.
А вообще раз такой вопрос возник, то скорее всего проблема в архитектуре или логике программы.
3 Aleksey
 
11.04.13
04:50
Преобразовать в структуру
завести реквизит на форме тип ТЗ и передавать через него
4 Aleksey
 
11.04.13
04:53
(2) Т.е. нужно получить список документов с реквизитами, а так как нельзя прервать на сервере выполнения вернуться на клиента и продолжить, то приходится разбивать логику, сначало получаем данные на сервере, затем перебираем данные на клиенте и работаем с ними на сервере.

Логика была бы другое если бы можно было не только с клиента вызывать сервер, но и с сервера вызывать клиента
5 Gobo
 
11.04.13
06:45
С клиента разве можно выполнить запрос ?
6 Aleksey
 
11.04.13
08:07
(5) с клиента можно вызывать серверную процедуру в которой будет запрос
7 Птах
 
11.04.13
08:24
Какие гуру-то набижали, вы еще в массив выгрузить посоветуйте :)

(2) прав, изначальный косяк в логике работы формы.
8 toypaul
 
гуру
11.04.13
08:25
ТаблицаНаФорме.Загрузить(Запрос.ВЫполнить().выбрать());
9 Defender aka LINN
 
11.04.13
08:40
(4) Нахрена данные перебирать на клиенте?
10 Aleksey
 
11.04.13
08:41
(9) да потому что в результате перебора может понадобиться вопрос задать пользователю, или документ програмно не провелся, я хочу открыть его чтобы пользователь провёл руками и дальше продолжить работать
11 Aleksey
 
11.04.13
08:41
да элементарна тот же прогресс бар
12 Aleksey
 
11.04.13
08:42
я может не хочу показывать в течении получаса курсор в виде колесика, я хочу сообщить клиенту о ходе работы
13 el-gamberro
 
11.04.13
08:52
(12) это в уф делается по другому, через ОбработчикОжидания на клиенте.
14 cw014
 
11.04.13
08:53
А через временное хранилище нельзя выкинуть?
15 Defender aka LINN
 
11.04.13
09:35
(10) Точно. Давайте на клиент кучу дерьма передадим, нахерачим серверных вызовов, да побольше! И вот тогда можно будет с чистой совестью рассказывать, какое 1С тормозное гуано.
16 Gobo
 
11.04.13
16:16
(15), про Хранилище высказались ?
Получается оптимальный вариант (1) ?
17 Нуф-Нуф
 
11.04.13
16:21
интересно, а зачем ТЗ на клиенте?
18 Gobo
 
12.04.13
06:38
Запрос возвращает 4 значения, ссылочного типа.
Их надо вернуть процедуру клиента.
19 Любопытная
 
12.04.13
06:42
Вернуть для чего?
20 Gobo
 
12.04.13
06:58
Для добавления в табличную часть формы.
Можно объявить переменную доступный серверу и клиенту в рамках модуля этой формы ?
21 Любопытная
 
12.04.13
07:01
Ты хочешь полученную ТЗ загрузить в ТЧ на форме?
22 Gobo
 
12.04.13
07:31
Да, но ТЧ форму содержит 15 колонок, из них только 4 определяется с помощью ТЗ полученным запросом, а остальное заполняется в процедуре клиента.
23 1Сергей
 
12.04.13
07:36
(22) про динамические списки не слышал, да?
24 Любопытная
 
12.04.13
07:38
Как табличная часть может заполняться на клиенте?
25 Gobo
 
12.04.13
07:46
На клиентской части идет загрузка из текстового документа.
Там есть идентификаторы поставщика.
Надо найти его элементы, документы из прикладных объектов 1С и добавить в табличную часть формы.
26 Gobo
 
12.04.13
07:50
После (21) этого возникла идея сделать так:
&НаСервере
Функция ПоискЗаявки(БИНПост)
   НайденДок="";
Запрос = Новый Запрос("
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    СпрПостав.Ссылка КАК Поставщик,
|    Заказ.Ссылка КАК Заказы,
|    Заявка.Ссылка КАК Заявки,
|    Товар.Ссылка КАК Товары
|ИЗ
|  Справочник.Поставщики КАК СпрПостав
|        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Заказы КАК Заказ
|        ПО Заказ.Поставщик = СпрПостав.Ссылка        
|        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Заявка КАК Заявка
|            ПО Заявка.Ссылка = Заказ.СоставЗаказа.Заявка.Ссылка
|                ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товар
|                ПО Товар.Ссылка=Заказ.СоставЗаказа.Товар.Ссылка
|ГДЕ
|    СпрПостав.БИН = &БИН");        

Запрос.УстановитьПараметр("БИН",БИНПост);
ТЗ = Запрос.Выполнить().Выгрузить();
Сообщить("ТЗ.Количество()="+ТЗ.Количество());
Если ТЗ.Количество()>0 Тогда
   Для Каждого Колонка Из ТЗ.Колонки Цикл
       Сообщить(Колонка.Имя);
   КонецЦикла;
   Для каждого ТЗ_тек из ТЗ Цикл ;
       Сообщить("111");    
               Сообщить(ТЗ.Поставщик);
   КонецЦикла;
   
   ЗначениеВДанныеФормы(ТЗ.Поставщик, Элементы.БанкКлиентКлиентПоставщик);
   ЗначениеВДанныеФормы(ТЗ.Заявки, Элементы.БанкКлиентЗаявкаЗаказ);
   Возврат 1;
Иначе
   Возврат 0;
КонецЕсли
КонецФункции
27 Любопытная
 
12.04.13
07:50
Ну так ты загружаешь из файла все, что можно, потом передаешь это на сервер, на сервере дозаполняешь незаполненные колонки и отдаешь обратно на клиент уже готовую ТЧ. Разве так не правильнее будет?
28 Gobo
 
12.04.13
07:52
Но выдает ошибку: Поле объекта не обнаружено (Поставщик)
Для этой строки: Сообщить(ТЗ.Поставщик);
29 Любопытная
 
12.04.13
07:55
(28) Сообщить(ТЗ_тек.Поставщик)
30 Любопытная
 
12.04.13
07:57
Строку сообщай, а не всю колонку.
ЗначениеВДанныеФормы(ТЗ.Поставщик, Элементы.БанкКлиентКлиентПоставщик); - это загрузка колонки в таблицу? ЧТо-то мне кажется, что так не выйдет
31 Gobo
 
12.04.13
08:18
Нельзя прочитать ТЗ ?
Почему это не выполняется ?
Для каждого ТЗ_тек из ТЗ Цикл ;
   Сообщить(ТЗ.Поставщик);
КонецЦикла;
32 Gobo
 
12.04.13
08:19
Понял
Для каждого ТЗ_тек из ТЗ Цикл ;
   Сообщить(ТЗ_тек.Поставщик);
КонецЦикла;
33 Любопытная
 
12.04.13
08:20
Еще раз: Строку сообщай, а не всю колонку.
Ты же написал
Для каждого ТЗ_тек из ТЗ Цикл
А теперь в цикле обращайся к ТЗ_Тек, в нем хранится текущая строка твоей ТЗ. Вот из строки поставщика и сообщай
34 Gobo
 
12.04.13
08:22
Не понял, как сообщать строку ?
35 Любопытная
 
12.04.13
08:23
ты уже все понял) продолжай
36 Gobo
 
12.04.13
08:23
Сейчас так,
Для Каждого ТЗ_тек из ТЗ Цикл ;
   ЗначениеВДанныеФормы(ТЗ_тек.Поставщик, Элементы.БанкКлиентКлиентПоставщик);
КонецЦикла;

Выдает ошибку о не несоответствии типов.
37 Любопытная
 
12.04.13
08:26
а что такое Элементы.БанкКлиентКлиентПоставщик? Полагаю, что это ДанныеФормыСтруктура.
ЗначениеВДанныеФормы(ТЗ.Поставщик, Элементы.БанкКлиентКлиентПоставщик); Не работает?

Все же считаю, что лучшим вариантом было бы на сервере собрать всю таблицу, не пришлось бы мучиться с передачей всякой хрени на клиент
38 Rovan
 
гуру
12.04.13
08:36
вот как у меня работает ЭТО
(ТаблицаДокументов - это таблица на форме)

&НаСервере
Процедура Заполнить_на_сервере()
   
   Запрос = Новый Запрос("
    |ВЫБРАТЬ

    |" );
   
   ПАКЕТ = Запрос.ВыполнитьПакет();
   ВыборкаЗаказов = ПАКЕТ[2].Выбрать( ОбходРезультатаЗапроса.ПоГруппировкам );
   ТЗ_Реализаций = ПАКЕТ[3].Выгрузить();
   
   Таблица_Документов = РеквизитФормыВЗначение( "ТаблицаДокументов" );
   Таблица_Документов.Строки.Очистить();
   
   Пока ВыборкаЗаказов.Следующий() Цикл
       нов_стр_заказ = Таблица_Документов.Строки.Добавить();
       нов_стр_заказ.ЗаказКлиента = ВыборкаЗаказов.Ссылка;
...
   КонецЦикла;
   
   ЗначениеВРеквизитФормы( Таблица_Документов, "ТаблицаДокументов" );
39 Gobo
 
12.04.13
08:48
Спасибо Всем, особенно - Любопытная.
Решено так:
ТЗ = Запрос.Выполнить().Выгрузить();
Если ТЗ.Количество()>0 Тогда
    нстр=Объект.БанкКлиент.Количество();
    Для Каждого ТЗ_тек из ТЗ Цикл ;
        Объект.БанкКлиент[нстр-1].КлиентПоставщик=ТЗ_тек.Поставщик;
    КонецЦикла;
    Возврат 1;
Иначе
    Возврат 0;
КонецЕсли
40 Любопытная
 
12.04.13
08:50
Ничего не поняла.
Объект.БанкКлиент[нстр-1].КлиентПоставщик=ТЗ_тек.Поставщик;
Что это за конструкция?
Что здесь где? Как оно работает?
41 Gobo
 
12.04.13
10:12
Элементы.БанкКлиентКлиент связан с Объект.БанкКлиент.