Имя: Пароль:
1C
1С v8
Как быстро выгрузить ТЧ в УФ?
, ,
0 MaxisUssr
 
11.02.15
18:12
Вроде бы простой вопрос - но что-то не получается решить.
Достаточно большая УФ, много реквизитов, но данных немного.
Если делаем так:

&НаКлиенте
Выгрузка = ВыгрузитьНаСервере("ДанныеОтчета");

&НаСервере
Функция ВыгрузитьНаСервере(ИмяТЧ, Реквизит = Ложь)
    
    Если НЕ Реквизит тогда
        возврат Объект[ИмяТЧ].Выгрузить();
    Иначе
        возврат ЭтаФорма[ИмяТЧ].Выгрузить();
    КонецЕсли;
    
КонецФункции

то пока попадаем в серверную процедуру - теряем 2-3 секунды, что неприемлимо.

Если делать так

&НаКлиенте
Выгрузка = ВыгрузитьНаСервереБезКонтекста(Объект.ДанныеОтчета);


&НаСервереБезКонтекста
Функция ВыгрузитьНаСервереБезКонтекста(ТЧ)
    
    Возврат ТЧ.Выгрузить();
    
КонецФункции

- получаем ошибку.
1 SUA
 
11.02.15
18:19
Возвращаемое значение:

Тип: ТаблицаЗначений.

Описание:

Создает таблицу значений и копирует в нее табличную часть. Имена колонок таблицы значений совпадают с именами колонок табличного поля. Колонка, содержащая номер строки, выгружается в колонку с именем НомерСтроки.

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

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

ошибка гарантирована в обоих случаях
2 SUA
 
11.02.15
18:20
потомучто на клиенте ТЗ не нужна
3 H A D G E H O G s
 
11.02.15
18:20
(0) Странно, что ощибки в первом случае нет.
КТото врет!
4 H A D G E H O G s
 
11.02.15
18:20
(2) Нужна.
5 H A D G E H O G s
 
11.02.15
18:20
(2) Но ее нет.
6 MaxisUssr
 
11.02.15
18:23
(2)
Почему ошибка? Работает. Вот полный код:

&НаКлиенте
Функция ПредупредитьОНаличииДругихДокументов()
    
    Фильтры = ВыгрузитьНаСервере("Фильтры");
    РезЗапроса = Документы.ВерсияОтчетаПоХодуПроведенияКиЗД.НаличиеДругихДокументов(...
    
    ...
    
КонецФункции



&НаСервере
Функция ВыгрузитьНаСервере(ИмяТЧ, Реквизит = Ложь)
    
    Если НЕ Реквизит тогда
        возврат Объект[ИмяТЧ].Выгрузить();
    Иначе
        возврат ЭтаФорма[ИмяТЧ].Выгрузить();
    КонецЕсли;
    
КонецФункции
7 H A D G E H O G s
 
11.02.15
18:25
(6) Код нерабочий.
8 H A D G E H O G s
 
11.02.15
18:26
Хотя может УФ под Толстым. Фиг знает.
9 MaxisUssr
 
11.02.15
18:27
(8)
Именно УФ под толстым клиентом.
10 H A D G E H O G s
 
11.02.15
18:29
(9) Нельзя так делать :-)
11 MaxisUssr
 
11.02.15
18:32
(10)
Ну хорошо, суть вопроса это не меняет, давай будет такой код:

&НаКлиенте
Функция ПредупредитьОНаличииДругихДокументов()
    
    Если ЕстьДругиеДокументсСервер() тогда ...
  
    
КонецФункции

&НаСервере
Фукнция ЕстьДругиеДокументсСервер()

Фильтры = ВыгрузитьНаСервере("Фильтры");
     РезЗапроса = Документы.ВерсияОтчетаПоХодуПроведенияКиЗД.НаличиеДругихДокументов(...
    
    ...

КонецФункции

&НаСервере
Функция ВыгрузитьНаСервере(ИмяТЧ, Реквизит = Ложь)
    
    Если НЕ Реквизит тогда
        возврат Объект[ИмяТЧ].Выгрузить();
    Иначе
        возврат ЭтаФорма[ИмяТЧ].Выгрузить();
    КонецЕсли;
    
КонецФункции


между ф-ей ПредупредитьОНаличииДругихДокументов() и ЕстьДругиеДокументсСервер() теряю большое время - 2-3 секунды, т.к. тянется тот же самый контекст формы с клиента на сервер.
12 H A D G E H O G s
 
11.02.15
18:34
(11) Циклом обойди ДанныеФормыКоллекция, сформируй массив ссылок и отправь в безконтекстную серверную процедуру.
13 H A D G E H O G s
 
11.02.15
18:35
Если надо несколько колонок - формируй массив структур.
14 Aleksandr N
 
11.02.15
18:36
(11) Передать объект на "НаСервереБезКонтекста" пробовали?
15 MaxisUssr
 
11.02.15
18:36
(12), (13)
Этот вариант я и оставил как единственно возможный.
И для моей задачи кое-как годится.
Но это же как-то криво - если данных будет >10000, то это неоптимально.
16 Адский плющ
 
11.02.15
18:38
УФ под толстым клиентом это хороший способ искалечить свои знания об УФ.
17 MaxisUssr
 
11.02.15
18:39
(14)

{Документ......Форма.ФормаДокумента.Форма(1347)}: Ошибка при установке значения атрибута контекста (Объект)
        Рез = ВыгрузитьБезКонтекста(Объект, "ГруппыДоговоров");
по причине:
Нельзя изменять поле, содержащее объект данных формы
18 MaxisUssr
 
11.02.15
18:40
(это если вызывать прямо из клиента - что и нужно мне чтобы экономить время)
19 Aleksandr N
 
11.02.15
18:41
(17) Сначала скопируйте объект, а передавайте его копию. Тогда ругаться не будет.
20 Aleksandr N
 
11.02.15
18:42
+ (19) Например:
Рекв = Объект;
Рез = ВыгрузитьБезКонтекста(Рекв, "ГруппыДоговоров");
21 MaxisUssr
 
11.02.15
18:44
(20)
Александр, спасибо огромное, помогло!
22 Aleksandr N
 
11.02.15
18:44
(21) Действительно стало быстрее?
23 MaxisUssr
 
11.02.15
18:49
(22)
Да, стало, опустим сейчас передачу ТЗ на клиента (исправлю это - перепишу так, чтобы нужная мне процедура проходила полностью без контекста и чтобы ТЗ не попадало на клиента), но данная конструкция как ни странно работает быстрее (0.29 сек), чем переход в &НаСервере (там теряю около 2-3 секунд)
24 Aleksandr N
 
11.02.15
18:51
(23) Видать, действительно большая форма.
25 MaxisUssr
 
11.02.15
18:53
(24)
Вроде не особо - 3 закладки с ТЧ , в каждой из которых не более 10 колонок, плюс некоторые реквизиты.
26 mikeA
 
11.02.15
19:24
(0) а на.. т.е. зачем её вообще выгружать?
27 hhhh
 
11.02.15
19:56
(26) создайте табличное поле на форме и у него данные - эта ТЧ. Тогда не нужно будет никуда гонять таблицы значений.
28 MaxisUssr
 
11.02.15
20:02
(27)
Там смысл в том, что есть процедуры, когда ТЧ выгружается и в запросе (или в СКД) в ней вычисляются некие расчетные поля.
29 hhhh
 
11.02.15
20:11
(28) ну сделать реквизит типа ТЗ и привязать его к табличному полю на форме. Зачем гонять мегабайты туда сюда?
30 MaxisUssr
 
12.02.15
09:16
(29)
При переходе с клиентской процедуры на серверую с контекстом - этот самый контекст гоняется туда-сюда, отнимая время много большее, чем если я гоняю отдельно коллекцию значений (см выше).
31 hhhh
 
12.02.15
09:25
(30) нет вы то и другое делаете. И контекст и коллекцию гоняете.