Имя: Пароль:
1C
 
v8: Сегодня только узнал что 1С82 умеет кэшировать вызовы функций, офигел
0 Гений 1С
 
гуру
24.10.08
11:10
1. Я знал 0% (0)
2. Я не знал, в 1С много гитек оказывается 0% (0)
3. Другое 0% (0)
Всего мнений: 0

Причем этим кэшированием можно управлять, кэшируемые функции нужно выносить в специальные модули.
Правда кэш она хранит пять минут только в случае бездействия, это плохо.
Но т.к. нет глобальных серверных переменных, такая хрень достаточно полезна...
Интересно, чего там еще такого есть, скрытого!
1 ТелепатБот
 
гуру
24.10.08
11:10
2 mikecool
 
24.10.08
11:12
(0)  ссылку на описание
3 Гений 1С
 
гуру
24.10.08
11:16
(2) Нету ссылки. Мне сказали...
4 Гений 1С
 
гуру
24.10.08
11:16
Т.е. типо если Ф(А,Б,В) то в следующий раз Ф(А,Б,В) не вычисляется, а возвращается ранее вычисленный результат. Без изменения кода можно увеличивать производительность.
5 ДенисЧ
 
24.10.08
11:17
А если в этой Ф() считаются остатки по регистрам? Тоже кешируется?
6 ДенисЧ
 
24.10.08
11:17
ЗЫ. "гитик" пишется через И :-)
7 ОчкарикСлава
 
24.10.08
11:22
Много чего кэшируется, описано в практич. пособии разработчика, читал гдето когдато...
8 Rovan
 
гуру
24.10.08
11:22
(+5) или ищется некий элемент(ы) справочника (по фильтру) или документ по номеру :-)
9 Rovan
 
гуру
24.10.08
11:25
(7) недано обсуждали про кеширование объектов (документ, справочник)
10 IamAlexy
 
24.10.08
11:26
а еще 8ка бизнеспроцессы умеет...
много бизнеспроцессов в типовых? :)
11 nop
 
24.10.08
11:27
(0) Что значит "кэшировать функции" ?? Результат функции кэшировать очень сложно.
Кэшируется код? Вот это полезность, так полезность...
12 IamAlexy
 
24.10.08
11:29
вопрос в том что есть кеширование функции.. если значение какоелибо то нафига его кешировать если можно в переменную записать.
если объект - то чем это отличается от кеширования объектов???

соответственно функция вызывается тогда когда нужно именно что то новое получить... все старье в переменных... накой фиг ее кешировать то? :)

Другое
13 H A D G E H O G s
 
24.10.08
11:32
(3) Мне вчера сказали, что всех Гениев 1C, а также Гениев 1АБ, и также Гениев 18+ отправляют на Байкал омуля добывать.. Ссылку привести тоже не могу.
14 Rovan
 
гуру
24.10.08
11:35
(11) как это Кэшируется код?
код в смысле 1С.exe ? - за это мс вынь отвечает
или код в конфа ? - дык она в пять грузится вся
15 nop
 
24.10.08
11:36
Тема кэша не раскрыта ...
16 Гений 1С
 
гуру
24.10.08
11:39
(2) к тому же где ты видел документацию по 1с в онлайне? только в книжках. гыгыгы
17 Гений 1С
 
гуру
24.10.08
11:40
(5) А нефиг такую функцию вызывать для остатков по регистрам. Кешируется по параметрам, т.е. по сигнатуре параметров
18 Jolly Roger
 
24.10.08
11:40
Чо за бред?
19 Гений 1С
 
гуру
24.10.08
11:40
(7) Да, но теперь этим можно управлять.
20 Гений 1С
 
гуру
24.10.08
11:41
(11) кури 4-й пост
21 ДенисЧ
 
24.10.08
11:41
(17) Не 1су решать, что и когда мне вызывать.
22 i-rek
 
24.10.08
11:41
не может быть.
Если б это было так, оборотка запускалась бы первый раз долго, второй раз мгновенно. Этого не происходит ))
23 Господин ПЖ
 
24.10.08
11:45
эээ... нафига вызывать Ф(А,Б,В) несколько раз подряд...
24 IamAlexy
 
24.10.08
11:46
(20) но ведь в(4) это же бред.
над вами прикололись а вы повелись?

если мне нужно результат Ф(а,б,с) использовать повторно то я сделаю так:

результат=ф(а,б,с);

ну и дальше буду играться с переменной "результат".
а когда мне потребуется обновить значение переменной я повторно вызову функцию

результатОбновленный=ф(а,б,с);


нафига мне КЕШИРОВАТЬ РЕЗУЛЬТАТ РАБОТЫ ФУНКЦИИ????
25 Гений 1С
 
гуру
24.10.08
11:48
ну например если у тебя есть функция Ф(А,Б), ты ее вызываешь Ф(Пользователь Петров, ОсновнаяВалюта) = Доллары, то в следующий раз когда ты вызовешь Ф(Пользователь Петров, ОсновнаяВалюта), она вернет Доллары, не вычисляя.
А вот если ты спросишь Ф(Пользователь Иванов, ОсновнаяВалюта) или Ф(Пользователь Петров, ОсновнойСклад), она опять будет вычислять.
26 Гений 1С
 
гуру
24.10.08
11:49
(24) дятел, это для автоматического разруливания таких случаев:


Функция Х()
результат=ф(а,б,с);
Возврат Результат;
КонецФункции

Для Инд = 1 по 100000 Цикл
Сообщить(Х);
КонецЦикла;
27 Гений 1С
 
гуру
24.10.08
11:49
(24) чтобы не хешировать ручками...
28 Господин ПЖ
 
24.10.08
11:49
Фиксин, а ты скульный кэш с кэшом 1С не путаешь?
29 Гений 1С
 
гуру
24.10.08
11:50
(22) так это надо еще прикручивать... к тому же для оборотки это юзать бессмысленно. ;-)

Не знаю, есть у них функция очистки кэша?
вообще как обычно в 1с бывает, первые версии кривые и "нязграбныя", как говорят в белоруси
30 Гений 1С
 
гуру
24.10.08
11:50
(28) нет, батенька
31 IamAlexy
 
24.10.08
11:50
(26)
неудачный пример.

что мешает разрулить так:

результат=ф(а,б,с);

Для Инд = 1 по 100000 Цикл
Сообщить результат;
КонецЦикла;
32 Гений 1С
 
гуру
24.10.08
11:50
на партнерском была ветка, я там прочитал
33 Гений 1С
 
гуру
24.10.08
11:51
(31) ну ты тормоз... я тебе идиотский пример специально привел. Кэш используется, когда ты не знаешь, из каких мест кода будет вызываться функция, но знаешь, что можно захешировать результат на все время жизни сеанса, например
34 Господин ПЖ
 
24.10.08
11:51
йопт... он сюды еще и хэш приплел...

(26) О_о
35 Гений 1С
 
гуру
24.10.08
11:53
(34) извини, описался
36 Гений 1С
 
гуру
24.10.08
11:54
так вот, для алексия еще пример.
Допустим ты считал настройку пользователя функцией НастройкаПользователя("ОсновнаяВалюта").
Чтобы в след раз не дергать регистр, функция хешируется.
Можно конечно все настройки занести в глоб переменную, но тогда мы тратим лишнее время на чтение тех настроек, которые не нужны.
Можно эмулировать кэш, но в данном случае все происходит на автомате.
37 nop
 
24.10.08
11:55
(20) А если функция содержит чтение из БД?
38 IamAlexy
 
24.10.08
11:55
(33) хоть один живой пример приведи.
параметры сеанса нельзя использовать ?
39 H A D G E H O G s
 
24.10.08
11:56
(0) Счаст мы тебя проверим...
40 Гений 1С
 
гуру
24.10.08
11:57
(37) иногда имеет смысл кэшировать, например те же настройки пользователя. А если БД поменялась, можно сбросить кэш. Правда 1сники сбрасывают кэш целиком, мазафакеры.
41 Гений 1С
 
гуру
24.10.08
11:57
(38) 1с не рекомендует использовать много параметров сеанса. Это раз, во вторых тогда кэширование придется ручками прописывать
42 SilentMan
 
24.10.08
11:58
(0) Я всегда знал, что читать ты не умеешь, лучше-бы ты писать не умел.
Кэшировать умеет 8.2 ...
43 Гений 1С
 
гуру
24.10.08
11:58
Вот тебе живой пример.
Я использую конвертацию одних проводок в другие.
Для каждого счета я получаю список правил конвертацией функцией СписокПравилКонвертации(Сч).
Так вот, я могу конечно составить соответствие и проверять, вычислял я уже список правил или нет, а могу тупо закэшировать результат функции.
44 Регистратор
 
24.10.08
11:59
похоже что в 1с занятья более нечем, лучшебы память у них на сервере не утекала

Другое
45 Гений 1С
 
гуру
24.10.08
11:59
(42) Точно?
Дело как было? я подумал, что неплохо было бы кэшировать, выдвинул тему на партнерском, а мне ответили, что это уже работает. ;-)
46 Гений 1С
 
гуру
24.10.08
11:59
(44) плохому танцору
47 IamAlexy
 
24.10.08
12:00
хм.. честно говоря рациональное зерно есть но по сути это пушки по воробьям.. чо то мне сложно придумать что то более серьезное с кешем функции чем настройки пользователя которые можно во первых хранить в параметрах сеанса ибо их как правило немного...

а париться с кешем ради того чтобы лишний раз не прочитать основную валюту пользователя - имхо бессмысленно совершенно...
48 SilentMan
 
24.10.08
12:00
(45) При этом ты настолько ослеп, что раздел форума (куда тебя послали) прочитать не смог ...
49 H A D G E H O G s
 
24.10.08
12:02
Функция Тест(Параметр)
   Рез=0;
   Для i=1 По Параметр Цикл
       Рез=Рез+i;
   КонецЦикла;
   Возврат Рез;
КонецФункции

Процедура ОсновныеДействияФормыТест(Кнопка)
   Результат=Тест(100000);
   Результат=Тест(100000);
   Результат=Тест(100000);
   Результат=Тест(100000);
КонецПроцедуры
50 ДенисЧ
 
24.10.08
12:02
А давайте гению на титан сбросимся... И лес целее будет, и строителям поможем...
51 H A D G E H O G s
 
24.10.08
12:05
Проценты:
25,95
24,73
24,66
24,65
52 Гений 1С
 
гуру
24.10.08
12:06
(47) Ты просто мало занимался ускорением... Тебе простительно.
53 H A D G E H O G s
 
24.10.08
12:06
(51) Ну да, тренд идет вниз :-)
54 Гений 1С
 
гуру
24.10.08
12:07
(49) Ты не включил кэширование, ежик
55 Регистратор
 
24.10.08
12:09
Да достижение офигеть тормознутость своего интепретатора 1с пытается лечить кешированием результатов выполнения функций не обращающихся к данным :)))
56 H A D G E H O G s
 
24.10.08
12:11
(54)
1) Дмитрий, Дмитрий Сергеевич, Дима, Димочка, Димон, Димыч и даже Hadgehogs, но не как не ежик. Сергей, постарайся это понять и запомнить. Это совет.
2) Как мне включить это чудо - кэширование?
57 Jolly Roger
 
24.10.08
12:14
(56) Кэширование результатов функций доступно только Гениям...
58 H A D G E H O G s
 
24.10.08
12:15
(57) Тоесть, я - не айс?
59 Гений 1С
 
гуру
24.10.08
12:20
(58) Спили мушку, включи кэширование... Кэширование автоматом не происходит. Функция должна быть в общем модуле, допускающем кэширование
60 H A D G E H O G s
 
24.10.08
12:21
(59) Айн момент..
61 MSensey
 
24.10.08
12:23
Гений, у тебя в последнее время какое-то обострение.
Отдохни чуток
ps (0) в 8.2 реализован
62 Гений 1С
 
гуру
24.10.08
12:23
(60) в 8.2. тестируй, лана?
63 Гений 1С
 
гуру
24.10.08
12:24
(61) тебя напрягает? если да, то чем? если нет, то фигли?
64 H A D G E H O G s
 
24.10.08
12:27
(63) Гений, из тебя бы вышел показательный (знаковый) пользователь..
<<Сегодня только узнал что 1С81 умеет кэшировать>>
<<в 8.2. тестируй, лана?>>
Это нормально..
65 Господин ПЖ
 
24.10.08
12:30
эээ... так речь про 8.1 или 8.2 все таки?
66 trdm
 
24.10.08
12:31
Совершенно тупая, затратная и ненужная фигня.
Лучше бы ресурс тратили на более умные вещи..
67 MSensey
 
24.10.08
12:32
(63) Я тебе говорю взгляд со стороны, бывает что человек не замечает своей "болезни"
68 H A D G E H O G s
 
24.10.08
12:32
(0) А если в расчете участвуют глобальные переменные, которые передаются не через параметры функции. И между вызовами они изменились. 1С это учтет?.
69 NULLL
 
24.10.08
12:33
(61) Где сохранается кеш? Если на сервере - то он может не обновлятся и неделями.
70 Гений 1С
 
гуру
24.10.08
12:38
(66) Не, борис, ты не прав, надо уметь готовить. У меня документ грузился 30 минут, после кеширования (правда ручками написал) - 3 минуты... А тут можно чисто автоматизировать без ручек.
71 Гений 1С
 
гуру
24.10.08
12:39
(67) Ты видел хоть одного психа, осознавшего, что он псих. Смысл твоих усилий?
72 Гений 1С
 
гуру
24.10.08
12:39
(68) функции хэшируются не по ссылке, а по значению параметров, если ты этого еще не понял
73 Дерево
 
24.10.08
12:40
(70)я вот зарегится не поленился из-за тебя...

делись!
74 MSensey
 
24.10.08
12:40
(71) клятва гепократа
75 Гений 1С
 
гуру
24.10.08
12:40
(68) А, я понял о чем ты. Ты кэшируемые функции пишешь сам, поэтому ответственность за их код на тебе. Не юзай глобальные (волитарные) переменные в коде кэшируемых функций. Для того чтобы юзать кеш, не любая функция годится
76 Гений 1С
 
гуру
24.10.08
12:40
(73) чем делиться?
77 MSensey
 
24.10.08
12:41
(72) "хэшируются" - Гений не наступай на теже грабли второй раз
78 Дерево
 
24.10.08
12:45
(76) в (70) написано : "У меня документ грузился 30 минут, после кеширования (правда ручками написал) - 3 минуты... А тут можно чисто автоматизировать без ручек." вот как это сделать и делись
79 Гений 1С
 
гуру
24.10.08
12:46
я проанализировал ход выполнения кода, обнаружил, где она больше всего жрет времени, вынес это в кэши, например:

Кэширование поиска значений по ключу:

КэшПоискЗначений = П.Кэши.ПоискЗначений[ВидСубконтоУУ];
Если КэшПоискЗначений = Неопределено Тогда
   КэшПоискЗначений = Новый Соответствие();
   П.Кэши.ПоискЗначений.Вставить(ВидСубконтоУУ, КэшПоискЗначений);
КонецЕсли;

...
КэшПоискЗначений.Вставить(РезКодПоиска, ?(Результат = Неопределено, NULL, Результат));

Запрос создаю только один раз, а не в цикле, т.е. не тратится время на его компиляцию:

З = П.Кэши.ЗапросПоСоздаваемымОбъектам;
З.УстановитьПараметр("ИдВнешний", РезКодПоиска);
Р = З.Выполнить().Выбрать();
Если Р.Следующий() Тогда
   Результат = Р.Объект;
   Перейти ~КонецАлг;
КонецЕсли;


Кэширование обращения к метаданным:

Если СокрЛП(ВидСубконтоУУ.ИмяРеквизитаПоиска)<>"" Тогда
   РеквизитПоиска = СокрЛП(ВидСубконтоУУ.ИмяРеквизитаПоиска);
Иначе
   Если НЕ П.Кэши.НаличиеРеквизита.Свойство(ВидСубконтоУУ.Имя+"_"+"ИдВнешний") Тогда
       П.Кэши.НаличиеРеквизита.Вставить(ВидСубконтоУУ.Имя+"_"+"ИдВнешний", Метаданные.Справочники[ВидСубконтоУУ.Имя].Реквизиты.Найти("ИдВнешний") <> Неопределено);
   КонецЕсли;        
   Если П.Кэши.НаличиеРеквизита[ВидСубконтоУУ.Имя+"_"+"ИдВнешний"] Тогда
       РеквизитПоиска = "ИдВнешний";
   Иначе
       Если НЕ П.Кэши.НаличиеРеквизита.Свойство(ВидСубконтоУУ.Имя+"_"+"Код6") Тогда
           П.Кэши.НаличиеРеквизита.Вставить(ВидСубконтоУУ.Имя+"_"+"Код6", Метаданные.Справочники[ВидСубконтоУУ.Имя].Реквизиты.Найти("Код6") <> Неопределено);
       КонецЕсли;
       Если  П.Кэши.НаличиеРеквизита[ВидСубконтоУУ.Имя+"_"+"Код6"] Тогда
           РеквизитПоиска = "Код6";
       Иначе
           П.Вставить("РезКодПоиска", "Не определен реквизит для поиска в справочнике");
           П.ОписаниеОшибкиПоиска = "Не определен реквизит для поиска в справочнике. ";
           Перейти ~КонецАлг; //Искать не по чем
       КонецЕсли;
   КонецЕсли;
КонецЕсли;



Ну и еще много других мест.

Все это дало прирост производительности в 10 раз. ;-) Но можно было бы юзать кэши 1с, если бы она это сделала нормально, а не как всегда.
80 Дерево
 
24.10.08
12:46
что-то мне вспомнился один земляк пристававший со словами: "Хэша хапнуть хочешь?"
81 Гений 1С
 
гуру
24.10.08
12:46
(78) Кури (79)
82 H A D G E H O G s
 
24.10.08
12:47
(77) Не придерайтесь к словам.
А вообще приблуда бесполезная, имеющая смысл только для ленивых/забывчивых/студентов.
83 Гений 1С
 
гуру
24.10.08
12:48
(82) имеющая смысл для оптимизаторов, чтобы не писать такие многоэтажки, как в (79), хотя конечно если бы в 1с была возможность статических переменных и серверных глобальных переменных, кэширование было бы менее востребовано.
84 Дерево
 
24.10.08
12:48
пост (80) не к автору а вообще - осень как никак
85 IamAlexy
 
24.10.08
12:49
да пофиг.. мы как писали ЭТО так и будем писать:

функция блаблабла(а)
запрос = "....";
возврат запрос.выполнить().выгрузить();
конецфунции;


Пока а<б цикл
контрагент = блаблабла(б);
конецЦикла;
86 Гений 1С
 
гуру
24.10.08
12:49
(82) придираться к буквам (буквоедство) - это характерная черта программистов... Реально, замечаю часто только у программеров. Для остальных важнее смысл, а не форма. Видимо сказывается нервная дрожь при ошибке одной буквы в идентификаторе и ругательство синтакс чека.
87 Дерево
 
24.10.08
12:50
(83) КэшПоискЗначений = П.Кэши.ПоискЗначений[ВидСубконтоУУ];
"П." это что за зверь?
88 Гений 1С
 
гуру
24.10.08
12:50
(85) Вот запрос = "...."; можно было бы прохешировать и не тратить время на компиляцию запроса...
89 Гений 1С
 
гуру
24.10.08
12:51
(87) Это сквозная структура, содержит контекст, путешествует по всем функциям блока
90 0xFFFFFF
 
24.10.08
12:51
(59)
Я вот не понял - речь про 8.1?
91 Живой Ископаемый
 
24.10.08
12:51
вы замучали! буквы "х" и "к" даже не рядом, следите за пальцами когда печатаете, а то меня в мозгу начинаются расходящиеся процессы...
92 Дерево
 
24.10.08
12:52
{Форма.Форма(3,21)}: Переменная не определена (П)
   КэшПоискЗначений = <<?>>П.Кэши.ПоискЗначений[ВидСубконтоУУ];
{Форма.Форма(3,42)}: Переменная не определена (ВидСубконтоУУ)
   КэшПоискЗначений = П.Кэши.ПоискЗначений[<<?>>ВидСубконтоУУ];
93 Дерево
 
24.10.08
12:54
(89)нифига не понял...

Другое
94 Гений 1С
 
гуру
24.10.08
12:55
(92) ну ты даешь... это же фрагмент кода. а не готовый код.
95 Гений 1С
 
гуру
24.10.08
12:56
(91) тренируй восприятие
96 Гений 1С
 
гуру
24.10.08
12:56
(90) Уже сказали - 8.2, счас тему поменяю
97 MSensey
 
24.10.08
12:56
(86) Гений, я не придераюсь, и не к буквам. А тому что ты не различаешь кэширование от хеширования.
98 Дерево
 
24.10.08
12:57
(96)Супер!!!
99 Живой Ископаемый
 
24.10.08
12:58
(97) Он различает, я помню ветку когда он про хэширование узнал...
100 Гений 1С
 
гуру
24.10.08
13:00
Гы, кстати прикол хотите:

КэшПоискЗначений.Вставить(РезКодПоиска, ?(Результат = Неопределено, NULL, Результат));

//Защита от переполнения памяти! 20081023
Если КэшПоискЗначений.Количество() > 20000 Тогда
   КэшПоискЗначений.Очистить();
КонецЕсли;
101 0xFFFFFF
 
24.10.08
13:15
(100)
хороший стек организовали :)
102 Kraft
 
24.10.08
13:21
(0) куле народ путаешь? Переименуй ветку

Другое
103 Регистратор
 
24.10.08
13:37
Интересно если ли еще какая нибудь система где такое кеширование есть?
104 ШАВ
 
24.10.08
14:30
Может не совсем по теме, но, похоже, кэшироваться будут не только функции. В 8.2 я столкнулся с таким случаем. Создадим в форме команду примерно такого содержания:

&НаКлиенте
Процедура Команда1Выполнить()
   
   Предупреждение("открытие формы");
   Форма = ОткрытьФорму("Путь к форме",,,,Окно);

КонецПроцедуры

Теперь поместим эту команду в панель навигации формы и командную панель формы.

Если нажимать на кнопку в командной панели, то будет выскакивать предупреждение и открываться указанная форма. Если вернуться к изначальной форме через панель навигации и нажать на кнопку снова, то все повториться опять.

Если же нажать на кнопку на панели навигации, то в первый раз появиться предупреждение и откроется форма. Но если снова нажать на кнопку, то во второй раз обработчик команды не вызывается, а открывается форма, которая была при первом вызове. Если же команда не содержит процедур открытия формы, то она работает, как и в первом случае.

Т.е. получается, что для команд на панели навигации кэшируется операция открытия форм.

Этот случай я обнаружил, когда хотел разместить на панели навигации команду следующего содержания: Пользователю выдаются на выбор некоторый список, и в зависимости от выбора открывается та или иная форма. При тестировании работы этой команды я обнаружил, что список выдается только первый раз, и каждый раз открывается та форма, что была выбрана при первом нажатии на кнопку.
105 Гений 1С
 
гуру
24.10.08
14:34
(103) нету таких вроде
106 Rabajaba
 
24.10.08
16:05
Кэширование вызовов вешь безусловно полезная. Только пользовать её должны люди, понимающие как именно оно работает. И тем более понимающие, что начнет происходить, если кешировать все подряд ... Обычно кеширование вызовов делают в рамках конкретного сеанса приложения. В 1С считаю, что будет полезным кешировать вызовы всяких настроек учетной политики, пользователей, функции проверок дат и тп. Для оптимизации больших конфигураций будет самое то.

Другое
108 Гений 1С
 
гуру
24.10.08
17:47
(106) так ты знал про это в 8.2 или не знал? Я вот не знал.

Я не знал, в 1С много гитек оказывается
109 Secret
 
24.10.08
18:08
даже если это нужно , нет гарантий , что будет нормально работать.
что такое "гитек"?

Другое
110 Гений 1С
 
гуру
24.10.08
19:32
(109) Почему это нет гарантий? все достаточно тупо... Я 100 раз делал кеширование (правда не платформой) и все было ок.