Повторное использование возвращаемых значений

В платформе 1С 8.3. можно кэшировать значения функций. Что такое «кэширование значения функции»? Это значит, что при повторной передаче такого же значения в функцию, результат не будет вычисляться снова, а будет извлекаться из КЭШа.  Кэширование можно использовать в функциях, которые описаны в общих модулях, для этого необходимо в общих модулях включать свойство повторное использование возвращаемых значений. В этой статье мы научимся это делать.

Для демонстрации работы этого функционала в пустой конфигурации сделаем обработку, в которой будем вычислять факториал числа. Алгоритм вычисления факториала взят из моей книги «Программировать в 1С за 11 шагов». На форме обработке будет один реквизит с типом Число, а также команда формы с клиентским обработчиком.

Управляемая форма обработки 1С

В модуле формы будет код, который вычисляет факториал числа (сам факториал нам не нужен), а потом подсчитывает, сколько миллисекунд ушло на вычисление.

&НаКлиенте
Функция ВычислитьФакториал(РазмерФакториала)
   
   Факториал = 1;   
   Итерация = 0;
   Пока Итерация < РазмерФакториала цикл
	   Итерация = Итерация + 1;
	   Факториал = Факториал*Итерация;
   КонецЦикла;  
   Возврат Факториал;
   
КонецФункции 
//ВычислитьФакториал()   
&НаКлиенте
Процедура ВычислитьКлиент(Команда)
   
   НачалоДата = ТекущаяУниверсальнаяДатаВМиллисекундах();   
   Факториал = ВычислитьФакториал(ЧислоФакториала);   
   Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоДата);
   
КонецПроцедуры

Если мы попробуем вычислить факториал 10 000, то у нас уйдет столько миллисекунд.

Вычисление факториала 1С

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

Мы с вами можем закэшировать функцию вычисления факториала, т.е. сделать так, чтобы при повторном вычислении факториала такого же числа, результат не вычислялся заново, а брался из кэша. Сделать это можно в общем модуле. Создадим клиентский общий модуль МатематическиеВычисления. И обратим внимание на свойство Повторное использование вычисляемых значений у этого модуля .

Общий модуль 1С

У этого свойства три значения.

Повторное использование возвращаемых значений

С помощью значений «На время вызова» и «На время сеанса» и осуществляется кэширование. Разберем их оба, а пока перенесем функцию вычисления факториала в общий модуль и сделаем её экспортной.

Общий модуль 1С

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

&НаКлиенте
Процедура ВычислитьКлиент(Команда)
   
   НачалоДата = ТекущаяУниверсальнаяДатаВМиллисекундах();   
   Факториал = МатематическиеВычисления.ВычислитьФакториал(ЧислоФакториала);  
   Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоДата);
   
КонецПроцедуры

Если мы в свойстве Повторное использование возвращаемых значений сделанного общего модуля оставим значение Не использовать, то для нас ни чего не изменится. С этим понятно.  Но если мы установим значение На время вызова, то внешне для нас тоже ни чего не изменится: каждый раз когда мы будет выполнять команду будет примерно тоже значение миллисекунд.  Дело в том, что повторное использование возвращаемых значений со значением На время вызова работает при повторном вызове функции с таким же значением, пока не будет завершена работа того метода, из которого был выполнен вызов. Немного запутано! Продемонстрируем этот на практике. Поставим у общего модуля МатематическиеВычисления значение На время вызова у свойства Повторное использование возвращаемых значений, а в обработчике команды на форме обработки будем еще раз вызывать вычисление факториал с тем же параметром.

&НаКлиенте
Процедура ВычислитьКлиент(Команда)
	
   Сообщить("Первый вызов");	
	
   НачалоДата = ТекущаяУниверсальнаяДатаВМиллисекундах();   
   Факториал = МатематическиеВычисления.ВычислитьФакториал(ЧислоФакториала);   
   Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоДата); 
   
   Сообщить("Второй вызов");

   НачалоДата = ТекущаяУниверсальнаяДатаВМиллисекундах();   
   Факториал = МатематическиеВычисления.ВычислитьФакториал(ЧислоФакториала);   
   Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоДата);    
   
КонецПроцедуры

И посмотрим на вычисления:

Повторное использование возвращаемых значений

Вы видите, второе вычисление произошло практически мгновенно.

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

Повторное использование возвращаемых значений

Если же мы хотим, чтобы значение кэшировалось на сеанс (на 20 минут после последнего использования), то необходимо в свойстве Повторное использование возвращаемых значений установить значение На время сеанса.

Повторное использование возвращаемых значений

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

Повторное использование возвращаемых значений

Второй вызов в обработчике закомментирован, но если его включить, то он тоже выполнится почти мгновенно.

Таким образом, свойство общих модулей Повторное использование возвращаемых значений  позволяет оптимизировать скорость выполнения некоторых операций.

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»


Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *