Каталог решений - Кэширование в 1С или уменьшаем нагрузку на сервер

Кэширование в 1С или уменьшаем нагрузку на сервер

Кэширование в 1С или уменьшаем нагрузку на сервер

В наличии

О том как несложными алгоритмами можно уменьшить время отклика системы в целом.

Категория:

Описание

Ничего нового не расскажу, но возможно кому-то поможет.

Ситуация

Пользователей > 100, конфигурация на базе 1С:Торговля+Склад. Загрузка на основном сервере ниже 80% практически не опускается в течении рабочего дня. После кэширования нагрузка стала держаться в среднем около 40%. Конечно сказок не бывает и «хорошие» отчеты быстро исправляют ситуацию.

Решение

Найти часто используемые справочники, константы, пути к файлам и создать для них кэш из СпискаЗначений или ТаблицыЗначений. Смысл в том что бы при  обращении к элементу сначала посмотреть если ли от в списке и если нет, то получить обычным путем (из базы и т.д.) и запомнить в списке (кэше). 

Недостатки

Если какое-то значение изменилось, то надо перезаходить в 1С или делать автоматическую очистку кэша через определенный интервал, например каждый час.

Пример 1 Константы: 

Так как константы в процессе работы меняются не часто, то есть смысл их кэшировать.
ГлМодуль

Перем глКэшКонстант Экспорт; // Список значений констант

....

// получение константы если она есть то из кэша, иначе из базы
Функция глКонстанта(Имя) Экспорт
    Значение = глКэшКонстант.Получить(Имя);
    Если ПустоеЗначение(Значение) = 1 Тогда
        Значение = Константа.ПолучитьАтрибут(Имя);
        глКэшКонстант.Установить(Имя,Значение);
    КонецЕсли;
    Возврат Значение;
КонецФункции

глКэшКонстант = СоздатьОбъект(«СписокЗначений»);
глКэшКонстант.Установить(«РежимОграниченияКолваОкон»,Константа.РежимОграниченияКолваОкон);
глКэшКонстант.Установить(«КэшироватьТочкиДоступа»,Константа.КэшироватьТочкиДоступа);
глКэшКонстант.Установить(«ДатаЗапретаРедактирования»,Константа.ДатаЗапретаРедактирования);

В документах вместо Константа.ДатаЗапретаРедактирования использую глКонстанта(«ДатаЗапретаРедактирования»).

Пример 2 Внешние печатные формы:

В глобальном модуле есть функция
Функция глУстановкаКнопкиПечать(Конт, ВидОбъекта, ТаблицаПечФорм) Экспорт
При каждом открытии документа в ней выполняется поиск по папке PrnForm всех файлов *.efd, их считывание и формирование списка доступных печатных форм.

Добавляю в ГлМодуль

Перем глКэшПечатныхФорм Экспорт; // таблица списка печ. форм.

....

глКэшПечатныхФорм    = СоздатьОбъект(«ТаблицаЗначений»);
глКэшПечатныхФорм.НоваяКолонка(«ВидДокумента»,«Строка»);
глКэшПечатныхФорм.НоваяКолонка(«Название»,«Строка»,,,,30);
глКэшПечатныхФорм.НоваяКолонка(«Файл»,«Строка»,,,«Файл»,10);
глКэшПечатныхФорм.НоваяКолонка(«Кнопка»,«Строка»,,,,10);
глКэшПечатныхФорм.НоваяКолонка(«ФайлОписания»,«Строка»);

В функции глУстановкаКнопкиПечать делаю проверку сначала в таблице и если ничего не найдено, то только тогда иду искать по файловой системе.

Функция глУстановкаКнопкиПечать(Конт, ВидОбъекта, ТаблицаПечФорм) Экспорт
    Перем Название, Кнопка;
    стр = 0;
    Если глКэшПечатныхФорм.НайтиЗначение(ВидОбъекта,стр,«ВидДокумента») = 1 Тогда
        Для Ном = 1 По глКэшПечатныхФорм.КоличествоСтрок() Цикл
            глКэшПечатныхФорм.ПолучитьСтрокуПоНомеру(Ном);
            Если (ВидОбъекта = глКэшПечатныхФорм.ВидДокумента) И (глКэшПечатныхФорм.Название <> «») Тогда
                ТаблицаПечФорм.НоваяСтрока();
                ТаблицаПечФорм.Название     = глКэшПечатныхФорм.Название;
                ТаблицаПечФорм.Кнопка       = глКэшПечатныхФорм.Кнопка;
                ТаблицаПечФорм.Файл         = глКэшПечатныхФорм.Файл;
                ТаблицаПечФорм.ФайлОписания = глКэшПечатныхФорм.ФайлОписания;
            КонецЕсли;
        КонецЦикла;
    Иначе
        // Дополним таблицу печатных форм внешними обработками из предопределенного
        // каталога ExtForms\PrnForms
        // одна запись нужна как флаг что эту запись уже искали
        глКэшПечатныхФорм.НоваяСтрока();
        глКэшПечатныхФорм.ВидДокумента = ВидОбъекта;
        глКэшПечатныхФорм.Название = «»;

        Текст = СоздатьОбъект(«Текст»);
        ФайлОписания = ФС.НайтиПервыйФайл(глКаталогПечФорм+«*.efd»);
        Пока ПустаяСтрока(ФайлОписания)=Цикл
            Текст.Открыть(глКаталогПечФорм+ФайлОписания);
            // Устанавливаем расширение
            Файл = Лев(ФайлОписания,СтрДлина(ФайлОписания)  4) + «.» + «ert»;
            Если ФС.СуществуетФайл(глКаталогПечФорм + Файл) = 1 Тогда
                // Внешний файл, соответствующий файлу описания, найден.
            // Проверим, в нем что есть запись про текущий объект
                Если глНайтиВнешнююПечФорму(Текст, «»»» + ВидОбъекта + «»»», Название, Кнопка) = 1 Тогда
                    // Добавляем строку в список внешних файлов
                    ТаблицаПечФорм.НоваяСтрока();
                    ТаблицаПечФорм.Название     = Название;
                    ТаблицаПечФорм.Кнопка       = Кнопка;
                    ТаблицаПечФорм.Файл         = Файл;
                    ТаблицаПечФорм.ФайлОписания = (ФайлОписания);

                    глКэшПечатныхФорм.НоваяСтрока();
                    глКэшПечатныхФорм.ВидДокумента = ВидОбъекта;
                    глКэшПечатныхФорм.Название     = Название;
                    глКэшПечатныхФорм.Кнопка       = Кнопка;
                    глКэшПечатныхФорм.Файл         = Файл;
                    глКэшПечатныхФорм.ФайлОписания = (ФайлОписания);
                КонецЕсли;
            КонецЕсли;
            ФайлОписания = ФС.НайтиСледующийФайл();
        КонецЦикла;
    КонецЕсли;
    НомерСтроки = глПолучитьТекущуюПечФорму(ВидОбъекта, ТаблицаПечФорм);
    Если НомерСтроки = 0 Тогда
        ЗагловокКнПечать = «Печать»;
    Иначе
        ЗагловокКнПечать = ТаблицаПечФорм.ПолучитьЗначение(НомерСтроки, «Кнопка»);
    КонецЕсли;
    Конт.Форма.кнПечать.Заголовок(ЗагловокКнПечать);

    Возврат НомерСтроки;

КонецФункции // глУстановкаКнопкиПечать()

has been added to your cart:
Оформление заказа