Вход | Регистрация



Долго выводятся результаты запроса в тонком клиенте на управляемых формах

Долго выводятся результаты запроса в тонком клиенте на управляемых формах
Я
   NewUser10
 
23.09.16 - 10:03
Добрый день. Пожалуйста, подскажите, что неправильно:
Делаю отчет: В функцию &НаСервере передаю параметры запроса (Реквизиты формы). Запросом выбираю сведения из документа, выгружаю результат запроса в таблицу,  в этой же функции перебираю строки таблицы и заполняю табличный документ и возвращаю этот табличный документ на клиент, где его отображаю...
Так вот, в таблице получается 1500 строк, в файловой версии базы отчет выполняется моментально, а в тонком клиенте выполнение растягивается на минуты и пользователи, работающие даже в других базах на данном SQL сервере, жалуются на зависания... Когда комментирую перебор строк таблицы, сам запрос без визуализации (отображаю только шапку) выполняется мгновенно.
Штатные отчеты по остаткам на несколько тысяч строк выполняются довольно быстро. Получается, как-то неправильно гоняю данные между сервером и клиентом...
Вот кусок функции без самого запроса:
    Результат = Запрос.Выполнить();
    Табл = Результат.Выгрузить();
    ЗаказПокупателяПред = Табл[0].ЗаказПокупателя;
    Таб = Новый ТабличныйДокумент;    

    Макет = ПолучитьМакетНаСервере();
    ОблШапка = Макет.ПолучитьОбласть("Шапка");
    Таб.Вывести(ОблШапка);
    ОблЗаказПок = Макет.ПолучитьОбласть("ЗаказПокупателя");
    ОблЗаказПок.Параметры.ЗаказПокупателя = ?(ЗначениеЗаполнено(ЗаказПокупателяПред),"Заказ покупателя: "+ЗаказПокупателяПред,"Заказ покупателя отсутствует");
    Таб.Вывести(ОблЗаказПок);
    ОблДанные = Макет.ПолучитьОбласть("Данные");
    Для Каждого Выборка Из Табл Цикл
        Если Выборка.ЗаказПокупателя <> ЗаказПокупателяПред Тогда
            ОблЗаказПок.Параметры.ЗаказПокупателя = ?(ЗначениеЗаполнено(Выборка.ЗаказПокупателя),"Заказ покупателя: "+Выборка.ЗаказПокупателя,"Заказ покупателя отсутствует");
            Таб.Вывести(ОблЗаказПок);
            ЗаказПокупателяПред = Выборка.ЗаказПокупателя;
        КонецЕсли;
        ОблДанные.Параметры.Заполнить(Выборка);
        Таб.Вывести(ОблДанные);
        Счет = Счет+1;
    КонецЦикла;
    Сообщить("всего получено "+Счет+" "+Табл.Количество());
    Возврат Таб;

Подскажите, пожалуйста, куда копать
 
 
   RomanYS
 
1 - 23.09.16 - 10:13
(0) Зачем ты привёл код, с которым "всё хорошо".

Зачем передавать параметры(Реквизиты формы) и возвращать Таб(тоже реквизит формы), если они уже доступны в контексте &НаСервере. Или используй &НаСервереБезКотекста, или не гоняй реквизиты формы - они и так гоняются в контексте.
   Mauser
 
2 - 23.09.16 - 10:16
Вангую, что Выборка.ЗаказПокупателя это ссылка, а в отчете странные пользователи почему-то хотят видеть текстовое представление.
   RomanYS
 
3 - 23.09.16 - 10:16
+ сделай замер, может проблем совсем в другом месте.
   Catseye
 
4 - 23.09.16 - 10:17
+(0)
Зачем считать "Счет = Счет+1", если нигде не используешь?
   NewUser10
 
5 - 23.09.16 - 10:18
(1) Если в этом коде закомментировать цикл перебора - тогда все хорошо (2-3 сек). А как только в цикле запускаю заполнение таблицы, выполнение растягивается на минуты...
Параметры передаю, так как хотел сделать НаСервереБезКонтекста, но тогда не могу получить макет из обработки
   aleks_default
 
6 - 23.09.16 - 10:18
(1)Где написано что Таб - реквизит формы?
   aleks_default
 
7 - 23.09.16 - 10:19
(5)не выгружай результат запроса в таблицу, делай перебор выборки
   NewUser10
 
8 - 23.09.16 - 10:20
(4) да это уже следы моих  попыток выявить проблему. Не обращайте внимания
   NewUser10
 
9 - 23.09.16 - 10:21
(2) Именно так, пожалуйста, разъясните, в чем здесь проблема
   RomanYS
 
10 - 23.09.16 - 10:21
(6) предположение. Как правило ТД выводят на форму. Я хотел написать " Таб(тоже реквизит формы?)". Спросим у ТС.
 
 Рекламное место пустует
   NewUser10
 
11 - 23.09.16 - 10:22
(5) Нужно значение первой строки в алгоритме. Из выборки до начала цикла я его получить не смог
   Провинциальный 1сник
 
12 - 23.09.16 - 10:22
Замер производительности сделай и посмотри, какие строки тратят время
   RomanYS
 
13 - 23.09.16 - 10:22
(2) (9) Нету тут проблемы: 1С автоматом подставляет представления при приведении типа к строке
   NewUser10
 
14 - 23.09.16 - 10:24
(10) Нет, Таб не реквизит формы. Я ТД создаю в функции и передаю на клиент
   Fragster
 
15 - 23.09.16 - 10:24
надеюсь, что Выборка.ЗаказПокупателя - это .Представление? как и прочие выводимые (похожие на ссылочные) поля?
   RomanYS
 
16 - 23.09.16 - 10:25
(14) А потом показываешь в отдельном окне?
   Mauser
 
17 - 23.09.16 - 10:26
(13) Продолжи фразу - "Для этого она..."
   newbling
 
18 - 23.09.16 - 10:27
Выборку делай, зачем тебе ТЗ если всё равно её перебираешь.

Если Выборка.ЗаказПокупателя <> ЗаказПокупателяПред 

Можно же сравнивать не ссылки, а в самом запросе присвоить им числа какие-нибудь и сравнивать числа.

?(ЗначениеЗаполнено(Выборка.ЗаказПокупателя),"Заказ покупателя: "+Выборка.ЗаказПокупателя,"Заказ покупателя отсутствует")
это тоже можно в запросе проверить.

Не считай Счет = Счет+1. Возьми просто количество строк выборки методом Количество()
   newbling
 
19 - 23.09.16 - 10:28
Ну и смотря куда выводить, может проще представление выводить, а ни ссылки, которые переделываются по ходу в строки.
   NewUser10
 
20 - 23.09.16 - 10:31
(14) Да
   RomanYS
 
21 - 23.09.16 - 10:32
Для теста:
засунь готовый отчет в макет и сделай
&НаСервере
Функция Сформировать()
  Возврат ПолучитьМакетТестовогоОтчеаНаСервере();
КонецФуннкции

Если тормоза останутся, то проблема не в коде, а в передаче ТАб.
   newbling
 
22 - 23.09.16 - 10:32
(18) Ну или так же строки сравнивать если лень возиться с числами - для них (чисел) понадобится ВТ и лишнее соединение по заказу скорее всего, а строку можно так присвоить уже к конечному результату. На клиенте сравнивать строки или числа куда лучше, чем ссылки - тем более в цикле.
   NewUser10
 
23 - 23.09.16 - 10:33
(15) Нет, это ссылка. Потом планировал при необходимости через точку реквизиты смотреть
   RomanYS
 
24 - 23.09.16 - 10:34
(23) вот этого точно делать не надо, всё нужное получай запросом
   newbling
 
25 - 23.09.16 - 10:34
(23) ну а что мешает 2 поля сделать. Одно представление, которое выводить, другое ссылка, которую не выводить, а оставить на "потом"
   newbling
 
26 - 23.09.16 - 10:35
(24) ну и да, всё правильно RomanYS говорит. В идеале, всё надо получать запросом. И даже по возможности проверки туда пихать.
   sitex
 
27 - 23.09.16 - 10:36
(0) А что не используешь СКД  ?
   NewUser10
 
28 - 23.09.16 - 10:37
(16) Да, показываю в отдельном окне.
   NewUser10
 
29 - 23.09.16 - 10:39
По поводу замера производительности, а как отладку на сервере запустить? У меня на точках останова не останавливается...
   newbling
 
30 - 23.09.16 - 10:40
(29) в рег эдите. погугли
   NewUser10
 
31 - 23.09.16 - 10:41
(27) Не разобрался с ней еще...
   RomanYS
 
32 - 23.09.16 - 10:41
(17) Да, конечно, получение представлений в запросе даст ускорение. Но в (2) ты пишешь про проблемы пользователей - у них проблем не будет: они увидят тоже самое только чуть подождут.
Однако у ТС возникла проблема при переходе на клиент-сервер. Производительность упала на !несколько! порядков. Я больше верю в проблему передачи контекста, чем в то сервер сильно проигрывает файловой базе.
   NewUser10
 
33 - 23.09.16 - 10:42
(24),(25),(26) сейчас исправлюсь
 
 
   RomanYS
 
34 - 23.09.16 - 10:44
+(21) или другой простой тест:
вместо 
    Возврат Таб;
верни
    Возврат Новый ТабличныйДокумент;
   NewUser10
 
35 - 23.09.16 - 10:46
(32) Я просто субъективные впечатления описываю. К сожалению, пока слабо владею инструментарием получения объективных критериев. Смотрю диспетчер задач на сервере, вроде загрузка процессора и памяти не сильно меняется, в консоли сервера у рабочего процесса тоже изменений не вижу...
   NewUser10
 
36 - 23.09.16 - 10:47
(+32) У сервера две гиговые сетевухи на 30 клиентов
   NewUser10
 
37 - 23.09.16 - 10:51
(34) Действительно, при возврате нового табличного документа отчет выполняется 3-5 сек... Получается, сисадмина трясти по поводу скорости передачи данных...
   RomanYS
 
38 - 23.09.16 - 10:52
(35) Ну "растягивается на минуты" - это реальность, или субъективная оценка пользователем периода более 10 секунд )?
   NewUser10
 
39 - 23.09.16 - 10:53
(38) Запускаю у себя на компе, с секундомером сижу, от 90 секунд до 6-8 минут...
   RomanYS
 
40 - 23.09.16 - 10:56
(37) Ура! Я всех победил))), проблема не в представлениях, хотя на них можно выиграть эти самые 5 секунд))).

Смотри сам отчет - может там что-то что не нужно пользователю (сложные расшифровки...). Сколько весит отчет в mxl.
   Fragster
 
41 - 23.09.16 - 10:56
   NewUser10
 
42 - 23.09.16 - 10:57
+(38) Я в цикле раскрашиваю строки еще, поэтому каждый раз набор действий в цикле был разный. Впрочем, исходя из (37) может и не в действиях отчета проблема, а в канале передачи данных...
   Fragster
 
43 - 23.09.16 - 10:57
выводи не в отдельный табдок, а в форму
   RomanYS
 
44 - 23.09.16 - 10:57
+(40) блин, вопросы теряю)
   RomanYS
 
45 - 23.09.16 - 10:58
(42) если цикл на клиенте - скорей всего проблема в нём
   newbling
 
46 - 23.09.16 - 10:59
(42) Я в цикле раскрашиваю строки еще

БИНГО
   NewUser10
 
47 - 23.09.16 - 11:00
(45) Нет, я же в (0) написал, что все в одной фунции на сервере делаю - выполняю запрос и тут же его результаты перебираю и формирую таб док...
   NewUser10
 
48 - 23.09.16 - 11:03
(46) проблема существует и без окрашивания. Именно приведенный код отрабатывает 2-3 минуты. А как визуализировать отчет? Я в цикле по условию применяю ОблДанные.Области.Данные.ЦветФона=КрасныйЦвет
   aleks_default
 
49 - 23.09.16 - 11:04
(41) Полезно. Как бы только запомнить все эти нюансы клиент-серверного взаимодействия придуманные фирмой 1С.
 
 Рекламное место пустует
   Fragster
 
50 - 23.09.16 - 11:04
(48) отчеты вообще следует рисовать на СКД
   NewUser10
 
51 - 23.09.16 - 11:06
(41), (49) А как без контекста макет на сервере получить?
У меня из функции НаСервереБезКонтекста данная функция не вызывается?

Функция ПолучитьМакетНаСервере()
ОтчетОбъект=РеквизитФормыВЗначение("Отчет");
Макет = ОтчетОбъект.ПолучитьМакет("Макет");
Возврат Макет;
КонецФункции
   sitex
 
52 - 23.09.16 - 11:07
(50) +1
   aleks_default
 
53 - 23.09.16 - 11:08
в (41) написано, что тебя как раз контекстный вызов спасет, только таб. док должен тоже принадлежать контексту, т.е. быть реквизитом формы
   NewUser10
 
54 - 23.09.16 - 11:09
(50) Так скажем, это следующий ближайший этап в моем пути к ЗНАНИЯМ. А результат нужен сейчас...
   NewUser10
 
55 - 23.09.16 - 11:10
Спасибо всем. Источник проблемы вроде бы локализован. Сейчас опробую (41), (53)
   sash-ml
 
56 - 23.09.16 - 11:10
+(1) &НаСервереБезКотекста
+(50)  СКД наше все
(5)(51) получи макет и передай в &НаСервереБезКотекста через параметр функции, если ругнется что нельзя передавать мутабельное значение то обойти можно если передавать сериализированное с помощью ЗначениеВСтрокуВнутр(<Значение>). Но так делать нежелательно
   Fragster
 
57 - 23.09.16 - 11:12
(56)-> (41)(43) просвещайся.
   H A D G E H O G s
 
58 - 23.09.16 - 11:30
Проблема в полном передаче ТабДока на клиент.

Добавь реквизит ТабДок на форме и выводи в него, предварительно его стирая в контекстном серверном вызове.
   H A D G E H O G s
 
59 - 23.09.16 - 11:32
   Fragster
 
60 - 23.09.16 - 11:33
(58) стирать надо перед уходом на сервер
   RomanYS
 
61 - 23.09.16 - 11:59
(41) да уж неожиданно, т.е. табличный документ передается на клиент аля динамический список. При определенных условиях будут тормоза со скроллом.
   NewUser10
 
62 - 23.09.16 - 15:52
(58),(59) Завел на форме табличный документ, стал в процедуре &НаСервере цикле перебора результатов запроса выгружать строки в этот табличный документ, выполняется отчет на 1500 строк около 5 минут, причем сам запрос несколько секунд... К зависанию, к счастью (для целостности моего сознания) отчет оказался непричастен - перезагрузил сервер 1с и зависания прошли...
Кстати, замер производительности для процедур, исполняемых на сервере, у меня не получился; останавливается и меряет только для клиентской части. Это от моей недообразованности?
   Fragster
 
63 - 23.09.16 - 15:56
(62) >Это от моей недообразованности?
да
   NewUser10
 
64 - 23.09.16 - 15:59
(63) Краткость - сестра таланта...
   Fragster
 
65 - 23.09.16 - 16:00
(64) у тебя же целый интернет под рукой. и средства поиска есть
   RomanYS
 
66 - 23.09.16 - 16:02
(62) "выгружать строки в этот табличный документ" - звучит подозрительно, поясни.
   RomanYS
 
67 - 23.09.16 - 16:04
(64) отладка на сервере выключена по умолчанию, не факт, что стоит её включать на рабочем сервере
   NewUser10
 
68 - 23.09.16 - 16:04
(64)Да я же не спорю...
   NewUser10
 
69 - 23.09.16 - 16:05
(64)=(65)
   NewUser10
 
70 - 23.09.16 - 16:09
(66) просто в цикле процедуры &НаСервере
ОблДанные.Параметры.Заполнить(Выборка);
Таб.Вывести(ОблДанные);

где Таб  - реквизит формы с типом "Табличный документ"
   NewUser10
 
71 - 23.09.16 - 16:12
(66) или правильнее будет завести табличный документ на сервере, поместить в него строки моего отчета, а потом
ЗначениеВРеквизитФормы(Таблица,"Таб");  ?
   apokrit
 
72 - 23.09.16 - 16:18
(0) Постов уже много, читать лень.
Проблема в следующем - не нужно возвращать табличный документ на клиент. Если так делать - он целиком передается на клиент, это не эффективно.
Правильный вариант - положить его в реквизит формы, тогда на клиент уедет только видимая порция и потом будет подтягиваться при скролинге.
   RomanYS
 
73 - 23.09.16 - 16:25
(70) ОК.
"Возврат Таб;" убрал?
   RomanYS
 
74 - 23.09.16 - 16:26
(71) бред, или я не понял)
   NewUser10
 
75 - 23.09.16 - 16:37
(73) да, из функции процедуру сделал
(74) ну я в смысле, что присваивая построчно, я перегоняю порционно данные на клиент, а так разово, хотя реквизит формы существует и на клиенте и на сервере и я присваиваю порционно все равно на сервере, правильно? Или я окончательно запутался?
   RomanYS
 
76 - 23.09.16 - 16:41
(75) ты так и не сказал, сколько весит твой отчет в mxl
   NewUser10
 
77 - 23.09.16 - 16:48
(76) смешные 860 кб
   RomanYS
 
78 - 23.09.16 - 17:06
(77) да уж, умеет 1С на ровном месте свинью подложить)
   H A D G E H O G s
 
79 - 23.09.16 - 17:09
(78) Нет, 1С просто настолько сложна и многое скрывает от пользователя - программиста 1С, что свинью просто не видно.
   RomanYS
 
80 - 23.09.16 - 17:22
(79) Как можно сериализовать/передавать/десериализовать 1МБ 5(пять!) минут, при гигабитной сети.
   H A D G E H O G s
 
81 - 23.09.16 - 17:31
(80) посмотри мои показатели здесь
v8: Табличный документ, тонкий клиент и производительность.

причин лагов автора может быть с пару десятков, перечислялось не раз.
   RomanYS
 
82 - 23.09.16 - 17:49
(81) там вполне приемлемые цифры (отчет больше на порядки, время меньше).
У ТСа нереальные тормоза судя по описанию. Хочется верить, что ТС всё-таки где-то накосячил и не сознается, или это уже исправленный глюк платформы (версия вроде не озвучивалась).
   Провинциальный 1сник
 
83 - 23.09.16 - 18:37
(80) Так же, как в 7.7 можно сутки сохранять xls с десятком тысяч строк с автовысотой) Баг, который не торопятся исправлять.
   NewUser10
 
84 - 24.09.16 - 12:19
Господа, всем еще раз огромнейшее спасибо!!! Утром решил применить наконец-то освоенный механизм замера производительности на файловой версии базы и осознал, как много приобрел. Не то, чтобы я про него не знал: читал, видел в конфигураторе, но не представлял его важности в работе (как пару лет назад, начав по необходимости самостоятельно писать в глубинке на семерке, не представлял важности отладчика... Ну не было у меня промежуточного звена между вузовской информатикой  на бейсике и фортране четвертьвековой давности и 1С)...
Короче, платформа и передача данных ни при чем. Все оказалось "по Марксу" и было озвучено в этой ветке: подавляющее время сжирало при формировании табличного документа преобразование типов (документ в строку и дата в строку), а также обращение к результату запроса через две точки... Пять минут ушло на преобразование запроса и отчет стал выполняться за 5 секунд. Как говорят доктора: правильный диагноз - 80% успеха лечения... У меня же наложились зависания сервера 1с, устраненные в последствие перезапуском а также то, что в файловом варианте отчет выполнялся в разы быстрее, чем на сервере...
   H A D G E H O G s
 
85 - 24.09.16 - 14:01
Буду этой веткой тыкать в недалеких людей, которые постоянно свистят про свиней на ровном месте.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует