Как ускорить поиск характеристики номенклатуры по дополнительным реквизитам?

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

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

Анализ проблемы производительности

Когда мы выполняем поиск по табличной части ДополнительныеРеквизиты, мы используем запрос к полям Свойство и Значение. В стандартной поставке эти поля могут быть не проиндексированы. В результате при увеличении количества записей в базе данных SQL-сервер вынужден выполнять полное сканирование таблицы (Table Scan), что требует значительных ресурсов и времени.

Важно понимать, что поле Значение часто имеет составной тип данных. В SQL-структуре 1С это приводит к тому, что одно поле превращается в набор технических колонок. Индексация таких полей может быть неэффективной или даже вредной, так как платформа создаст множество индексов для каждого типа данных, что приведет к перегрузке базы данных лишними структурами.

Метод №1: Индексация поля «Свойство»

Наиболее эффективным и безопасным первым шагом является индексация колонки Свойство. Так как это поле обычно имеет ссылочный тип (ссылка на ПланВидовХарактеристик), оно обладает высокой селективностью.

  1. Откройте конфигуратор вашей базы данных.
  2. Перейдите к справочнику ХарактеристикиНоменклатуры.
  3. Найдите табличную часть ДополнительныеРеквизиты.
  4. В свойствах реквизита Свойство установите признак Индексировать в значение Индексировать.
  5. Сохраните конфигурацию и обновите структуру базы данных.

Результаты такой оптимизации могут быть впечатляющими: как показывает практика, прирост скорости поиска может достигать 20 и более раз. Это происходит потому, что SQL-оптимизатор сразу отсекает подавляющее большинство строк, не соответствующих выбранному свойству, и поиск по оставшемуся набору происходит мгновенно.

Метод №2: Оценка целесообразности индексации «Значения»

Мы проанализировали ситуацию с индексацией поля Значение. В отличие от Свойства, индексация Значения часто не приносит желаемого результата из-за составного типа данных. Не рекомендуется массово индексировать такие поля без острой необходимости, так как это может привести к созданию лишних индексов в SQL, что негативно скажется на скорости записи данных (вставки и обновления характеристик).

Если вы все же решите экспериментировать, всегда проверяйте план выполнения запроса. Если SQL-сервер выбирает неоптимальный план (например, индекс вместо поиска по фильтру), от индексации стоит отказаться.

Метод №3: Архитектурное решение — использование регистра сведений

Если проект требует работы с огромным массивом характеристик, и стандартных средств индексации табличной части недостаточно, рассмотрим создание отдельного РегистраСведений. Этот подход позволяет полностью контролировать индексы.

Разберем структуру такого регистра:

Такое решение позволяет индексировать комбинацию измерений Свойство и Значение в самом регистре, что дает максимально возможную производительность при поиске. Перенос данных в регистр осуществляется через механизм подписки на событие ПриЗаписи справочника ХарактеристикиНоменклатуры.


// Пример логики заполнения регистра при записи характеристики
Процедура ПриЗаписиХарактеристики(Источник, Отказ) Экспорт
    НаборЗаписей = РегистрыСведений.ЗначенияДопРеквизитовХарактеристик.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Характеристика.Установить(Источник.Ссылка);
    
    Для Каждого СтрокаТЧ Из Источник.ДополнительныеРеквизиты Цикл
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Характеристика = Источник.Ссылка;
        НоваяЗапись.Свойство = СтрокаТЧ.Свойство;
        НоваяЗапись.Значение = СтрокаТЧ.Значение;
    КонецЦикла;
    
    НаборЗаписей.Записать();
КонецПроцедуры

Итоги оптимизации

Мы выяснили, что для решения задачи ускорения поиска необходимо действовать последовательно:

  1. Провести индексацию реквизита Свойство в табличной части справочника — это даст максимальный эффект при минимальных затратах ресурсов.
  2. Избегать индексации составных типов данных (реквизита Значение) без предварительного тестирования производительности.
  3. При критических объемах данных переносить аналитические данные в специализированные РегистрыСведений, где структура индексов полностью подконтрольна разработчику.

Помните, что лучший способ проверки любого изменения — это сравнение плана выполнения запроса в SQL Server Management Studio до и после внесения правок. Удачи в оптимизации!

← На главную