Как ускорить работу критериев отбора и повысить производительность запросов в 1С:ERP

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

Работа с механизмом критериев отбора в крупных конфигурациях, таких как 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, часто становится «узким местом» производительности. Типовой запрос к критерию СвязанныеДокументы может выполняться десятки секунд, что недопустимо для оперативной работы пользователя. В рамках данной статьи мы подробно разберем, почему это происходит и как мы можем значительно ускорить эти процессы.

Разберем механику работы критерия отбора

Прежде всего, проанализируем ситуацию: что происходит «под капотом» платформы 1С, когда мы обращаемся к виртуальной таблице критерия отбора? Важно понимать, что критерий отбора — это не физическая таблица в базе данных SQL, а декларативное описание правил сбора данных. Когда мы выполняем запрос к КритерийОтбора.СвязанныеДокументы, платформа динамически генерирует SQL-запрос, представляющий собой гигантское объединение (UNION ALL) множества таблиц.

В ERP критерий СвязанныеДокументы может включать в себя данные из 150 и более различных типов документов. Для каждого типа документа в запрос включаются его шапка, а зачастую и несколько табличных частей. В итоге SQL-сервер получает «портянку» из более чем сотни подзапросов. Рассмотрим основные причины деградации производительности в таких условиях:

  1. Время компиляции плана запроса: СУБД (будь то MS SQL Server или PostgreSQL) тратит значительное время (иногда несколько секунд) только на то, чтобы построить план выполнения для запроса со 140+ объединениями.
  2. Неэффективное использование индексов: Если хотя бы в одном из документов, входящих в критерий, отсутствует нужный индекс или статистика устарела, оптимизатор может выбрать неверную стратегию для всего огромного запроса.
  3. Объем данных в выборке: Критерий всегда пытается выбрать все искомые данные. Если дерево связей документов очень ветвистое, выборка становится тяжелой.

Влияние механизма RLS и ключевое слово РАЗРЕШЕННЫЕ

Одной из самых частых причин замедления является использование слова РАЗРЕШЕННЫЕ в запросе. Выясним причину: при включенном механизме RLS (Restriction at Leaf Level) платформа модифицирует каждую из 150+ ветвей UNION ALL, добавляя туда дополнительные соединения (JOIN) с таблицами прав доступа. Это увеличивает сложность SQL-запроса в геометрической прогрессии.

Проанализируем ситуацию на примере: если под полными правами запрос выполняется 10 секунд, то под обычным пользователем с RLS он может «уйти в вечность» или вызвать ошибку превышения времени ожидания.

Решение: Если бизнес-логика позволяет, выполняйте поиск по критерию отбора в привилегированном режиме на сервере, исключив из текста запроса слово РАЗРЕШЕННЫЕ. Это позволит платформе сформировать максимально чистый SQL-запрос без наслоения проверок прав доступа.


// Пример вызова в привилегированном модуле
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	СвязанныеДокументы.Ссылка КАК Ссылка
    |ИЗ
    |	КритерийОтбора.СвязанныеДокументы(&ЗначениеКритерия) КАК СвязанныеДокументы";
Запрос.УстановитьПараметр("ЗначениеКритерия", ДокументСсылка);
Результат = Запрос.Выполнить().Выгрузить();

Оптимизация индексов и состава критерия

Посмотрим на свойства объектов, входящих в критерий. Платформа 1С автоматически создает индексы для полей, которые включены в критерий отбора. Однако есть нюансы, которые мы должны учитывать:

Рассмотрим совет опытных архитекторов: если типовой критерий СвязанныеДокументы работает слишком медленно из-за своей избыточности, попробуйте создать собственный специализированный критерий отбора. Включите в него только те 10-15 типов документов, которые реально используются в вашей цепочке бизнес-процессов. Это сократит количество UNION ALL в разы.

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

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

1. Использование Журналов документов

В отличие от критерия отбора, Журнал документов — это физическая таблица в СУБД. Если все необходимые документы включены в определенный журнал и в нем есть соответствующие графы, запрос к журналу с фильтром по графе будет работать на порядок быстрее, чем обращение к критерию отбора. Это связано с тем, что SQL-серверу гораздо проще выполнить поиск по одной проиндексированной таблице, чем соединять сотню других.

2. Прямой запрос к конкретным таблицам

Если мы заранее знаем, в каких именно документах может находиться ссылка на наш объект, мы можем написать запрос вручную. Посмотрим на пример кода, который заменяет универсальный критерий направленным поиском:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ Ссылка ИЗ Документ.ЗаказКлиента ГДЕ ОбъектРасчетов = &Объект
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ ОбъектРасчетов = &Объект
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ Ссылка ИЗ Документ.ПоступлениеБезналичныхДенежныхСредств ГДЕ ОбъектРасчетов = &Объект";
Запрос.УстановитьПараметр("Объект", НужныйОбъект);

Такой подход, несмотря на кажущуюся громоздкость, работает в разы быстрее, так как мы точно указываем СУБД, где искать данные, не заставляя её просматривать сотни ненужных таблиц (например, документы производства или кадровые приказы, которые точно не связаны с объектом расчетов).

3. Использование регистров сведений (Кэширование связей)

В некоторых случаях оправдано создание собственного регистра сведений (например, ГрафСвязейДокументов), который заполняется при проведении документов. Это позволяет свести поиск связей к простейшему запросу по одной таблице регистра. В ERP похожий механизм используется для некоторых подсистем (например, связи с внутренними документами).

Настройка SQL-сервера для тяжелых запросов

Иногда причина долгого выполнения кроется в настройках самого сервера базы данных. Проанализируем два важных параметра MS SQL Server:

Подведем итоги

Для ускорения критериев отбора в 1С:ERP мы рекомендуем придерживаться следующего алгоритма:

  1. Выполняйте запрос в привилегированном режиме, чтобы избавиться от накладных расходов RLS.
  2. Проверьте наличие индексов у реквизитов, входящих в состав критерия, особенно в табличных частях.
  3. Если критерий слишком универсален (как СвязанныеДокументы), создайте свой, более узкий критерий.
  4. В критических местах замените критерий отбора на прямой запрос к физическим таблицам или журналам документов.
  5. Следите за актуальностью индексов и статистики на стороне СУБД.

Используя эти методы, вы сможете сократить время получения связанных документов с десятков секунд до долей секунды, что существенно повысит комфорт работы пользователей в системе.

← На главную