← Назад к вопросам

Что такое кэш в 1С и как он работает?

2.3 Middle🔥 131 комментариев
#Запросы и оптимизация#Стандарты разработки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Кэш в 1С: концепция и механика работы

Кэш в 1С — это механизм оптимизации производительности, который сохраняет часто используемые данные в памяти для быстрого доступа, избегая повторного обращения к базе данных.

Что кэшируется в 1С?

Платформа 1С автоматически кэширует несколько типов данных:

1. Справочники и документы

  • При первом обращении к элементу справочника/документа он загружается в кэш
  • Следующие обращения читают из памяти, а не из БД
  • Кэш привязан к сеансу пользователя
// Первое обращение — идёт в БД
Элемент1 = Справочники.Контрагенты.НайтиПоКоду(1);

// Второе обращение — читается из кэша
Элемент2 = Справочники.Контрагенты.НайтиПоКоду(1);

// Если нужно актуальное значение из БД
Элемент3 = Справочники.Контрагенты.НайтиПоКоду(1).ОбновитьСодержимое();

2. Результаты запросов

  • Табличные документы, таблицы значений
  • Результаты SQL запросов (если они не кэшируются явно)

3. Регистры сведений

  • Часто используемые записи регистров сохраняются в памяти

Как работает кэш?

Жизненный цикл элемента в кэше:

1. Первое обращение → БД → Кэш → Значение
2. Второе обращение → Кэш → Значение (БД не задействована)
3. Изменение элемента → Запись в БД → Инвалидация кэша
4. Третье обращение → БД → Кэш → Новое значение

Механика действа:

Процедура ПримерКэша()
    // Кэш пуст
    
    // Операция 1: загрузка в кэш
    Контрагент1 = Справочники.Контрагенты.НайтиПоКоду(1); // → БД
    
    // Операция 2: из кэша
    Контрагент2 = Справочники.Контрагенты.НайтиПоКоду(1); // → Кэш
    Контрагент2.Наименование; // → Из памяти
    
    // Операция 3: изменение инвалидирует кэш
    Элемент = Справочники.Контрагенты.НайтиПоКоду(1);
    Элемент.Наименование = "Новое имя";
    Элемент.Записать(); // Кэш обновлён
    
    // Операция 4: новое значение из обновленного кэша
    Контрагент3 = Справочники.Контрагенты.НайтиПоКоду(1); // Текущее значение
КонецПроцедуры

Типы кэша в 1С

Кэш сеанса (Session Cache)

  • Привязан к конкретному сеансу пользователя
  • Очищается при завершении сеанса
  • Изолирует данные между пользователями
// Каждый пользователь имеет собственный кэш
// Пользователь А видит Контрагент с именем "ООО А"
// Пользователь Б видит Контрагент с именем "ООО Б" (если обновил)

Глобальный кэш (Global Cache)

  • Общий для всех пользователей (на серверной части)
  • Используется для статических справочников
  • Требует явного управления через переменные модуля
// В модуле конфигурации
Переменная КэшОрганизаций; // Глобальный кэш

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

Явное управление кэшем

Очистка кэша

// Обновление содержимого объекта из БД
Элемент = Справочники.Контрагенты.НайтиПоКоду(1);
Элемент.ОбновитьСодержимое(); // Перечитает из БД

// Полная инвалидация кэша сеанса
ОбновитьПовторноИспользуемыеЗначения(); // Очищает весь кэш

Отключение кэширования (если нужны свежие данные)

// Используй запрос вместо прямого обращения
Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |   Контрагенты.Ссылка,
    |   Контрагенты.Наименование
    |ИЗ
    |   Справочник.Контрагенты Как Контрагенты
    |ГДЕ
    |   Контрагенты.Ссылка = &Ссылка"
);
Запрос.УстановитьПараметр("Ссылка", МояСсылка);

Результат = Запрос.Выполнить();
// Это обходит кэш и читает прямо из БД

ВыбратьВСеанс() — специальный метод

// Загружает справочник полностью в кэш сеанса
СписокКонтрагентов = Справочники.Контрагенты.ВыбратьВСеанс();

Процедура ИскатьКонтрагента(Наименование)
    Для Каждого Контрагент Из СписокКонтрагентов Цикл
        Если Контрагент.Наименование = Наименование Тогда
            Возврат Контрагент;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Преимущества:

  • Очень быстрый поиск в памяти
  • Уменьшает нагрузку на БД

Недостатки:

  • Занимает память сеанса
  • Может быть устаревшим, если другой пользователь изменил данные

Конфликты кэша при многопользовательской работе

// Сценарий: два пользователя одновременно
// Пользователь А прочитал Контрагент (кэш)
// Пользователь Б изменил Контрагент (БД обновлена)
// Пользователь А всё ещё видит старое значение в кэше!

Процедура РешениеКонфликта()
    // Решение 1: Явное обновление
    Контрагент.ОбновитьСодержимое();
    
    // Решение 2: Очистка глобального кэша
    ОбновитьПовторноИспользуемыеЗначения();
    
    // Решение 3: Использование запросов вместо кэша
    // Запросы всегда читают актуальные данные
КонецПроцедуры

Лучшие практики работы с кэшем

  1. Используй кэш для статических данных — справочники, константы, которые меняются редко
  2. Явно очищай кэш после изменений — если нужны свежие данные
  3. Избегай больших кэшей в памяти — оптимизируй использование ВыбратьВСеанс()
  4. Помни о многопользовательской работе — различные пользователи могут видеть разные кэши
  5. Используй запросы для критичных данных — SQL запросы всегда актуальны
  6. Профилируй память сеанса — не переполняй кэш ненужными данными

Пример оптимизации

// ❌ НЕПРАВИЛЬНО: каждый раз полная загрузка
Процедура ПолучитьКонтрагентов()
    Для Счётчик = 1 По 1000 Цикл
        Контрагент = Справочники.Контрагенты.НайтиПоКоду(Счётчик);
        // Каждое обращение может требовать БД
    КонецЦикла;
КонецПроцедуры

// ✅ ПРАВИЛЬНО: загрузить в кэш один раз
Процедура ПолучитьКонтрагентов()
    СписокКонтрагентов = Справочники.Контрагенты.ВыбратьВСеанс();
    // Теперь все обращения из памяти
    Для Каждого Контрагент Из СписокКонтрагентов Цикл
        // Работаем с кэшем
    КонецЦикла;
КонецПроцедуры

Понимание механики кэша критично для оптимизации производительности 1С приложений и предотвращения ошибок при многопользовательской работе.

Что такое кэш в 1С и как он работает? | PrepBro