Имя: Пароль:
1C
1С v8
Получение данных из хранилища значений
0 Широкий
 
07.02.12
16:54
Перем мЯваСкрипт;
//--------------------------------------------------------------------//

Процедура Тест2()
   ВремяНачала = мЯваСкрипт.Eval("(new Date()).valueOf()");    
   
   Запрос=Новый Запрос;
   Запрос.УстановитьПараметр("Ссылка",Серия);
   
   Запрос.Текст="ВЫБРАТЬ
   |    Образы.Образ
   |ИЗ
   |    Справочник.Серии.Образы КАК Образы
   |ГДЕ
   |    Образы.Ссылка = &Ссылка
   |
   |УПОРЯДОЧИТЬ ПО
   |    Образы.НомерСтроки";
   
   Результат=Запрос.Выполнить();
   
   Выборка=Результат.Выбрать();
   Пока Выборка.Следующий() Цикл
       ТекКартинка=Выборка.Образ.Хранилище.Получить();
   КонецЦикла;
   
   ВремяКонцаВыполнения = мЯваСкрипт.Eval("(new Date()).valueOf()");
   
   Сообщить("Получение из ссылки "+Формат((ВремяКонцаВыполнения - ВремяНачала) / 1000, "ЧДЦ=3; ЧРД=.; ЧН=0; ЧГ="));
КонецПроцедуры

Процедура Тест1()
   ВремяНачала = мЯваСкрипт.Eval("(new Date()).valueOf()");    
   
   Запрос=Новый Запрос;
   Запрос.УстановитьПараметр("Ссылка",Серия);
   
   Запрос.Текст="ВЫБРАТЬ
   |    Образы.Образ.Хранилище
   |ИЗ
   |    Справочник.Серии.Образы КАК Образы
   |ГДЕ
   |    Образы.Ссылка = &Ссылка
   |
   |УПОРЯДОЧИТЬ ПО
   |    Образы.НомерСтроки";
   
   Результат=Запрос.Выполнить();
   
   Выборка=Результат.Выбрать();
   Пока Выборка.Следующий() Цикл
       ТекКартинка=Выборка.ОбразХранилище.Получить();
   КонецЦикла;
   
   ВремяКонцаВыполнения = мЯваСкрипт.Eval("(new Date()).valueOf()");
   
   Сообщить("Получение из запроса "+Формат((ВремяКонцаВыполнения - ВремяНачала) / 1000, "ЧДЦ=3; ЧРД=.; ЧН=0; ЧГ="));
КонецПроцедуры

Процедура КнопкаВыполнитьНажатие(Кнопка)
   мЯваСкрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
   мЯваСкрипт.Language = "javascript";

   Тест1();
   
   Тест2();
КонецПроцедуры

Результаты:
Получение из ссылки 29.784
Получение из запроса 46.047
Получение из ссылки 0.208
Получение из запроса 42.055


Не могу понять:
1. Почему запросом данные считываются дольше?
2. Почему результат запроса не кешируется?
1 asady
 
07.02.12
17:13
(0) файловая/скуль??
2 Широкий
 
08.02.12
09:45
(1) Скуль
3 mikecool
 
08.02.12
09:47
(2) а данные блобов кешируются вообще?
4 aleks-id
 
08.02.12
09:49
Справочник.Серии.Образы.Образ.Хранилище.Офигеть!!!
5 aleks-id
 
08.02.12
09:50
нефиг такие вещи запросами дергать. ссылка же есть уже - дергай из ссылки
6 mikecool
 
08.02.12
09:51
(5) дык, блоб по ссылке все равно запросом вытянется
7 mikecool
 
08.02.12
09:51
+6 ибо не выбирается при получении ссылки
8 Широкий
 
08.02.12
09:53
(2) Судя по получению данных из ссылки -все же кешируются
(5) Ты похоже сути не понял
9 Широкий
 
08.02.12
09:56
Единственное что приходит в голову - у запроса есть ограничение на объем получаемой выборки. Если объем превышает какого -то порога - идет что то типа свопа.
10 aleks-id
 
08.02.12
10:00
(8) да понял я. у тебя есть справочник с табчастью, где ты хранишь какие то двоичные данные. если ты дергаешь ссылку на строку тч - происходит кэширование, если дергаешь сразу данные - кэширование не происходит.
11 aleks-id
 
08.02.12
10:04
+10 ты попробуй все же так

Процедура Тест3()
   ВремяНачала = мЯваСкрипт.Eval("(new Date()).valueOf()");    
   
   ТекТЧ = Ссылка.Образы;
   Для Каждого СтрТЧ Из ТекТЧ Цикл
       ТекКартинка=СтрТЧ.Хранилище.Получить();
   КонецЦикла;
   
   ВремяКонцаВыполнения = мЯваСкрипт.Eval("(new Date()).valueOf()");
   
   Сообщить("Получение без запроса "+Формат((ВремяКонцаВыполнения - ВремяНачала) / 1000, "ЧДЦ=3; ЧРД=.; ЧН=0; ЧГ="));
КонецПроцедуры
12 Широкий
 
08.02.12
10:06
(10) Не так.
Есть справочник "Серии". У него есть табличная часть "Образы".
У табличной части реквизит "Образ" - это справочник ХранилищеДопИнформации (где изображение собсно и лежит).

В запросе все это видно
13 aleks-id
 
08.02.12
10:08
(12) в (11) -> СтрТЧ.Образ.Хранилище.Получить()
14 Широкий
 
08.02.12
10:11
(11) Здесь уже заведомо не айс.. Мне считывать весь элемент справочника серии не нужно
15 Широкий
 
08.02.12
12:07
^