#std724

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

1.

Общие модули с повторным использованием возвращаемых значений (кеш) применяйте для кеширования результатов функций:

  • на время сеанса;
  • или на время вызова.

Используйте их для экономии вычислительных ресурсов сервера и для #std487: минимизации количества серверных вызовов и трафика.

См. также
2.

Чрезмерное применение модулей с повторным использованием возвращаемых значений может приводить к излишнему потреблению памяти.

2.1.

Не кешируйте данные, которые вычисляются быстрее, чем извлекаются из кеша.

Неправильно

Функция ИмяПакетаУправления() Экспорт
    Возврат "ManagementPackage";
КонецФункции

Имеет смысл кешировать данные, которые получаются:

  • из базы данных;
  • из внешних источников;
  • в результате ресурсоемких вычислений.

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

2.2.

Помещайте в кеш только данные, к которым будут часто обращаться.

Учитывайте, что кеш не бессрочный:

  • значение удаляется через 20 минут после вычисления;
  • или через 6 минут после последнего использования, в зависимости от того, что наступит раньше;
  • значение также удаляется при нехватке памяти, перезапуске рабочего процесса и переключении клиента на другой рабочий процесс.

Если закешированным значением никто не воспользовался, ресурс потрачен впустую.

Примечание

Конкретные интервалы жизни кеша могут отличаться в разных версиях платформы.

2.3.

Не делайте слишком широкий диапазон входных параметров у кешируемых функций.

Пример

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

При большом числе одновременных пользователей такие «пустые» кеши создают заметные лишние расходы ресурсов.

3.

Не изменяйте данные, полученные из кеша.

Иначе возникают скрытые ошибки и лишние расходы памяти.

В возвращаемых значениях используйте неизменяемые структуры данных, например: ФиксированныйМассив, ФиксированнаяСтруктура.

Причина: кеш возвращает не копию, а ссылку на один и тот же объект в памяти.

4.

Если в модуле с повторным использованием экспортные функции вызывают друг друга, результат внутренних вызовов не кешируется.

Неправильно

Функция АвтономнаяРаботаПоддерживается() Экспорт
    Возврат ...;
КонецФункции

Функция ЭтоАвтономноеРабочееМесто() Экспорт
    Возврат АвтономнаяРаботаПоддерживается() И ...;
КонецФункции
... = ОбменДаннымиПовтИсп.АвтономнаяРаботаПоддерживается();
... = ОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто();

В этом сценарии АвтономнаяРаботаПоддерживается вычисляется дважды.

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

Правильно

Функция ЭтоАвтономноеРабочееМесто() Экспорт
    Возврат ОбменДаннымиПовтИсп.АвтономнаяРаботаПоддерживается() И ...;
КонецФункции
5.

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

  • МенеджерВременныхТаблиц;
  • Запрос;
  • объекты базы данных (ДокументОбъект, ОтчетОбъект и т.п.);
  • любые коллекции, которые содержат такие значения.

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

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

Ограничение также распространяется на использование таких значений во временном хранилище.

См. также
Источник

https://its.1c.ru/db/v8std#content:724