В процессе разработки и сопровождения систем на платформе 1С:Предприятие одной из самых частых проблем является замедление работы отчетов или алгоритмов, обращающихся к регистрам сведений с миллионами записей. В данной статье мы проанализируем основные причины низкой производительности и разберем практические способы ускорения выборки данных, основываясь на опыте ведущих разработчиков и технических рекомендациях.
Прежде чем приступать к написанию кода, проанализируем ситуацию и поймем, как платформа взаимодействует с СУБД. Основная нагрузка при выполнении запроса ложится на дисковую подсистему и оперативную память сервера SQL. Рассмотрим основные факторы, влияющие на скорость:
СрезПоследних без параметров (без отбора по периоду и измерениям) заставляет систему обрабатывать весь объем данных регистра.Для Каждого порождает лавинообразный рост нагрузки на сервер.СОЕДИНЕНИЕ лишает оптимизатор СУБД возможности эффективно использовать индексы.Рассмотрим подробнее эффективную методику работы с данными: вместо того чтобы соединять основную таблицу с огромным регистром напрямую, мы подготовим промежуточный набор данных. Посмотрим на пример кода, где мы сначала выбираем нужные нам ссылки во временную таблицу, а затем получаем данные из регистра.
// Создаем менеджер временных таблиц
МенеджерВТ = Новый МенеджерВременных Таблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
// Шаг 1: Подготовка исходных данных
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Ссылка КАК Номенклатура
|ПОМЕСТИТЬ ВТ_Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Товары
|ГДЕ
| Товары.ЭтоГруппа = ЛОЖЬ";
Запрос.Выполнить();
Важный момент: использование временных таблиц позволяет платформе 1С создать реальные временные таблицы на стороне SQL-сервера и построить по ним индексы автоматически (если объем данных велик). Это значительно ускоряет последующие соединения с физическими таблицами регистров.
Проанализируем типичную ошибку при получении цен или остатков. Часто разработчики накладывают условия в блоке ГДЕ, что является критической ошибкой для производительности. Рассмотрим правильный подход, используя параметры виртуальной таблицы.
Запрос.Текст =
"ВЫБРАТЬ
| Цены.Номенклатура,
| Цены.Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ ВТ_Номенклатура)) КАК Цены";
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Результат = Запрос.Выполнить();
В данном примере мы передаем условие фильтрации напрямую в параметры виртуальной таблицы СрезПоследних. Это позволяет системе 1С сформировать SQL-запрос, который отсечет ненужные записи на самом раннем этапе выполнения, не зачитывая весь регистр в память.
Выясним, как работают индексы в 1С. По умолчанию платформа создает индекс по всем измерениям в порядке их следования в метаданных. Если вы часто ищете данные по измерению Организация, но оно стоит третьим в списке, индекс может не сработать. Для решения этой проблемы разберем следующие рекомендации:
Индексировать или Индексировать с доп. упорядочиванием.Период, измерения и НомерСтроки (если применимо).Иногда нам не нужно получать все записи, достаточно проверить наличие хотя бы одной. Посмотрим, как это сделать максимально эффективно, не нагружая сервер. Мы будем использовать ВЫБРАТЬ ПЕРВЫЕ 1 в сочетании с правильной сортировкой.
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| 1 КАК Поле1
|ИЗ
| РегистрСведений.ИсторияСтатусов КАК Статусы
|ГДЕ
| Статусы.Объект = &Объект
| И Статусы.Статус = &ИскомыйСтатус";
Запрос.УстановитьПараметр("Объект", ДокументСсылка);
Запрос.УстановитьПараметр("ИскомыйСтатус", Перечисления.Статусы.Активен);
Если НЕ Запрос.Выполнить().Пустой() Тогда
// Обработка логики
КонецЕсли;
Такой подход позволяет СУБД прекратить сканирование таблицы сразу после нахождения первого соответствия, что на больших объемах экономит секунды времени пользователя.
Мы проанализировали основные методы оптимизации работы с регистрами сведений в 1С. Подведем итоги совместной работы:
ГДЕ.Применяя эти правила на практике, вы сможете значительно ускорить работу ваших конфигураций и обеспечить комфортную работу пользователей даже при взрывном росте объема накопленных данных.