← Назад к вопросам
Как вы оптимизируете производительность 1С и запросов?
2.8 Senior🔥 171 комментариев
#Запросы и оптимизация
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Оптимизация производительности 1С
1. Оптимизация запросов
Избегай лишних полей:
❌ ВЫБРАТЬ * ИЗ Справочник.Товары
✅ ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Товары
Используй РАЗЛИЧНЫЕ и ГРУППИРОВКУ:
// Вместо получения всех и фильтрации на клиенте
ВЫБРАТь РАЗЛИЧНЫЕ Товар // ← на уровне БД
Используй СрезПоследних вместо ручного MAX:
✅ РегистрСведений.История.СрезПоследних(&Дата, ) КАК История
❌ МАКСИМУМ(История.Период) — медленнее на больших данных
Индексируй правильно:
- По всем измерениям регистров
- По полям в WHERE
- Порядок полей в индексе = порядок фильтрации
2. Оптимизация логики на сервере
Кэширование результатов:
// Если один запрос выполняется много раз
Ключ = "Товары_" + Формат(Сегодня(), "ДФ=yyyymmdd");
Результат = ПолучитьИзКэша(Ключ);
Если Результат = Неопределено Тогда
Результат = ВыполнитьДорогойЗапрос();
СохранитьВКэш(Ключ, Результат);
КонецЕсли;
Пакетная обработка вместо цикла:
❌ Для Каждого Товар Из Товары Цикл
ОбновитьТовар(Товар); // N обращений к БД
КонецЦикла;
✅ ОбновитьВсеТоварыЗаРаз(Товары); // 1 обращение
Используй TEMP таблицы для сложных расчётов:
ВЫБРАТь ... ПОМЕСТИТЬ ВремТабл;
ВЫБРАТь ВремТабл ГДЕ ... // быстро на уже заполненной таблице
3. Оптимизация клиентской части
Ленивая загрузка данных:
// На открытии формы загружай только видимые на экране
// Остальное по скроллу
Элементы.ТаблицаДанных.НачислениеСтрок = 100; // выводим по 100
Отключай расчёты при редактировании:
&НаКлиенте
Процедура КоличествоПриИзменении()
// Пересчитываем сумму
// Но БЕЗ затратных операций
КонецПроцедуры
4. Оптимизация БД
Архивирование старых данных:
// Перемещай данные > 2 лет в архив
// Текущая таблица остаётся меньше и быстрее
Регулярное обслуживание:
- Перестроение индексов
- Анализ статистики
- Дефрагментация
5. Мониторинг
План выполнения запроса: Меню: Отчёты → План запроса
Профилирование:
Меню: Администрирование → Профилирование
Лог ошибок и медленных операций:
Логировать время выполнения:
НачалоВремени = ТекущееВремя();
ВыполнитьОперацию();
Время = ТекущееВремя() - НачалоВремени;
Если Время > 1000 Тогда // > 1 сек
ЗаписатьВЛог(Время);
КонецЕсли;
Чеклист оптимизации
- ✅ Индексы по всем измерениям регистров
- ✅ РАЗЛИЧНЫЕ и ГРУППИРОВКА в запросах
- ✅ СрезПоследних для историй
- ✅ Кэширование результатов
- ✅ Пакетная обработка вместо циклов
- ✅ TEMP таблицы для сложности
- ✅ Ленивая загрузка на клиенте
- ✅ Регулярное обслуживание БД
- ✅ Мониторинг плана запросов
- ✅ Логирование медленных операций
Практический результат
Применение этих техник обычно дает 5-100x ускорение в зависимости от проблемы. Начни с анализа плана запроса — это покажет, в какой области искать узкое место.