|
Как быстро выгрузить ТЧ в УФ? | ☑ | ||
---|---|---|---|---|
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) нет вы то и другое делаете. И контекст и коллекцию гоняете.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |