Кэширование в 1С или уменьшаем нагрузку на сервер
О том как несложными алгоритмами можно уменьшить время отклика системы в целом.
- Описание
- Подробнее
Описание
Ничего нового не расскажу, но возможно кому-то поможет.
Ситуация
Пользователей > 100, конфигурация на базе 1С:Торговля+Склад. Загрузка на основном сервере ниже 80% практически не опускается в течении рабочего дня. После кэширования нагрузка стала держаться в среднем около 40%. Конечно сказок не бывает и «хорошие» отчеты быстро исправляют ситуацию.
Решение
Найти часто используемые справочники, константы, пути к файлам и создать для них кэш из СпискаЗначений или ТаблицыЗначений. Смысл в том что бы при обращении к элементу сначала посмотреть если ли от в списке и если нет, то получить обычным путем (из базы и т.д.) и запомнить в списке (кэше).
Недостатки
Если какое-то значение изменилось, то надо перезаходить в 1С или делать автоматическую очистку кэша через определенный интервал, например каждый час.
Пример 1 Константы:
Так как константы в процессе работы меняются не часто, то есть смысл их кэшировать.
ГлМодуль
Перем глКэшКонстант Экспорт; // Список значений констант
....
// получение константы если она есть то из кэша, иначе из базы
Функция глКонстанта(Имя) Экспорт
Значение = глКэшКонстант.Получить(Имя);
Если ПустоеЗначение(Значение) = 1 Тогда
Значение = Константа.ПолучитьАтрибут(Имя);
глКэшКонстант.Установить(Имя,Значение);
КонецЕсли;
Возврат Значение;
КонецФункции
глКэшКонстант = СоздатьОбъект(«СписокЗначений»);
глКэшКонстант.Установить(«РежимОграниченияКолваОкон»,Константа.РежимОграниченияКолваОкон);
глКэшКонстант.Установить(«КэшироватьТочкиДоступа»,Константа.КэшироватьТочкиДоступа);
глКэшКонстант.Установить(«ДатаЗапретаРедактирования»,Константа.ДатаЗапретаРедактирования);
В документах вместо Константа.ДатаЗапретаРедактирования использую глКонстанта(«ДатаЗапретаРедактирования»).
Пример 2 Внешние печатные формы:
В глобальном модуле есть функция
Функция глУстановкаКнопкиПечать(Конт, ВидОбъекта, ТаблицаПечФорм) Экспорт
При каждом открытии документа в ней выполняется поиск по папке PrnForm всех файлов *.efd, их считывание и формирование списка доступных печатных форм.
Добавляю в ГлМодуль
Перем глКэшПечатныхФорм Экспорт; // таблица списка печ. форм.
....
глКэшПечатныхФорм = СоздатьОбъект(«ТаблицаЗначений»);
глКэшПечатныхФорм.НоваяКолонка(«ВидДокумента»,«Строка»);
глКэшПечатныхФорм.НоваяКолонка(«Название»,«Строка»,,,,30);
глКэшПечатныхФорм.НоваяКолонка(«Файл»,«Строка»,,,«Файл»,10);
глКэшПечатныхФорм.НоваяКолонка(«Кнопка»,«Строка»,,,,10);
глКэшПечатныхФорм.НоваяКолонка(«ФайлОписания»,«Строка»);
В функции глУстановкаКнопкиПечать делаю проверку сначала в таблице и если ничего не найдено, то только тогда иду искать по файловой системе.
Функция глУстановкаКнопкиПечать(Конт, ВидОбъекта, ТаблицаПечФорм) Экспорт
Перем Название, Кнопка;
стр = 0;
Если глКэшПечатныхФорм.НайтиЗначение(ВидОбъекта,стр,«ВидДокумента») = 1 Тогда
Для Ном = 1 По глКэшПечатныхФорм.КоличествоСтрок() Цикл
глКэшПечатныхФорм.ПолучитьСтрокуПоНомеру(Ном);
Если (ВидОбъекта = глКэшПечатныхФорм.ВидДокумента) И (глКэшПечатныхФорм.Название <> «») Тогда
ТаблицаПечФорм.НоваяСтрока();
ТаблицаПечФорм.Название = глКэшПечатныхФорм.Название;
ТаблицаПечФорм.Кнопка = глКэшПечатныхФорм.Кнопка;
ТаблицаПечФорм.Файл = глКэшПечатныхФорм.Файл;
ТаблицаПечФорм.ФайлОписания = глКэшПечатныхФорм.ФайлОписания;
КонецЕсли;
КонецЦикла;
Иначе
// Дополним таблицу печатных форм внешними обработками из предопределенного
// каталога ExtForms\PrnForms
// одна запись нужна как флаг что эту запись уже искали
глКэшПечатныхФорм.НоваяСтрока();
глКэшПечатныхФорм.ВидДокумента = ВидОбъекта;
глКэшПечатныхФорм.Название = «»;
Текст = СоздатьОбъект(«Текст»);
ФайлОписания = ФС.НайтиПервыйФайл(глКаталогПечФорм+«*.efd»);
Пока ПустаяСтрока(ФайлОписания)=0 Цикл
Текст.Открыть(глКаталогПечФорм+ФайлОписания);
// Устанавливаем расширение
Файл = Лев(ФайлОписания,СтрДлина(ФайлОписания) — 4) + «.» + «ert»;
Если ФС.СуществуетФайл(глКаталогПечФорм + Файл) = 1 Тогда
// Внешний файл, соответствующий файлу описания, найден.
// Проверим, в нем что есть запись про текущий объект
Если глНайтиВнешнююПечФорму(Текст, «»»» + ВидОбъекта + «»»», Название, Кнопка) = 1 Тогда
// Добавляем строку в список внешних файлов
ТаблицаПечФорм.НоваяСтрока();
ТаблицаПечФорм.Название = Название;
ТаблицаПечФорм.Кнопка = Кнопка;
ТаблицаПечФорм.Файл = Файл;
ТаблицаПечФорм.ФайлОписания = (ФайлОписания);
глКэшПечатныхФорм.НоваяСтрока();
глКэшПечатныхФорм.ВидДокумента = ВидОбъекта;
глКэшПечатныхФорм.Название = Название;
глКэшПечатныхФорм.Кнопка = Кнопка;
глКэшПечатныхФорм.Файл = Файл;
глКэшПечатныхФорм.ФайлОписания = (ФайлОписания);
КонецЕсли;
КонецЕсли;
ФайлОписания = ФС.НайтиСледующийФайл();
КонецЦикла;
КонецЕсли;
НомерСтроки = глПолучитьТекущуюПечФорму(ВидОбъекта, ТаблицаПечФорм);
Если НомерСтроки = 0 Тогда
ЗагловокКнПечать = «Печать»;
Иначе
ЗагловокКнПечать = ТаблицаПечФорм.ПолучитьЗначение(НомерСтроки, «Кнопка»);
КонецЕсли;
Конт.Форма.кнПечать.Заголовок(ЗагловокКнПечать);
Возврат НомерСтроки;
КонецФункции // глУстановкаКнопкиПечать()