...

Запись и получение данных из хранилищ Storage и cache.

Тема в разделе "Примеры сценариев", создана пользователем bashorin, 3 фев 2022.

  1. bashorin

    bashorin Участник

    Часто, при настройке решения, нам необходимо сохранять какие-то данные и обращаться к ним в дальнейшем. Использовать контекст приложения в таких ситуация не всегда удобно, особенно если это массивы объектов с несколькими свойствами. В таких случаях вам может очень помочь использование storage и cache.

    Storage и cache – это хранилища произвольных строковых данных. Для хранения информации они используют пары ключ/значение и могут быть созданы в Приложении, Разделе или Системе. Они не зависят от браузера и хранятся в самой системе т.е. при перезагрузке браузера, вы не потеряете ваши данные. Эти хранилища, как понятно из определения, могут содержать в себе только строки. Сохранить в них числа и булевы значения так же можно, но их необходимо предварительно привести к строке.

    Для объектов storage/cache есть 2 применимых метода:
    1. setItem() – сохранить данные по ключу;
    2. getItem() – получить данные по ключу.


    Сохранение данных (setItem).

    При создании storage/cache мы натыкаемся на их единственное различие – storage постоянное хранилище, а cache временное. Это различие приводит к тому, что для создания cache можно применить 3-й необязательный параметр – время жизни ключа.


    Итак, для того что бы создать storage/cache, нам необходим метод setItem():

    Код:
    
    await Application.storage.setItem('test''Data'); // Создаем storage в Приложении
    await Namespace.storage.setItem('test''Data'); // Создаем storage в Разделе
    await System.storage.setItem('test''Data'); // Создаем storage в Системе
    await Application.cache.setItem('test''Data'3600000); // Создаем cache в Приложении
    await Namespace.cache.setItem('test''Data'3600000); // Создаем cache в Разделе
    await System.cache.setItem('test''Data'3600000); // Создаем cache в Системе

    где –

    test – ключ, под которым сохраняется значение.
    Data – непосредственно строка, которую мы хотим сохранить.

    3600000 – время жизни ключа. Это необязательный параметр, применимый только к cache. Время указывается в миллисекундах. Если не указывать этот параметр, то применится стандартное значение 30000 мс. == 30 сек. В данном случаем, мы задали 3600000 мс. == 1 час.


    Особенности:

    1. По истечении указанного времени, данные в cache сотрутся, в stirage они будут храниться всегда. Во избежание ошибок скрипта, лучше проверять наличие данных в cache после получения.
    2. Если вы используете ключ повторно, то уже имеющиеся под таким ключом данные пере запишутся:

    Код:
    
    await Application.storage.setItem('test''Data');  // Data
    await Application.storage.setItem('test''New Data');  // New Data
    3. Storage и cache созданные в Системе/Разделе/Приложении не пересекаются между собой. т.е. создав storage/cache с ключом test в Разделе, а потом с таким же ключом в Приложении этого раздела, мы можем хранить в них разные данные.

    4. При записи данных в storage/cache стоит учитывать тот факт, что у них есть ограничение вместимости. Размер загружаемой строки не должен превышать 16 мегабайт.



    Получение данных (getItem).

    Для того, что бы получить данные из storage/cache, мы воспользуемся методом getItem():

    Код:
    
    await Application.storage.getItem ('test'); // Получаем данные из storage Приложения

    await Namespace.storage.getItem ('test'); // Получаем данные из storage Раздела
    await System.storage.getItem ('test'); // Получаем данные из storage Системы
    await Application.cache.getItem ('test'); // Получаем данные из cache Приложения
    await Namespace.cache.getItem ('test'); // Получаем данные из cache Раздела
    await System.cache.getItem ('test'); // Получаем данные из cache Системы



    Метода getItem() принимает только ключ и больше никаких параметров. Вернуть может «string» или «null» если данных по ключу нет.


    Использование с массивами и объектами.

    Для того, чтобы записать в storage/cache объект, массив или массив объектов, можно воспользоваться методами JSON.stringify() / JSON.parse().


    Запишем массив объектов в storage:

    Код:
    
    const allUsers await System.users.search().size(100).all();
    if (
    allUsers && allUsers.length 0) {
        const 
    data allUsers.map(=> {
            return {
                
    userIdi.id,
                
    firstNamei.data.fullname i.data.fullname.firstname null,
                
    lastNamei.data.fullname i.data.fullname.lastname null,
                
    middeleNamei.data.fullname i.data.fullname.middlename null,
                
    birthDayi.data.birthDate i.data.birthDate.format() : null
            
    }
        });
        
    await System.storage.setItem('usersData'JSON.stringify(data));
    }


    В примере выше, мы записали в storage Системы, массив объектов с информацией о пользователях.

    Для того, чтобы в дальнейшем получить эти данные из storage и из строки снова привести их к массиву объектов, воспользуемся методом JSON.parse():



    Код:
    
    const storage await System.storage.getItem('usersData');

    if (
    storage) {
        const 
    data: {
            
    userIdstring,
            
    firstNamestring,
            
    lastNamestring,
            
    middeleNamestring,
            
    birthDaystring
        
    }[] = JSON.parse(storage);
    }

    Примеры использования.

    В заключении, хотелось бы привести пару примеров, где применялся storage/cache в реальных рабочих проектах.



    Пример 1.


    В систему загружены справочники из 1С клиента. Каждому элементу из 1С, соответствует элемент в Приложении. Каждый день данные справочнику необходимо обновлять, т.е. отслеживать какие элементы новые, какие удаленные, а в каких изменилась информация. Каждый раз проверять все данные в каждом элементе приложения невозможно, по причине большого объема данных в справочнике (более 40 тыс.). Поэтому, при загрузке справочника был создан storage, в который записывать пара ключ/значение для каждого элемента. Ключом служил GUID – уникальный идентификатор элемента из 1С, а в качестве хранимых под ключом данных, сохранялась hash-сумма каждого объекта в массиве (про hash-сумму будет отдельная статья). Таким образом, каждый день мы, через API запрос получаем все данные из 1С, потом получаем данные из нашего storage и сравниваем значения.


    Пример 2.


    На форме запуска бизнес-процесса(Ф1), есть поле типа «Приложение-несколько»(П1) в котором мы выбираем элементы. В режиме реального времени на форму, в переменную типа «Число»(Ч1), должна выводиться сумма, которая считается путем сложения поля типа «Число» из каждого выбранного нами элемента в поле П1. После этого, необходимо заполнить второе поле типа «Приложение»(П2). По логике работы, для этого поля нельзя выбрать элементы из списка, а только создать новый элемент. На форме создания элемента П2 должно автоматически заполняться поле «Сумма». Данные которые записываются в это поле, это поле Ч1 с формы запуска бизнес-процесса. Что бы создать такую связь, использовался cache. На поле Ч1 был повешен скрипт на изменение, в котором записывался cache, в качестве ключа которого, использовался id текущего пользователя, в качестве данных использовалась нужная нам сумма и время жизни установлено на 1 час. На форме создания нового элемента, был скрипт onInit, который по id текущего пользователя получал данные из cache и записывал из в переменную.