Використання модулів із повторним використанням значень, що повертаються
<em>Область застосування: керований застосунок, мобільний застосунок, звичайний застосунок.</em>
Область застосування: керований застосунок, мобільний застосунок, звичайний застосунок.
Методична рекомендація (корисна порада)
1. Загальні модулі з повторним використанням значень, що повертаються (далі: кеш), призначені для кешування результатів роботи функцій, які в них розміщені, — на час сеансу або на час виклику. Їх слід застосовувати для економії обчислювальних ресурсів сервера та для мінімізації клієнт-серверної взаємодії.
Див. також: розділ "Повторне використання значень, що повертаються" документації щодо платформи 1С:Підприємство,
Використання значень, що впливають на поведінку клієнтського застосунку
2. Водночас надмірне (необґрунтоване) застосування загальних модулів із повторним використанням значень, що повертаються, може призводити до зайвого споживання пам’яті.
2.1. Неприпустимо створювати загальні модулі з повторним використанням, з яких повертаються дані, обчислення яких виконується швидше, ніж отримання з кешу. Наприклад, рядкові константи. Крім того, що отримання рядкової константи щоразу працюватиме значно швидше, ніж отримання її із загального модуля з повторним використанням, ці дані займатимуть пам’ять кешу.
Наприклад, неправильно розміщувати в модулі з повторним використанням:
Функція ІмяПакетаУправління() Експорт Повернення "ManagementPackage"; КінецьФункції
Має сенс кешувати дані, отримані з бази даних, зовнішніх джерел даних або шляхом складних (ресурсоємних) обчислень. Причому в низці випадків навіть значення, отримані з бази даних, не варто кешувати, якщо вигода від їх кешування — неочевидна. Наприклад, не варто кешувати константи (об’єкт метаданих) примітивних типів, оскільки часто вони привносять лише незначну частку від загального часу виконання ресурсоємної операції.
2.2. Слід поміщати в кеш лише такі дані, до яких потім часто звертатимуться.
Зокрема, слід мати на увазі, що кеш не зберігає дані вічно. Закешоване значення буде видалено з кешу через 20 хвилин після обчислення або через 6 хвилин після останнього використання (залежно від того, що настане раніше*). Крім цього, значення буде видалено за нестачі оперативної пам’яті в робочому процесі сервера, під час перезапуску робочого процесу та під час перемикання клієнта на інший робочий процес. Тому якщо ніхто "не встиг" скористатися даними з кешу, то цей ресурс було витрачено марно.
* Примітка: конкретні цифри можуть варіюватися залежно від використовуваної версії платформи 1С:Підприємство.
2.3. Діапазон значень вхідних параметрів функцій, розміщених у загальних модулях із повторним використанням, не повинен бути широким.
Наприклад, у конфігурації передбачено функцію, що отримує на вхід контрагента. Якщо контрагентів у базі дуже багато, а сценарій роботи користувачів такий, що ймовірність того, що хтось за 5 хвилин звернеться до цього самого контрагента, дуже низька, то ресурси буде витрачено марно. Крім того, якщо цю «витрату» помножити на кількість користувачів, які працюють одночасно, то марні витрати ресурсів стають значними.
3. Не слід змінювати дані, отримані з кешу. Інакше можливі приховані помилки в роботі програми, а також марне витрачання пам’яті (ресурсів кешу). Тому як значення, що повертаються, рекомендується використовувати значення, стан яких не можна змінити, наприклад: ФіксованийМасив, ФіксованаСтруктура.
Це обмеження спричинене тим, що кеш щоразу повертає не копію об’єкта, а посилання на той самий об’єкт у пам’яті. Наприклад, якщо до масиву, який повертає функція з повторним використанням, під час кожного виклику під час проведення документів дописувати нове значення, то в результаті кеш дуже швидко «роздується». Крім того, під час чергового скидання кешу додані значення буде втрачено, і код, який на них спирався, працюватиме некоректно.
4. Якщо в модулі з повторним використанням розміщено кілька експортних функцій, які не лише викликаються «ззовні», а й викликають одна одну, то слід мати на увазі, що результат «внутрішніх» викликів не кешується.
Наприклад, якщо в модулі ОбмінДанимиПовтИсп розміщено дві експортні функції:
Функція АвтономнаРоботаПідтримується() Експорт Повернення ... КінецьФункції Функція ЦеАвтономнеРобочеМісце() Експорт Повернення АвтономнаРоботаПідтримується() І ...; КінецьФункції
які послідовно викликаються з прикладного коду,
... = ОбмінДанимиПовтИсп.АвтономнаРоботаПідтримується(); ... = ОбмінДанимиПовтИсп.ЦеАвтономнеРобочеМісце();
то функцію АвтономнаРоботаПідтримується буде обчислено двічі.
Щоб її значення, що повертається, завжди отримувалося з кешу, слід явно зазначати ім’я модуля:
Функція ЦеАвтономнеРобочеМісце() Експорт Повернення ОбмінДанимиПовтИсп.АвтономнаРоботаПідтримується() І ...; КінецьФункції