Ничего нового не расскажу, но возможно кому-то поможет.
Ситуация
Пользователей > 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 Тогда
ЗагловокКнПечать = "Печать";
Иначе
ЗагловокКнПечать = ТаблицаПечФорм.ПолучитьЗначение(НомерСтроки, "Кнопка");
КонецЕсли;
Конт.Форма.кнПечать.Заголовок(ЗагловокКнПечать);
Возврат НомерСтроки;
КонецФункции // глУстановкаКнопкиПечать()