Как ускорить тяжелые запросы в 1С: разбор типичных ошибок
Превратите медленные запросы в 1С в быстрые! Практическое руководство по оптимизации: учимся правильно использовать индексы, виртуальные таблицы и соединения. Никакой теории — только работающие приемы с примерами кода, которые можно применить прямо сейчас.
Работа с большими объемами данных в 1С — это испытание, с которым рано или поздно сталкивается каждый разработчик. Запрос, который на тестовой базе выполняется мгновенно, в продакшене может работать минутами. Давайте разберем типичные ошибки и научимся их избегать.

Ошибка №1: Использование ПОДОБНО вместо точных условий.
Многие начинающие разработчики злоупотребляют оператором ПОДОБНО, особенно когда нужно найти что-то в строке.
Плохо:
Номенклатура.Наименование ПОДОБНО "%Болт%"Хорошо:
Номенклатура.Артикул = "12345"Оператор ПОДОБНО заставляет СУБД просканировать всю таблицу, игнорируя индексы. Если есть возможность использовать точное совпадение или начало строки — делайте это. Если поиск по подстроке неизбежен, хотя бы избегайте маски с процентом в начале.
Ошибка №2: Получение ненужных полей.
Классическая ошибка новичков — выбирать все поля подряд, даже если нужно только два-три.
Плохо:
ВЫБРАТЬ
*
ИЗ
Справочник.КонтрагентыХорошо:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.Наименование,
Контрагенты.ИНН
ИЗ
Справочник.КонтрагентыВыборка лишних данных увеличивает нагрузку на сеть и память. Особенно критично это для полей типа ХранилищеЗначения — они могут содержать мегабайты данных.
Ошибка №3: Отсутствие индексов в условиях отбора.
Если вы часто фильтруете данные по определенному полю, но забыли создать для него индекс — готовьтесь к медленной работе.
Проверьте, какие поля вы используете в условиях WHERE и СОЕДИНЕНИЯХ. Для этих полей должны быть созданы индексы. В конфигураторе это делается через свойства реквизита, установив флаг "Индексировать".
Важно: индексируйте только то, что действительно используется в запросах. Избыточные индексы замедляют операции записи.
Ошибка №4: Вложенные запросы вместо соединений.
Иногда разработчики пытаются получить связанные данные через вложенные запросы в SELECT.
Плохо:
ВЫБРАТЬ
Документы.Номер,
(ВЫБРАТЬ Контрагенты.Наименование
ИЗ Справочник.Контрагенты КАК Контрагенты
ГДЕ Контрагенты.Ссылка = Документы.Контрагент)Хорошо:
ВЫБРАТЬ
Документы.Номер,
Контрагенты.Наименование
ИЗ
Документ.РеализацияТоваров КАК Документы
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Документы.Контрагент = Контрагенты.СсылкаВложенные запросы выполняются для каждой строки результата. Соединения же обрабатываются оптимизатором СУБД гораздо эффективнее.
Ошибка №5: Игнорирование виртуальных таблиц.
1С предоставляет мощные виртуальные таблицы для работы с остатками, оборотами и другими срезами данных. Многие новички пытаются рассчитать это вручную.
Плохо: самостоятельный расчет остатков через обороты документов
Хорошо:
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиВиртуальные таблицы уже оптимизированы разработчиками платформы и используют специальные механизмы кэширования.
Ошибка №6: Отсутствие ограничений на количество записей.
Когда вы выводите данные в форму, всегда ограничивайте количество записей.
ВЫБРАТЬ ПЕРВЫЕ 1000
// поля запросаЭто особенно важно для отчетов и списков. Пользователю редко нужно видеть 100 тысяч строк одновременно, а вот производительность от этого страдает сильно.
Ошибка №7: Сложные выражения в условиях.
Если вы применяете функции к полям в условиях WHERE, индексы не будут использоваться.
Плохо:
ГДЕ ГОД(Документ.Дата) = 2024Хорошо:
ГДЕ Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериодаПараметры периода вычисляются один раз на стороне клиента, а сам запрос может использовать индекс по дате.
Ошибка №8: Множественные обращения к базе в цикле.
Это классическая проблема N+1, когда вы сначала получаете список элементов, а потом в цикле для каждого делаете дополнительный запрос.
Плохо:
// Получаем список документов
Для Каждого Документ Из Выборка Цикл
// Для каждого документа - новый запрос к базе
Контрагент = ПолучитьКонтрагента(Документ);
КонецЦикла;Хорошо: объедините все в один запрос с соединениями или используйте временные таблицы.

Практические советы по оптимизации.
Используйте временные таблицы.
Если запрос сложный и промежуточные данные используются несколько раз, временные таблицы могут значительно ускорить выполнение.
Анализируйте планы запросов.
В режиме предприятия включите консоль запросов и изучайте, какие индексы используются, а какие нет.
Помните про кэширование.
Некоторые данные можно кэшировать на стороне клиента, чтобы не дергать базу каждый раз.
Используйте пакетные операции.
Вместо множества мелких записей делайте одну большую транзакцию.
Как измерить производительность?
Замеряйте время выполнения запросов в боевых условиях, на реальных объемах данных. То, что работает быстро на 100 записях, может тормозить на 100 тысячах.
Используйте технологический журнал 1С для поиска медленных запросов. Настройте его на запись запросов, которые выполняются дольше определенного времени (например, 1 секунды).
Заключение.
Оптимизация запросов в 1С — это не разовая задача, а постоянная практика. Начните с простого: явно указывайте нужные поля, используйте индексы, избегайте ПОДОБНО и вложенных запросов. Эти базовые правила уже дадут заметный прирост производительности.
Помните, что универсального рецепта нет. Каждый случай требует анализа и понимания, как именно работает ваш запрос и что можно улучшить.
Хотите прокачать свои навыки в программировании?
В Кодике вы найдете курсы по Python, JavaScript, HTML, CSS и другим востребованным технологиям для начинающих разработчиков. Учитесь в комфортном темпе и создавайте реальные проекты!
А ещё у нас есть крутой Telegram-канал с дружеским комьюнити, где мы обсуждаем программирование, делимся опытом и помогаем друг другу расти! Присоединяйся! 🚀