← Назад к вопросам
Что такое кэш в 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: Использование запросов вместо кэша
// Запросы всегда читают актуальные данные
КонецПроцедуры
Лучшие практики работы с кэшем
- Используй кэш для статических данных — справочники, константы, которые меняются редко
- Явно очищай кэш после изменений — если нужны свежие данные
- Избегай больших кэшей в памяти — оптимизируй использование ВыбратьВСеанс()
- Помни о многопользовательской работе — различные пользователи могут видеть разные кэши
- Используй запросы для критичных данных — SQL запросы всегда актуальны
- Профилируй память сеанса — не переполняй кэш ненужными данными
Пример оптимизации
// ❌ НЕПРАВИЛЬНО: каждый раз полная загрузка
Процедура ПолучитьКонтрагентов()
Для Счётчик = 1 По 1000 Цикл
Контрагент = Справочники.Контрагенты.НайтиПоКоду(Счётчик);
// Каждое обращение может требовать БД
КонецЦикла;
КонецПроцедуры
// ✅ ПРАВИЛЬНО: загрузить в кэш один раз
Процедура ПолучитьКонтрагентов()
СписокКонтрагентов = Справочники.Контрагенты.ВыбратьВСеанс();
// Теперь все обращения из памяти
Для Каждого Контрагент Из СписокКонтрагентов Цикл
// Работаем с кэшем
КонецЦикла;
КонецПроцедуры
Понимание механики кэша критично для оптимизации производительности 1С приложений и предотвращения ошибок при многопользовательской работе.