Кэширование в 1С: настройка повторного использования возвращаемых значений
- Тысячи одинаковых запросов к константам, справочникам валют или параметрам учета в рамках одной транзакции.
- Высокая загрузка CPU кластера 1С при выполнении типовых сервисных функций.
- Утечки оперативной памяти рабочих процессов rphost из-за некорректного кэширования больших массивов данных.
1. Варианты повторного использования возвращаемых значений
В свойствах общего модуля свойство Повторное использование возвращаемых значений (Return Values Reuse) может принимать значения:
- Не использовать: Обычный модуль без кэширования;
- На время вызова: Кэш живет только в рамках текущего серверного вызова (очищается при возврате управления на клиент);
- На время сеанса: Кэш живет в памяти сеанса пользователя до его завершения или сброса (около 20 минут).
2. Пример правильного кэширования параметров
// В общем модуле с повторным использованием "На время сеанса"
Функция ПолучитьОсновнуюВалютуУчета()
Возврат Константы.ВалютаРегламентированногоУчета.Получить();
КонецФункции
Функция ПолучитьКурсВалюты(Знач Валюта, Знач Дата)
// Кэш вернет результат мгновенно без обращения к СУБД
Возврат РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура("Валюта", Валюта)).Курс;
КонецФункции3. Программный сброс кэша при обновлении данных
// При изменении константы сбросьте кэш для немедленного обновления
ОсвежитьМутабельныеЗначения(); Частые вопросы (FAQ)
Что нельзя передавать в качестве параметров кэшируемой функции?
Нельзя передавать мутабельные объекты (структуры, таблицы значений, объекты документов). Параметрами должны быть простые типы: Ссылка, Число, Строка, Дата, Булево.
Сколько памяти занимает кэш с повторным использованием?
Кэш хранится в оперативной памяти процесса rphost для каждого сеанса индивидуально. Если кэшировать таблицы с тысячами строк, память процесса быстро исчерпается.
Как сбросить кэш модуля с повторным использованием на время сеанса?
Кэш автоматически сбрасывается через 20 минут неактивности, при вызове ОсвежитьМутабельныеЗначения() или при перезапуске клиентского сеанса.
Когда использовать кэширование 'На время вызова'?
Для функций, которые многократно вызываются внутри сложных расчетов или проведения одного документа, но результат которых может измениться в следующем клиентском вызове.