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

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

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

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

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

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

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

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

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

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

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

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

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

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

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