|
Немного пятнично.Вызов процедуры в модуле. Два варианта. Разница? | ☑ | ||
---|---|---|---|---|
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)если смотреть глобально, то кэш возвращаемых значений подобен параметрам сеанса.
Только последние можно переинициализировать принудительно, а с кешем такой фокус не получится, что печально. Как я понимаю нет даже флага о том, что значение взято из кеша. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |