Имя: Пароль:
1C
 
Где хранится таблица значений?
,
0 Darchick
 
12.10.15
07:31
Добрый день! Подскажите пожалуйста где физически во время обработки хранится Таблица значений в клиент-серверном варианте. На сервере базы данных или на сервере 1С:Предприятия?  В оперативной памяти, кэше или еще где-то? Не могу найти информацию по этому поводу.
1 jurassic
 
12.10.15
07:31
в памяти
2 Darchick
 
12.10.15
07:32
В памяти сервера 1С?
3 VladZ
 
12.10.15
07:34
Правильный ответ: там! :)
4 GROOVY
 
12.10.15
07:34
На серевере, в озу. если квота вышла то на харде в темпах.
5 ЧеловекДуши
 
12.10.15
07:38
(0) Если про реквизит Формы. То на клиенте.
Если про то, что обрабатывается по директиве "&НаСервере", то все перемещается на Сервер и обрабатывается на сервере :)

Вообще все это как-то не оптимально, реализовано. Почему нельзя объявить реквизиты формы, которые не надо перемещать на сервер. Или делать это выборочно, по списку :)
6 jurassic
 
12.10.15
07:40
(5) а что, уже нельзя?
7 GROOVY
 
12.10.15
07:41
(5) На клиенте не хранится ТЗ. Там есть часть сериализованных данных.
8 GROOVY
 
12.10.15
07:42
(5) И на клиенте вообще ничего не хранится, это, по сути, браузер.
9 Darchick
 
12.10.15
07:44
(4) Теоретически я так и думала, а вот практически при выполнении кода две конфигурации, расположенные на разных серверах БД, но исполняемые на одном сервере 1С дают разное время


код (упрощенно)

&НаСервере
Процедура ВыполнитьЗапросНаСервере()

Запрос=Новый Запрос();
Запрос.Текст="ВЫБРАТЬ
             |    ВнутренниеДокументы.Ссылка
             |ИЗ
             |    Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы" ;
        
ТЗ=Запрос.Выполнить().Выгрузить();

Время1 = ТекущаяУниверсальнаяДатаВМиллисекундах();    
Для каждого стр из ТЗ цикл
а1=стр.ссылка;
конеццикла;
Время2 = ТекущаяУниверсальнаяДатаВМиллисекундах();

Время=(Время2-Время1)/1000;
Сообщить(Время);    
КонецПроцедуры

Данные абсолютно одинаковые
10 GROOVY
 
12.10.15
07:47
Darchick, для чистоты эксперимента замеряйте без контекста и с перезапуском сервера.
Ну и "сообщить" на сервере - это атавизм.
11 jsmith82
 
12.10.15
07:47
(9) И щито?
12 GROOVY
 
12.10.15
07:48
Кстати, нафига запрос в ТЗ выгружать? 1С всячески  рекомендует выборку юзать.
13 Darchick
 
12.10.15
07:51
(10) ОК попробую
(12) Это дает лучшую производительность?
14 GROOVY
 
12.10.15
07:52
(13) Естественно. Выборка порционна. Обычно за такой код увольняют.
15 jsmith82
 
12.10.15
07:53
(12) А почему бы и нет? Удобно вполне. Можно курсор юзать по индексу. Щас-то уже не 640 кб ОЗУ на дворе.
16 jsmith82
 
12.10.15
07:53
(14) Фигня это. За это не увольняют, а снижают балл на экзамене по платформе.
17 GROOVY
 
12.10.15
07:54
(16) А почему?!

Коллеги, когда у вас в выборке 20 строк - то пофиг. Когда 20млн - тогда глаза открываются.
18 GROOVY
 
12.10.15
07:56
ТЗ из запроса = созданию второго (дубля) объекта, не сериализуемого в памяти на сервере. При том, что он уже есть и вполне себе сериализуем.
19 Darchick
 
12.10.15
07:58
(17) Полностью согласна, но мне нужно было четко разделить время обращения к БД и исполнения на сервере. Насчет выборки была не уверена, а ТЗ всегда думала что хранится на сервере 1С.
20 Darchick
 
12.10.15
07:59
(17) Поэтому результат и удивил
21 jsmith82
 
12.10.15
08:04
Причём тут код в (9) и ТЗ на сервере 1с?
22 GROOVY
 
12.10.15
08:08
ТЗ на клиенте нет. В принципе.
23 Darchick
 
12.10.15
08:09
(21) ТЗ=Запрос.Выполнить().Выгрузить(); Выгружает результат запроса в таблицу значений
24 jsmith82
 
12.10.15
08:09
(23) Ну и чо? Две базы на разных серверах СУБД. Код на сервере 1с.
25 jsmith82
 
12.10.15
08:10
Груви сказал - ТЗ хранится на сервере 1с в ОЗУ, всё.
26 jsmith82
 
12.10.15
08:11
Откуда такие вопросы вообще в (0)? Прям озадачилась. Биты в памяти менять через ассемблер собралась что ли
27 GROOVY
 
12.10.15
08:15
(25) Не все. Может упасть на хард.
28 jsmith82
 
12.10.15
08:16
(27) Ну, файл подкачки тоже ОЗУ
29 Darchick
 
12.10.15
08:17
(26) Нужно сравнить производительность 2 серверов БД. Код слегка переукоротила было примерно вот так:


&НаСервере
Процедура ВыполнитьЗапросНаСервере()
Время0 = ТекущаяУниверсальнаяДатаВМиллисекундах();
Запрос=Новый Запрос();
Запрос.Текст="ВЫБРАТЬ
             |    ВнутренниеДокументы.Ссылка
             |ИЗ
             |    Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы" ;
        
ТЗ=Запрос.Выполнить().Выгрузить();

Время1 = ТекущаяУниверсальнаяДатаВМиллисекундах();    
Для каждого стр из ТЗ цикл
а1=стр.ссылка;
конеццикла;
Время2 = ТекущаяУниверсальнаяДатаВМиллисекундах();

ВремяЗапроса=(Время1-Время0)/1000;
ВремяОбработки=(Время2-Время1)/1000;
  
КонецПроцедуры

Изначально предполагалось что времяЗапроса будет отличаться, а времяОбработки останется примерно одинаковым, а вот вышло наоборот. Не могу понять почему
30 GROOVY
 
12.10.15
08:18
И где тут обработка?
31 GROOVY
 
12.10.15
08:19
В коде все делается на сервере, копируется массив данных, непонятно зачем, и перебирается по индексированному полю. В принципе тормозить должно.
32 GROOVY
 
12.10.15
08:20
*31 по НЕ индекированному
33 jsmith82
 
12.10.15
08:23
(29) Производительность двух серверов БД - окей...
Делаешь одну обработку и гоняешь её на две базы, что и делаешь
Теперь догнал
34 jsmith82
 
12.10.15
08:24
То бишь запрос у неё одинаково работает, а итерация по ТЗ не одинаково. И она подозревает, что ТЗ хранится в памяти сервера БД
35 jsmith82
 
12.10.15
08:24
А количество строк в ТЗ одинаковое?
36 GROOVY
 
12.10.15
08:25
Какие все подозрительные.
Не проще ли посмотреть, что сервер получает и как хранит?
37 organizm
 
12.10.15
08:27
эххх, поколение пепси.
38 organizm
 
12.10.15
08:28
их бы запустить поработать с ASP.NET глаза бы открылись на мир...
39 jsmith82
 
12.10.15
08:28
(32) Без разницы тут. Просто УИД
40 jsmith82
 
12.10.15
08:28
(38) А чо там? Я работал в 2008 г. Чото крутое?
41 organizm
 
12.10.15
08:29
позволяет понять возможности клиента и сервера, что можно и что нельзя. а то все 1С плохое...
42 gigi789
 
12.10.15
08:32
(9) Для такого кода запрос не нужен, достаточно Справочники.ВнутренниеДокументы.Выбрать();
43 gigi789
 
12.10.15
08:33
(8) ой-ли. А зачем же позвольте вас спросить гуру мы кеши всякие чистим??
45 H A D G E H O G s
 
12.10.15
08:37
Вполне кошерно выгружать запрос в тз. Ведь вы же максимально фильтруете его и на выходе у нас пара сотня строк, не больше. Не так ли Грувви?
46 gigi789
 
12.10.15
08:37
(30) Человек смотрит 1) скорость выполнение кастериндексскана
2) перебор тз
Как варик пишет обоснование увеличения опреративы. Типо бла бла добавите 10 гигов и вот этот код начнет выполнятся быстрее.
47 NcSteel
 
12.10.15
08:39
(45) Пара сотня не критична, миллионы критично
48 jsmith82
 
12.10.15
08:41
10 млн доков / 365 дней = 27 доков в день
49 H A D G E H O G s
 
12.10.15
08:41
(47) еще раз. Миллионов у вас не должно быть. Никогда.
50 gigi789
 
12.10.15
08:41
(45) Еще очень кошерно делать выборку для заполнения тч документа, и не в коем случаи не пользоваться ЗаполнитьЗначенияСвойств(). Ибо тру 1сники зп получают от времени и количества строчек кода.
51 jsmith82
 
12.10.15
08:41
*27 тыщ в день
52 NcSteel
 
12.10.15
08:42
(49) Почему? А если обмен?
53 User_Agronom
 
12.10.15
08:42
(0) У меня тут СП завалялось какое-то. Оттуда:

"ТаблицаЗначений (ValueTable)
...
Доступность:

Сервер, толстый клиент, внешнее соединение.
..."

Так что (7) не совсем верно. При работе в обычных формах ТЗ нормально живёт на клиенте.
54 jsmith82
 
12.10.15
08:43
Причём тут обмен?
55 Провинциальный 1сник
 
12.10.15
08:43
(17) Когда у вас в выборке 20 млн строк - то само её существование говорит о том, что запрос написан неверно)
56 NcSteel
 
12.10.15
08:44
(54) При том, что для обмена могут потребоваться запросы с выборкой данных
57 NcSteel
 
12.10.15
08:44
(55) Ложь
58 Лефмихалыч
 
12.10.15
08:44
(49) ни когда не говори ни когда
59 NcSteel
 
12.10.15
08:44
(58) +100500

Поражают крайне критические выводы
60 Лефмихалыч
 
12.10.15
08:45
вообще. автор занимается хернёй.
61 H A D G E H O G s
 
12.10.15
08:46
Автор, ответ на твой вопрос:
Dbcc cleanbuffers

На сервере mssql между тестами
62 jsmith82
 
12.10.15
08:47
(53) Компиляция прям для клиента?
63 H A D G E H O G s
 
12.10.15
08:47
(52) порционные запросы в цикле
64 jsmith82
 
12.10.15
08:47
А, ну да
65 Провинциальный 1сник
 
12.10.15
08:48
(57) Нет. Язык запросов разрабатывался не для того, чтобы выдавать сырые данные огромного размера. Делать "ВЫБРАТЬ * ИЗ РегистрБухгалтерии.Хозрасчетный" и переборка выборки - еще более неверно, чем выгрузка в ТЗ.
66 gigi789
 
12.10.15
08:49
(54) по ком тянем в соседнюю базу данные например. Достаточно удобно запрос выгрузить в тз, тз в строку из строки и вот у вас тз на той стороне.
67 NcSteel
 
12.10.15
08:50
(65) Кто тебе сказал, что 20 млн это сырые данные? Самая настоящая выжимка того что надо
68 Лефмихалыч
 
12.10.15
08:50
(65) язык-то может и разрабатывался так, но вот только изобретатели всяких форм отчетности типа алкогольной об этом не в курсе, по этому выборки в миллионы строк таки иногда бывают
69 H A D G E H O G s
 
12.10.15
08:51
(22) из на клиенте в принципе есть, Грувви.
70 H A D G E H O G s
 
12.10.15
08:51
(66) а вот этого делать нельзя.
71 gigi789
 
12.10.15
08:52
(66) Согласен с тем что это нужно делать порционо и желательно много поточно.
72 NcSteel
 
12.10.15
08:52
(63) Не факт, что будет быстрее, а код усложняет....
73 gigi789
 
12.10.15
08:52
(70) почему??
74 Провинциальный 1сник
 
12.10.15
08:52
(70) Отличнейшее решение, что оно вам не нравится? Сериализация-десериализация позволяет избавиться от кучи проблем типа плавающей точки при передаче рублей.
75 User_Agronom
 
12.10.15
08:53
(62) Не понял, что хотел ты сказать.
А так да: в обычных формах ТЗ можно сформировать на клиенте и там с ним работать.
(22) О сколько нам открытий чудных, готовит просвещения дух!
Но это явно не тот случай.
76 H A D G E H O G s
 
12.10.15
08:54
(74) сериализация идет в неепияеской длины строку, которую надо Каждый раз при сериализации гдето разместить в памяти.
77 Лефмихалыч
 
12.10.15
08:55
+(76) при чем - два раза разместить, ведь ее же потом передают из процесса в процесс
78 jsmith82
 
12.10.15
08:56
Прерву вашу баталию, миллионы строк вполне живут в ТЗ на сервере и робят
Если у фирмы миллионы строк, пусть ставят хороший сервер
79 H A D G E H O G s
 
12.10.15
08:59
(77) ты немного не понял. Реаллокация в памяти происходит каждый раз, когда к строке добавляется другая строка. Как раз, когда готовая строка отправляется в другой процесс ничего страшного.
80 NcSteel
 
12.10.15
09:04
(79) Ну и че? ))) пусть хоть переварачивает сервер, от этого он не помрет и отработает....

Я открою секрет, то даже гото можно использовать.
81 DmitrO
 
12.10.15
09:28
(27)На сколько я помню, 1С говорила, что на хард может упасть результат запроса, а не ТЗ.
82 Живой Ископаемый
 
12.10.15
10:37
(81) А с МайкроСофтом они об этом договорились?
83 Garykom
 
гуру
12.10.15
11:31
(9) и ни у кого не возникло подозрения что подобный код вполне зависим от сервера бд?
или хотите сказать что в платформе 1С нет никакой оптимизации, кеширования и прочих многопоточных хр..й?

переброска данных полученных запросом с сервера бд, на сервер 1С в ТЗ занимает какое то время

возможно сделана оптимизация в платформе

что сначала в ТЗ создаются пустые элементы в нужном кол-ве (из запроса), и только потом они в фоне начинают заполнятся данными с сервера бд
причем если пытаются прочитать строку из ТЗ которая еще не заполнена, то задержка будет, пока ее с сервера вне очереди не прочитают

ЗЫ это просто размышления...
84 Фокусник
 
12.10.15
11:36
(43) а что, у браузеров нет кешей? ;)
85 hhhh
 
12.10.15
11:42
(83) думаете там по одной строке передается? По идее по 5-10 тыс строк должно сразу в одной порции.
86 Necessitudo
 
12.10.15
11:46
(25) А разве не в буферном пуле СУБД хранится таблица значений?)
87 gigi789
 
12.10.15
11:54
(84) а что разве в них не чего не хранится??
88 Живой Ископаемый
 
12.10.15
12:14
2(26) если мы ее помещаем в параметр запроса для ВТ? наверное да, в нем