|
Оптимизация контекста формы (Большая таблица) | ☑ | ||
---|---|---|---|---|
0
Очевидно
19.08.14
✎
13:25
|
Доброго времени суток коллеги. Обращаюсь к тем , кто уже сталкивался с проблемой передачи "больших" таблиц на клиента. А именно , ситуация такая :
Есть обработка , которая при открытии показывает справочник номенклатура (около 40 000 поз) , пользователь отмечает необходимые позиции и выбирает процент наценки, по произвольному желанию, и к этим строкам в базе нужно подтянуть "последнюю цену + процент наценки". и отобразить обновленную таблицу (с которой сотрудник работает весь день, т.е. периодически происходит обновление "снуля"). Путем проб и ошибок , была организована кнопка которая , переносит "данныеФормыКоллекция" , размером ~ 26 тыс. строк , и около 20 колонок по 1 типу на колонку (По замерам производительности выдается ~ 10 000 000 как принято , так и отдача), на СерверБезКонтекста. На Сервере (без контекста), эти данные превращаются в ТЗ через "ДанныеФормыВЗначение" подставляются в запрос , происходит выполнение запроса , и далее Результат запроса выгружается обратно в "ДанныеФормыКоллекция" и копируются в реквизит формы на клиенте. Вроде всё по науке, но загрузка такой таблицы на сервер (и на клиент тоже) происходит порядка 10-15 секунд в одну сторону (Запрос выполняется около 1 секунды). После многочисленных тестов уперся в то , что дело в "Большом" объеме трафика , хотя в обычном приложении это происходит практически мгновенно. Итогом по кнопке "Обновить" платформа уходит в "Неответ" на 25-30 секунд. Динамический список тут не подходит т.к. на входе обязательным параметром является таблица формы (Таблица значений), которая активно редактируется и данные после обновления (в некоторых колонках) должны остаться. Перенос таблицы через данные формы - происходит непозволительно долго , получается "Патовая" ситуация. когда "Разделение данных на клиент и сервер" работает в 10-ки раз медленнее чем обычное приложение. В Общем если у кого есть мысли как передавать подобные данные с клиента на сервер и обратно быстрее, помогите плз. |
|||
1
H A D G E H O G s
19.08.14
✎
13:28
|
"После многочисленных тестов уперся в то , что дело в "Большом" объеме трафика "
Недотащили.. Дело в долгой сериализации в XDTO. |
|||
2
Очевидно
19.08.14
✎
13:28
|
* P.S. :
Сервер один , находится в Датацентре, пользователи работают по удаленке , скорость интернета по 1 М/бит на пользователя. |
|||
3
H A D G E H O G s
19.08.14
✎
13:29
|
Сериализация через FastInfoSet дает выигрыш примерно в 2-3 раза.
Только ТонкийКлиент не работает с FastInfoSet-ом, печаль. Поленились. |
|||
4
Очевидно
19.08.14
✎
13:30
|
а сериализацию , есть вариант ускорить ? поидее можно кодом наверно сериализовать , но думаю та , что происходит плаформой при передаче данных (вшитая), должна быть быстрее ручного кода
... или я неправ ? |
|||
5
H A D G E H O G s
19.08.14
✎
13:33
|
(4) Я забил и таскаю данные блоками по 10000 строк.
|
|||
6
H A D G E H O G s
19.08.14
✎
13:33
|
(4) Юзер выбирает, какой блок он обрабатывает.
Для моих 20 колонок это примерно 3-5 секунд задержки. |
|||
7
H A D G E H O G s
19.08.14
✎
13:34
|
Основная таблица храниться на сервере в ВХ.
Многие дубли данных свернуты в Хеш. |
|||
8
Очевидно
19.08.14
✎
13:37
|
ясно , видимо только "кусками" ... =( очередной Fail...
|
|||
9
Очевидно
19.08.14
✎
13:37
|
или может ещё у кого будут мысли ?
|
|||
10
H A D G E H O G s
19.08.14
✎
13:38
|
Но причина в другом.
Ладно бы передача, 20 секунд можно подождать, чё. Я сделал блоками потому что при 100000 строк данныеФормыКоллекция, которая вроде бы на клиенте, при скролле начинает адски тупить сервер 1С. Не стал разбираться. |
|||
11
Очевидно
19.08.14
✎
13:41
|
20 - 30 секунд подождать "обновления" - пользователю , который месяца 2 назад работал на обычном приложении и обновление было 0,5 - 1 секунда , объяснить дескать "подожди уж чё там .. 30 секунд" - обычно проблемно и вызывает кучу негатива от перехода ... на современное "Управляемое приложение".
|
|||
12
H A D G E H O G s
19.08.14
✎
13:43
|
(11) Это я к тому, что 20 секунд не самое страшное :-)
Ладно, это может у нас старенький xeon 2006 года, тупит, а ваш пока нормально переваривает большую таблицу. Но когда-нибудь ... |
|||
13
Очевидно
19.08.14
✎
13:47
|
директор обещал новый сервак , с рейдом на "SSD" , и оперативой в 128 гб ... надежда только на него ... но если и с ним будет такая задержка ... хоть обратно откатывай Обычное приложение )))
|
|||
14
Immortal
19.08.14
✎
13:49
|
Проблема не в 1с, проблема в голове.
40000 строк юзеру не нужны Ему нужны инструменты с ними. Сделайте наглядный инструмент и не отображайте 40000 строк, это бессмысленно. |
|||
15
Immortal
19.08.14
✎
13:50
|
инструменты работы с ними, конечно же-)
|
|||
16
Полотенчик
19.08.14
✎
13:52
|
(13) уверен, что и не надо было переходить на УФ... вебклиент, ради которого и устроили этот геморрой нужен 0,01% пользователей, а страдают все.
|
|||
17
Очевидно
19.08.14
✎
13:54
|
(14) к сожалению пользователь хочет (и раньше мог) работать со всем справочником сразу , и обновлять то , что ему нужно по конкретным отборам , которые все автоматизировать непросто ...
а сейчас я ему должен предложить вот тебе форма отбора , задавай отбор , а я на сервере это обработаю ... и вместо визуализации изменений - дать отчет ... вы это предлагаете ? |
|||
18
Широкий
19.08.14
✎
13:57
|
ХранилищеЗначений, у него сжатие есть
|
|||
19
Immortal
19.08.14
✎
14:00
|
(17) предлагаю прежде всего ответить на простой вопрос: сколько строк можно воспринять быстро визуально?
Допустим, юзер может сразу проанализировать целиком экран(пусть это 40 строк). Между 40 и 40000 очень большая разница. дальше предлагаю посмотреть, каков сценарий работы пользователя с этими строками и какую задачу он хочет решить своими действиями. После этого можно предложить вариант, который устроит и тебя, и его. Если совсем просто делать - можно отображать первые допустим 100 строк по заданному отбору. |
|||
20
H A D G E H O G s
19.08.14
✎
14:02
|
(18) Пофиг.
|
|||
21
H A D G E H O G s
19.08.14
✎
14:04
|
(18) 1С в клиент-сервере само жмет трафик. Либо deflate-ом, либо своим супералгоритмом.
Тут время уходит на сериализацию. В толстом клиенте ее нет. |
|||
22
Очевидно
19.08.14
✎
14:05
|
(21) +1
|
|||
23
Широкий
19.08.14
✎
14:06
|
(21) Пробовал?
|
|||
24
Очевидно
19.08.14
✎
14:12
|
(19) , предположим , пользователь захотел создать документ из этой таблицы по отбору "Без пометки удаления" и "Поставщик такой-то" , пометок удаления всего 1000 шт из 40 000 + с реквизитом "Поставщик такой-то" тыс 15 ... несмотря на то что отбор будет установлен после начального отображения (т.е. вначале полюбому уже таблицу тащить) , после отбора все равно таблица будет ненамного меньше ... и результат .. клик ~ 20 секунд ожидания ... не айс
|
|||
25
Очевидно
19.08.14
✎
14:15
|
(19) , про то что сам документ с такой ТЧ будет открываться ~ 20 сек просто по чтению с сервера... это так сказать расширение проблемы "Контекста"
|
|||
26
H A D G E H O G s
19.08.14
✎
14:42
|
(23) Что пробовал?
|
|||
27
Immortal
19.08.14
✎
14:51
|
(24) у меня документ на 10000 строк открывается менее чем за 1с.
Да и зачем его сразу открывать? Это по сценарию работы? Опиши его что касается отборов - они- на форме. равно как и критерии для отбора. |
|||
28
Drac0
19.08.14
✎
14:55
|
(0) А почему не юзать ДС?
|
|||
29
Очевидно
19.08.14
✎
17:05
|
(28) ДС ? расшифруйте абривиатуру плз.
|
|||
30
Очевидно
19.08.14
✎
17:07
|
(24) "Да и зачем его сразу открывать? Это по сценарию работы? Опиши его "
очень напоминает ситуацию с Apple ... "а зачем вам карта памяти ? зачем вам возможность сменить аккумулятор !? .. мы считаем вам это ненужно ..." |
|||
31
Адский плющ
19.08.14
✎
17:17
|
(14) +100500
|
|||
32
ptiz
19.08.14
✎
17:27
|
Грустно.
Остается единственное решение - уменьшать кол-во гоняемых строк таблицы. p.s. запишу в копилку для будущих срачей "УФ vs обычные формы". |
|||
33
Lexusss
19.08.14
✎
17:27
|
Бред какой то. В серверном контексте формы хранится вся твоя таблица. На клиенте - только то, что видел или обрабатывал пользователь. По твоей волшебной кнопке надо делать контекстный серверный вызов, а в нем уже выгружать из данных формы в ТЗ. Тут и сериализоваться ничего не будет. После выполнения кода на сервере, на клиент уедет лишь видимая часть таблицы.
Все это не сработает, если ты на клиенте серьезно изменяешь эту таблицу (например конструкция Для каждого) без серверного вызова. Такие обработки следует выполнять исключительно на контексте формы сервера. |
|||
34
Drac0
19.08.14
✎
17:28
|
(29) Динамический список
|
|||
35
Полотенчик
19.08.14
✎
17:28
|
(29) Динамический список
(32) УФ - для ларька жи.. Для бизнеса (зарабатывания денег) только обычные формы. Если надо удаленно, то только RDP по 150 долл на пожизненную лицензию. |
|||
36
Господин ПЖ
19.08.14
✎
17:29
|
(30) и они правы
|
|||
37
Господин ПЖ
19.08.14
✎
17:30
|
40000 строк в gui - это рехнуться можно...
|
|||
38
acsent
19.08.14
✎
17:33
|
(35) Когда останутся только одни уф, да еще и такси. А ты их знать не будешь. Ты останешься не у дел
|
|||
39
Очевидно
19.08.14
✎
17:54
|
(34) (28) - Динамический список не может иметь ВТ , а без них нет никаких ТЗ в запросе , а это не подходит по условию задачи ...
|
|||
40
Drac0
19.08.14
✎
17:57
|
(39) По условию задачи (как я понимаю) функционала запросов ДС достаточно. О каких ТЗ в запросе идет речь?
|
|||
41
Очевидно
19.08.14
✎
18:01
|
(33) ты неправ , "По твоей волшебной кнопке надо делать контекстный серверный вызов, а в нем уже выгружать из данных формы в ТЗ. Тут и сериализоваться ничего не будет"
в момент контекстного серверного вызова , у тебя начинается передача ВСЕГо контекста формы (а не только таблицы) на сервер , и при загрузке обратно на форму мы ловим обратную сериализацию (на сервере у нас ТЗ (результат запроса) , и без сериализации на клиенте их не получить (кроме как через ДС , который не имеет ВТ). Таким образом без каких - либо особых циклов на клиенте , мы имеем двустороннюю сериализацию (хотя цикл на самом деле есть , типа установить наценку в выбранных строках , и вобщем то по результатам этих циклов , таблица меняется и далее происходят какие-то действия, например создать заказ поставщику) |
|||
42
Очевидно
19.08.14
✎
18:04
|
(40) => (0) , "пользователь отмечает необходимые позиции и выбирает процент наценки, по произвольному желанию, и к этим строкам в базе нужно подтянуть "последнюю цену + процент наценки". и отобразить обновленную таблицу (с которой сотрудник работает весь день". Таблица - выбранные пользователем строки , по придуманному из головы отбору , с какими то значениями , которые введены на клиенте.
|
|||
43
H A D G E H O G s
19.08.14
✎
18:04
|
(41) Надеюсь. Ты когда сервер вызываешь внеконтекстно, все переменные ты передаешь по значению?
|
|||
44
H A D G E H O G s
19.08.14
✎
18:04
|
(43) Даже не все, а только "тяжелые"
|
|||
45
Очевидно
19.08.14
✎
18:06
|
(43) при вызове внеконтекстной серв. процедурины - передаю "данныеФормыКоллекция" , одна конкретная таблица , которая сразу падает в запрос
|
|||
46
Drac0
19.08.14
✎
18:07
|
(42) У ДС есть свойство ВыбранныеСтроки, через которые получишь массив ссылок товар. Через ПоказатьВводЧисла вызываешь ввод этой наценки и с массивом в качестве параметра вызываешь безконтекстную процедуру обновления данных наценки.
|
|||
47
H A D G E H O G s
19.08.14
✎
18:10
|
(45) Она потом лезет обратно, на Клиент, после отработки серверного вызова, если у параметра не поставлено ЗНАЧ. Так и задумано, надеюсь?
|
|||
48
Очевидно
19.08.14
✎
18:20
|
(45) , ну на сервере , я в него загружаю ТЗ результат запроса (Через ЗначениеВДанныеФормы) и он в этом виде возвращается на клиент , где копируется на форму.
|
|||
49
Очевидно
19.08.14
✎
18:53
|
(46) это если нам выбранные значения нужно в массив ссылок на товар записать , и после обновления пользователь увидит скорректированные данные , да это прокатит , но данные в этой таблице нужны сейчас , без записи в базу , для подстановки в тот же документ, (пример "влоб" , пользователь выбрал товары по поставщику 1 проставил значение , выбрал по поставщику 2 , проставил значения , создал документ , обновил таблицу - данные сбросились.)
|
|||
50
Lexusss
19.08.14
✎
20:12
|
(41) На сервере хранится весь контекст. При контекстном сервером вызове передается не вся форма, а только изменения (с оптимизацией для тонких каналов). Итак, никакой сериализации этой злой таблицы.
На клиент передается только ВИДИМАЯ часть таблицы значений. Это четко отслеживается при пролистывании со включенным счетчиком серверных вызовов. Собственно, это же прямо описано в талмуде про оптимизацию управляемых форм. Таким образом, на клиента так же ничего жуткого не уходит. Таблицу делаем реквизитом формы. Работаем с данными на сервере. Профит. Никаких жутких вызовов. На самом деле, за счет этих механизмов сама платформа делает то, о чем говорит Immortal в (19). Вообще, в серверных вызовах передача массивных параметров - жуткий моветон. В большинстве случаев, выгоднее держать их в реквизитах формы и делать контекстные вызовы. ПЫСЫ: Вообще, советую пересмотреть смысл существования этой таблицы в 40 тыщ строк. Приятнее вывести на форму те самые фильтры, по которому клиент выполняет поиск, и отражать уже нужные товары, а не злющий список. |
|||
51
Drac0
19.08.14
✎
21:50
|
(49) Хм, сдаюсь. Через ж*пу, так через ж*пу.
|
|||
52
Полотенчик
19.08.14
✎
22:44
|
(38) в том-то и дело, что приходится тратить время (читай деньги работодателя) на эту технологию ради технологии. сам, естественно, категорически против, ибо абсолютно никакого профита она не приносит
|
|||
53
Diversus
19.08.14
✎
23:19
|
(0) Подумай на динамическим списком и редактированием реквизитов строки в отдельной форме, если по другому никак...
|
|||
54
H A D G E H O G s
19.08.14
✎
23:29
|
(50)
1) Вы не работали с достаточно большими таблицами. 2) Вы можете продолжать читать мантру "Вам это не надо". |
|||
55
H A D G E H O G s
19.08.14
✎
23:30
|
(50) 3) Вы не понимаете, что такое сериализация :-)
|
|||
56
mistеr
20.08.14
✎
01:29
|
Тут проблема явно в дизайне интерфейса. Пользователь просто привык, работая с обычными формами, к тому, что кроме гигантского списка в 40к строк у него ничего нет. И как-то приучил себя бегать по нему туда-сюда. А между тем, если ему дать грамотно спроектированный UI, он мог бы свои задачи решать гораздо эффективнее.
К сожалению, 1С-ников этому не учат. |
|||
57
milan
20.08.14
✎
02:36
|
(56) наверняка можешь предложить на выбор 5 решений, но к сожалению не будешь учить одинэсников
|
|||
58
Drac0
20.08.14
✎
07:25
|
(54) имхо, стремление пользователя к таблицам в тысячи строк - это пережитки работы в Екселе. В 99,999% случаев. Это лечить надо, а не потакать.
|
|||
59
Очевидно
20.08.14
✎
10:33
|
(58) , (56) - да , примерно так и есть , но вот что думаю об лечении "хотелок" : если человек привык приносить пользу компании и ему удобнее это делать именно ТАКИМ способом и в таком виде (форма и способ работы обычно складывается из бизнес процессов компании и численности сотрудников) ... то имхо дело 1С-ника , если уж пошли на переход на новую платформу , - реализовать функционал , при котором пользователь уже и без новых "Витков обучений" будет как рыба в воде. ИМХО 1С , всётаки для пользователей , и от их "хотелок" часто зависит бизнес в целом.
|
|||
60
Drac0
20.08.14
✎
10:37
|
(59) Если система внедряется, значит, текущие возможности по автоматизации не устраивают, не?
|
|||
61
Очевидно
20.08.14
✎
10:41
|
(59) Не совсем так ) пользователей всё устраивает , была самописка , которая прошла через руки нескольких поколений 1-С-ников. Вопрос в том что никто не значет что и где в этой самописке отрабатывает , но бизнеспроцессы вроде идут. Вот руководство и решило актуализировать "самописку", "Что бы побыстрее и поновее и понятно что для кого и где ..".
|
|||
62
Очевидно
20.08.14
✎
10:41
|
(61) => (60)
|
|||
63
toypaul
гуру
20.08.14
✎
10:46
|
Загрузи в регистр сведений. Некрасиво, зато будет ДС.
|
|||
64
H A D G E H O G s
20.08.14
✎
10:47
|
(61) 1C ники пытаются подменить технологическую проблему организационной. Психологическая деформация уровня "я тут самый умный". Понять и забить. Но прощать нельзя.
|
|||
65
H A D G E H O G s
20.08.14
✎
10:48
|
(63) С разделением по пользователям? Да ты шутник.
|
|||
66
acsent
20.08.14
✎
10:52
|
(64) нука расскажи нам технологическое решение проблемы?
|
|||
67
toypaul
гуру
20.08.14
✎
10:53
|
все-таки сделай регистр сведений. даже несмотря на мнение некоторых "суперспецов" тут на форуме.
это просто из описания логики работы с этой ТЗ вытекает. |
|||
68
acsent
20.08.14
✎
10:54
|
Из существующих механизмов (67) самый хорший
|
|||
69
H A D G E H O G s
20.08.14
✎
11:00
|
(66) Передавать на клиент блоками.
(68) Это "хороший" механизм будет работать ну на 5 пользователях, может быть. А скорее всего и нет. |
|||
70
Очевидно
20.08.14
✎
11:10
|
(67) если по логике 1С что такие таб. должны быть в ДС - тогда наверно да, РС подходит. Но прям как-то не красиво совсем ...
Данные , которые посути хранить ненужно , будут проходить через запись / удаление ... Будем думать ... |
|||
71
H A D G E H O G s
20.08.14
✎
11:12
|
(70) Вы попробуйте. Потом напишите.
У вас же несколько пользователей будет работать? |
|||
72
Очевидно
20.08.14
✎
11:13
|
(71) 3-е, в общем попробую оба варианта, потом отпишусь как сделали...
Всем спасибо за участие , у меня по теме всё ). |
|||
73
toypaul
гуру
20.08.14
✎
11:17
|
(70) Если не хранить, то чет не догоняю тогда. Как пользователь может за один раз из 40 тыр наотмечать сразу 26 тыр строк? Не хранить это значит отметить и вывести в отчет. Это не хранить.
А если отметить, прицепить наценку и работать в течение дня это уже хранить. |
|||
74
Очевидно
20.08.14
✎
11:22
|
(73) "Не хранить это значит отметить и вывести в отчет" , примерно так , только не в отчет , а в документ. После чего продолжить работу уже по другому условию , с другими контрагентами ("кому-то на такой-то товар сейчас можно скинуть 5%" и подобное ... маркетологи).
|
|||
75
toypaul
гуру
20.08.14
✎
11:26
|
(74) хм. есть мысль, что если вникнуть в задачу более глубоко можно придумать и более красивое решение.
в частности не понятно пользователи могут редактировать данные по одной номенклатуре одновременно или нет. |
|||
76
acsent
20.08.14
✎
11:28
|
(69) в чем проблему видишь?
|
|||
77
H A D G E H O G s
20.08.14
✎
11:30
|
(76) Проблему вижу в записи 40000 строк и эскалации блокировки на всю таблицу.
|
|||
78
Очевидно
20.08.14
✎
11:30
|
(75) могут , это 3 человека с примерно равным функционалом. т.е. все 3-е могут одновременно по той или иной номенклатуре проставить разные значения в одной колонке (т.к. документ уйдет по разным контрагентам и разным договорам).
|
|||
79
H A D G E H O G s
20.08.14
✎
11:31
|
Да и просто записать 40000 строк - это не секундное дело.
|
|||
80
Очевидно
20.08.14
✎
11:57
|
(75) если вникнуть во все тонкости , то наверно было бы наиболее правильно разделить функционал установки условии и отгрузки , в этом случае у нас и история "Кто , что проставил" будет , и сотрудникам вроде как ничего при создании документов проставлять не надо , а данные по условиям брались из места , где всё это валяется. Но это скорее всего приведет к потребности наёма специально обученного человека , который будет это проставлять , а на "это" идут неохотно (если раньше это делали 3 , то после обновления это будут делать 4+ человека , да ещё и медленнее в 2 раза ))) хорошая оптимизация получается ...)
|
|||
81
Полотенчик
20.08.14
✎
12:33
|
(61)"Что бы побыстрее и поновее и понятно что для кого и где .."
ахаха. "побыстрее" и "УФ" в одном предложении не надо использовать. как я и писал выше, руководство решило внедрить трехнологию только ради технологии, без профита для бизнеса. россиянские бизнесмены такие бизнесмены.... |
|||
82
stix2010
20.08.14
✎
12:34
|
(0) Только мне одному кажется, что в форме должна быть еще одна ТЗ с передачей данных только по изменяемому?
|
|||
83
Очевидно
20.08.14
✎
13:27
|
(82) Вариант про ДС на основной список + ТЗ на форме, куда бы писались изменения, введеннные пользователем , а при создании документа - обрабатывать на сервере спр-к номенклатуры + ТЗ измененных данных тоже как вариант на самом деле + условным оформлением выводить текст итоговых значений в нужные колонки ДС'а... попробуем идея неплоха.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |