Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. Общие модули с повторным использованием возвращаемых значений (далее: кэш) предусмотрены для кэширования результатов работы функций, которые в них размещены - на время сеанса или на время вызова. Их следует применять для экономии вычислительных ресурсов сервера и для минимизации клиент-серверного взаимодействия.
См. также: раздел "Повторное использование возвращаемых значений" документации по платформе 1С:Предприятие,
Использование значений, влияющих на поведение клиентского приложения
2. В то же время, чрезмерное (неоправданное) применение общих модулей с повторным использованием возвращаемых значений может приводить к излишнему потреблению памяти.
2.1. Недопустимо создать общие модули с повторным использованием, из которых возвращаются данные, вычисление которых выполняется быстрее, чем получение из кэша. Например, строковые константы. Кроме того, что получение строковой константы каждый раз будет работать гораздо быстрее, чем получение ее из общего модуля с повторным использованием, эти данные будут занимать память кэша.
Например, неправильно размещать в модуле с повторным использованием:
Функция ИмяПакетаУправления() Экспорт
Возврат "ManagementPackage";
КонецФункции
Имеет смысл кэшировать данные, полученные из базы данных, внешних источников данных или путем сложных (ресурсоемких) вычислений. Причем в ряде случаев, даже значения, полученные из базы данных, не стоит кэшировать, если выгода от их кэширования – неочевидна. Например, не стоит кэшировать константы (объект метаданных) примитивных типов, поскольку часто они привносят лишь незначительную долю от общего времени выполнения ресурсоемкой операции.
2.2. Следует помещать в кэш только такие данные, к которым потом будут часто обращаться.
В частности, следует иметь в виду, что кэш не хранит данные вечно. Закэшированное значение будет удалено из кэша через 20 минут после вычисления или через 6 минут после последнего использования (в зависимости от того, что наступит раньше*). Кроме этого значение будет удалено при нехватке оперативной памяти в рабочем процессе сервера, при перезапуске рабочего процесса и при переключении клиента на другой рабочий процесс. Поэтому если никто "не успел" воспользоваться данными из кэша, то этот ресурс был потрачен зря.
* Примечание: конкретные цифры могут варьироваться в зависимости от используемой версии платформы 1С:Предприятие.
2.3. Диапазон значений входных параметров функций, размещенных в общих модулей с повторным использованием, не должен быть широким.
Например, в конфигурации предусмотрена функция, получающая на вход контрагента. Если контрагентов в базе очень много, а сценарий работы пользователей таков, что вероятность того, что кто-то за 5 минут обратится к этому же контрагенту, очень невысокая, то ресурсы будут потрачены впустую. Кроме того, если эту «трату» умножить на количество одновременно работающих пользователей, то бесполезные расходы ресурсов становятся значительными.
3. Не следует изменять данные, полученные из кэша. В противном случае, возможны скрытые ошибки в работе программы, а также бесполезное расходование памяти (ресурсов кэша). Поэтому в качестве возвращаемых значений рекомендуется использовать значения, состояние которых изменить нельзя, например: ФиксированныйМассив, ФиксированнаяСтруктура.
Это ограничение вызвано тем, что кэш возвращает каждый раз не копию объекта, а ссылку на один и тот же объект в памяти. Например, если в массив, который возвращает функция с повторным использованием, при каждом вызове при проведении документов дописывать новое значение, то в результате кэш очень быстро «распухнет». Кроме того, при очередном сбросе кэша, добавленные значения будут потеряны и код, который на них опирался, будет работать некорректно.
4. Если в модуле с повторным использованием размещено несколько экспортных функций, которые не только вызываются «снаружи», но и вызывают друг друга, то следует иметь в виду, что результат «внутренних» вызовов не кэшируется.
Например, если в модуле ОбменДаннымиПовтИсп размещено две экспортных функции:
Функция АвтономнаяРаботаПоддерживается() Экспорт
Возврат ...
КонецФункции
Функция ЭтоАвтономноеРабочееМесто() Экспорт
Возврат АвтономнаяРаботаПоддерживается() И ...;
КонецФункции
которые последовательно вызываются из прикладного кода,
... = ОбменДаннымиПовтИсп.АвтономнаяРаботаПоддерживается();
... = ОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто();
то функция АвтономнаяРаботаПоддерживается будет вычислена дважды.
Для того чтобы ее возвращаемое значение всегда получалось из кэша, следует явно указывать имя модуля:
Функция ЭтоАвтономноеРабочееМесто() Экспорт
Возврат ОбменДаннымиПовтИсп.АвтономнаяРаботаПоддерживается() И ...;
КонецФункции
5. Если у общего модуля свойство "Повторное использование возвращаемых значений" установлено в значение "На время сеанса", то в значениях, возвращаемых функциями такого модуля, нельзя использовать значения типа МенеджерВременныхТаблиц, Запрос, объекты базы данных (например, ДокументОбъект, ОтчетОбъект) причем, как непосредственно, так и в составе любых коллекций. Ограничение вызвано тем, что значения этих типов допустимо использовать только в том же серверном вызове, в котором они были получены (созданы).
Возврат значений этих типов в указанных функциях не проверяется платформой и приводит к трудно диагностируемой остановке работы программы (записи есть только в технологическом журнале).
Данное ограничение распространяется на использование значений во временном хранилище.