В платформе 1С 8.3. можно кэшировать значения функций. Что такое «кэширование значения функции»? Это значит, что при повторной передаче такого же значения в функцию, результат не будет вычисляться снова, а будет извлекаться из КЭШа. Кэширование можно использовать в функциях, которые описаны в общих модулях, для этого необходимо в общих модулях включать свойство повторное использование возвращаемых значений. В этой статье мы научимся это делать.
Для демонстрации работы этого функционала в пустой конфигурации сделаем обработку, в которой будем вычислять факториал числа. Алгоритм вычисления факториала взят из моей книги «Программировать в 1С за 11 шагов». На форме обработке будет один реквизит с типом Число, а также команда формы с клиентским обработчиком.
В модуле формы будет код, который вычисляет факториал числа (сам факториал нам не нужен), а потом подсчитывает, сколько миллисекунд ушло на вычисление.
&НаКлиенте Функция ВычислитьФакториал(РазмерФакториала) Факториал = 1; Итерация = 0; Пока Итерация < РазмерФакториала цикл Итерация = Итерация + 1; Факториал = Факториал*Итерация; КонецЦикла; Возврат Факториал; КонецФункции //ВычислитьФакториал() &НаКлиенте Процедура ВычислитьКлиент(Команда) НачалоДата = ТекущаяУниверсальнаяДатаВМиллисекундах(); Факториал = ВычислитьФакториал(ЧислоФакториала); Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоДата); КонецПроцедуры
Если мы попробуем вычислить факториал 10 000, то у нас уйдет столько миллисекунд.
Если мы попробуем еще раз вычислить факториал такого же числа, то выйдет примерно такое же количество миллисекунд.
Мы с вами можем закэшировать функцию вычисления факториала, т.е. сделать так, чтобы при повторном вычислении факториала такого же числа, результат не вычислялся заново, а брался из кэша. Сделать это можно в общем модуле. Создадим клиентский общий модуль МатематическиеВычисления. И обратим внимание на свойство Повторное использование вычисляемых значений у этого модуля .
У этого свойства три значения.
С помощью значений «На время вызова» и «На время сеанса» и осуществляется кэширование. Разберем их оба, а пока перенесем функцию вычисления факториала в общий модуль и сделаем её экспортной.
В клиентском же обработчике команды формы обработки, сделанной в начале статьи, будем вместо функции модуля формы использовать функцию из общего модуля.
&НаКлиенте Процедура ВычислитьКлиент(Команда) НачалоДата = ТекущаяУниверсальнаяДатаВМиллисекундах(); Факториал = МатематическиеВычисления.ВычислитьФакториал(ЧислоФакториала); Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоДата); КонецПроцедуры
Если мы в свойстве Повторное использование возвращаемых значений сделанного общего модуля оставим значение Не использовать, то для нас ни чего не изменится. С этим понятно. Но если мы установим значение На время вызова, то внешне для нас тоже ни чего не изменится: каждый раз когда мы будет выполнять команду будет примерно тоже значение миллисекунд. Дело в том, что повторное использование возвращаемых значений со значением На время вызова работает при повторном вызове функции с таким же значением, пока не будет завершена работа того метода, из которого был выполнен вызов. Немного запутано! Продемонстрируем этот на практике. Поставим у общего модуля МатематическиеВычисления значение На время вызова у свойства Повторное использование возвращаемых значений, а в обработчике команды на форме обработки будем еще раз вызывать вычисление факториал с тем же параметром.
&НаКлиенте Процедура ВычислитьКлиент(Команда) Сообщить("Первый вызов"); НачалоДата = ТекущаяУниверсальнаяДатаВМиллисекундах(); Факториал = МатематическиеВычисления.ВычислитьФакториал(ЧислоФакториала); Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоДата); Сообщить("Второй вызов"); НачалоДата = ТекущаяУниверсальнаяДатаВМиллисекундах(); Факториал = МатематическиеВычисления.ВычислитьФакториал(ЧислоФакториала); Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоДата); КонецПроцедуры
И посмотрим на вычисления:
Вы видите, второе вычисление произошло практически мгновенно.
Но, если мы попробуем еще раз посчитать факториал в рамках этого же сеанса, то первое вычисление опять будет долго выполняться.
Если же мы хотим, чтобы значение кэшировалось на сеанс (на 20 минут после последнего использования), то необходимо в свойстве Повторное использование возвращаемых значений установить значение На время сеанса.
Тогда, только первое вычисление факториала будет долго выполняться, последующие выполнения команды произойдут практически мгновенно.
Второй вызов в обработчике закомментирован, но если его включить, то он тоже выполнится почти мгновенно.
Таким образом, свойство общих модулей Повторное использование возвращаемых значений позволяет оптимизировать скорость выполнения некоторых операций.
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009