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