Нужны ли прямые SQL-запросы в 1С 8 и как оптимизировать работу тяжелых отчетов

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При росте объема базы данных и количества активных пользователей многие разработчики и администраторы сталкиваются с проблемами производительности: отчеты финансового отдела или партии товаров начинают выполняться по 30–40 минут. Возникает естественное желание использовать прямые запросы к MS SQL Server в обход платформы 1С. Разберем подробнее, почему этот подход в платформе 1С 8 является ошибочным и как правильно решать задачи ускорения работы базы средствами самого языка 1С и СУБД.

Почему прямые запросы не нужны в 1С 8

В отличие от версии 1С 7.7, где платформа работала с СУБД через механизмы курсоров и использование прямых запросов (например, через ВК 1С++) давало колоссальный прирост скорости, в 1С 8 архитектура взаимодействия с базой данных кардинально изменилась.

Встроенный язык запросов 1С v8 уже является декларативным языком высокого уровня, который транслируется самой платформой напрямую в оптимальные SQL-запросы к СУБД (MS SQL Server, PostgreSQL и др.). Попытка писать прямые запросы к СУБД в 1С 8 влечет за собой серьезные риски и проблемы:

  1. Динамическая структура данных: имена таблиц, полей и внутренних идентификаторов (GUID) формируются платформой автоматически. При любом обновлении конфигурации или платформы физическая структура таблиц в SQL может измениться, что сломает все прямые запросы.
  2. Обход бизнес-логики и RLS: прямой запрос обходит механизмы разделения прав доступа (RLS) и внутреннее кэширование платформы.
  3. Нарушение лицензионного соглашения: прямое чтение или запись в таблицы базы данных СУБД сторонними средствами или напрямую из кода 1С в обход сервера приложений запрещены лицензией 1С.

Как посмотреть трансляцию запроса 1С в SQL

Чтобы понять, как написанный запрос 1С преобразуется в физический SQL-запрос, и проанализировать план его выполнения, используем специализированные инструменты:

  1. MS SQL Server Profiler: позволяет перехватывать входящие T-SQL запросы от сервера приложений 1С к СУБД в режиме реального времени.
  2. Технологический журнал 1С: с помощью настройки события DBMSSQL можно записывать все выполняемые к СУБД запросы и время их выполнения.
  3. Консоль запросов СКД: в инструментах отладки компоновки данных можно увидеть итоговый текст SQL-запроса, сгенерированный платформой.
  4. Документация 1С:ИТС: материалы раздела методологии разработки содержат описание структуры таблиц базы данных и принципов построения индексов платформой.

Методы оптимизации запросов в 1С

Проанализируем основные причины медленной работы отчетов и способы их исправления без использования прямых SQL-запросов.

1. Использование параметров виртуальных таблиц

Одной из главных ошибок является наложение условий на данные в секции ГДЕ вместо передачи параметров непосредственно в параметры виртуальных таблиц регистров. Если отбор указан в секции ГДЕ, СУБД вынуждена сначала выгрузить всю таблицу остатков или оборотов и только потом фильтровать ее, что приводит к сканированию всей таблицы на диске.

2. Исключение обращений «через точку»

Обращение в запросе к реквизитам через несколько ссылок (например, Регистратор.Контрагент.ОсновнойДоговор) заставляет платформу формировать множественные неявные соединения (LEFT JOIN) в SQL-запросе. Разберем по шагам правильный подход: такие обращения следует заменять явными соединениями с нужными справочниками или документами через временные таблицы.

3. Использование и индексация временных таблиц

При объединении больших объемов данных необходимо разбивать сложный запрос на несколько простых этапов с помещением промежуточных результатов во временные таблицы. Для полей, по которым в дальнейшем выполняется соединение или выборка по условию ГДЕ, обязательно нужно указывать инструкцию ИНДЕКСИРОВАТЬ ПО.

Рассмотрим пример индексации временной таблицы в запросе 1С:


ВЫБРАТЬ
	Партии.Номенклатура КАК Номенклатура,
	Партии.Серия КАК Серия,
	СУММА(Партии.КоличествоОстаток) КАК КоличествоОстаток
ПОМЕСТИТЬ ВремОстатки
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Партии
СГРУППИРОВАТЬ ПО
	Партии.Номенклатура,
	Партии.Серия

ИНДЕКСИРОВАТЬ ПО
	Номенклатура,
	Серия;

4. Оптимизация поиска в объекте ТаблицаЗначений

Если алгоритм обработки данных выполняет поиск с помощью метода Найти() или НайтиСтроки() по объекту ТаблицаЗначений с большим количеством строк, необходимо предварительно проиндексировать соответствующие колонки. Без индексации платформе приходится выполнять последовательный перебор всех строк.

Пример добавления индексов в таблицу значений:


// Добавляем индекс по полю поиска для ускорения работы метода Найти
ТЗТовары.Индексы.Добавить("Номенклатура");
ТЗТовары.Индексы.Добавить("Характеристика");

// Теперь поиск по проиндексированным колонкам выполняется за время O(1)
НайденнаяСтрока = ТЗТовары.Найти(ИскомаяНоменклатура, "Номенклатура");

Регламентные работы на сервере СУБД

Если структуры запросов написаны корректно, но база данных продолжает тупить с ростом объема, причина чаще всего кроется в отсутствии обслуживания MS SQL Server:

  1. Обновление статистики (Update Statistics): если статистика неактуальна, оптимизатор SQL Server строит неоптимальные планы запросов (например, выбирает сканирование всей таблицы вместо поиска по индексу).
  2. Обслуживание индексов: регулярная дефрагментация (реорганизация или перестроение) индексов позволяет ускорить операции чтения с диска.
  3. Настройка параллелизма: ограничение параметра Max Degree of Parallelism (MAXDOP) предотвращает взаимные блокировки и перегрузку процессоров при выполнении тяжелых отчетов параллельно с оперативной работой пользователей.

Полезная литература

Для детального изучения механизмов взаимодействия 1С с СУБД и оптимизации производительности рекомендуется изучить книгу «1С:Предприятие 8. Настольная книга по оптимизации проводимости и производительности», а также методические статьи на ресурсе 1С:ИТС по устройству таблиц и индексов платформы.

← На главную