Имя: Пароль:
1C
1С v8
Немного пятнично.Вызов процедуры в модуле. Два варианта. Разница?
,
0 mr_K
 
11.07.14
13:12
Есть некий общий модуль Модуль1. В нем 2 процедуры. Пускай будут экспортные. Проц1 и Проц2. В Проц1 происходит вызов Проц2. Есть разница и на сколько существенная как вызывать:
(внутри Проц1)
1.
...
Проц2();
...

2.
...
Модуль1.Проц2();
...
??
1 skunk
 
11.07.14
13:14
ты хоть сам понял чего изобразил?
2 Рэйв
 
11.07.14
13:14
второе затратнее. Т.к. будет сначала формировать область видимости Модуль1.
3 mr_K
 
11.07.14
13:18
(2) Это понятно ). Не знал как сформулировать, чтобы не отвлекаться на это различие.
Имеется в виду разница, ммм, в результате вызова.
(1) Да. Ваше мнение?
4 mr_K
 
11.07.14
13:19
(4) Вопрос не праздный. И имеющий (на мой взгляд) весьма не тривиальный ответ от 1С.
5 Рэйв
 
11.07.14
13:21
(3)Результат будет одинаковый. Одна и та же процедура отрабатыает, почему он должен быть разным?
6 vvp91
 
11.07.14
13:27
Отличия существенны, когда Модуль1 является модулем с повторным использованием возвращаемых значений, а эти процедуры на самом деле функции.

Допустим вначале будет вызов Модуль1.Проц1() откуда-то извне, тогда вызов Проц2() внутри Проц1() вызовет выполнение Проц2() и закеширует результат на момент своего вызова по ключу "Проц2". И следующие вызовы Проц1() будут использовать кешированный результат Проц2() и вызова Проц2() происходить не будет.

Но когда дальше извне модуля Модуль1 будет вызвана Проц2 - Модуль1.Проц2() - тогда опять произойдет выполнение Проц2() и новое кеширование результата по ключу "Модуль1.Проц2()".

Вот тут могут начаться грабли, когда результаты работы Проц2 разные, в зависимости от момента вызова.
7 Fragster
 
гуру
11.07.14
13:28
(2) а не пофиг?
второй вариант удобнее для копипасты. но копипаста - это путь к говнокоду.
8 mr_K
 
11.07.14
13:31
(6) Вот оно.
Огромное спасибо! Теперь понятно. Кому интересно, можно здесь посмотреть: v8: УПП. Обновили и перестал запускаться web-клиент
9 Рэйв
 
11.07.14
13:34
(6)ТС сказал "результат вызова", а не результат работы" :-)
(3)Точнее надо быть в формулировках.
10 mr_K
 
11.07.14
13:37
(9) Аймсорри)) Не придумал, как точно сформулировать.
11 Fragster
 
гуру
11.07.14
13:42
(8) так то ошибка платформы, а не "грабли, когда результаты работы Проц2 разные, в зависимости от момента вызова."
12 vvp91
 
11.07.14
13:48
(11) Что значит ошибка платформы?
Текущие поведение модулей с кешированием результатов - это проектное решение, насколько мне известно.

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

Тут скорее ошибка конфигурации и проектирования конфигурации, чем платформы.
13 Fedor-1971
 
11.07.14
13:49
(6) т.е. Модуль1.Проц2() -  гарантирует выполнение функции с повторным использованием результата при любом месте вызова?
  Возможно я ошибаюсь, но при описанном раскладе Проц2 не будет выполняться, пока не истечёт время нахождения результата в кеше откуда бы его не вызывали. Вроде для того и задумывался такой механизм, плохо то, что временем кеширования управлять нельзя.
14 vvp91
 
11.07.14
13:50
>> (13) т.е. Модуль1.Проц2() -  гарантирует выполнение функции с повторным использованием результата при любом месте вызова?
Да, гарантирует.
15 Fragster
 
гуру
11.07.14
13:52
(12) в ссылке (8) - ошибка платформы. не должна платформа падать, а должно быть поведение, когда кэширование происходит два раза. Правда я не могу себе представить человека, который в здравом уме стал бы кэшировать то, что "зависит от времени вызова". а если не зависит, то и пофиг, пусть кэшируется два раза.
16 GROOVY
 
11.07.14
13:57
(8) Это исправили уже:

Повторное использование возвращаемых значений
Код ошибки: 10139502
Код(ы) обращения: SW851934
Статус: Исправлена в выпущенной версии Зарегистрирована: 16.05.2014
Исправлена:
"Технологическая платформа", версия 8.3.5.1068
Описание:
В веб-клиенте при втором вызове функции общего модуля с включенным повторным использованием возвращаемых значений из того же самого модуля происходит ошибка
Не удалось получить свойство "_get" ссылки, значение которого не определено или является NULL
и аварийное завершение работы клиента.
17 Fedor-1971
 
11.07.14
13:58
(14) тогда теряется смысл кеширования результата, пример:
модуль1.Проц2() - выполнился
оператор1
....
оператор10
модуль1.Проц2() - опять выполнился, а по идее должен использовать кеш.
18 vvp91
 
11.07.14
15:33
>> (17) тогда теряется смысл кеширования результата,
Видимо я не понял твоего вопроса.

Суть в том, что если везде использовать вызов Модуль1.Функ2(), включая сам модуль повторного использования Модуль1, то платформа гарантировано выполнит функцию только один раз, а потом будет просто возвращать кешированное значение.

Если в одном месте написать Модуль1.Функ2(), а в другом Функ2(), то платформа два раз исполнит функцию, а дальнейшие вызовы будет заменять возвратом кешированного результата.
19 mr_K
 
11.07.14
15:41
(16) А если 8.2, а не 8.3?
20 Fedor-1971
 
11.07.14
16:06
(18)если смотреть глобально, то кэш возвращаемых значений подобен параметрам сеанса.
Только последние можно переинициализировать принудительно, а с кешем такой фокус не получится, что печально. Как я понимаю нет даже флага о том, что значение взято из кеша.