Зачем использовать функцию ВЫРАЗИТЬ в соединениях таблиц 1С?

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

В процессе разработки сложных запросов в системе 1С:Предприятие (быстрый анализ данных крайне важен в такие моменты) часто возникают ситуации, когда необходимо соединить таблицы по полям, имеющим составной тип данных (для отладки таких случаев пригодится консоль запросов для управляемых форм) — в работе пригодится консоль запросов для управляемых форм. Одной из частых рекомендаций является использование функции ВЫРАЗИТЬ в условиях ПО. Давайте разберемся, зачем это нужно, как это работает на уровне базы данных и в каких случаях такая конструкция действительно приносит пользу.

Понимание природы составных типов данных

Чтобы осознать необходимость ВЫРАЗИТЬ, сначала вспомним, как 1С хранит поля составного типа в СУБД. Когда поле реквизита может принимать значения нескольких типов (например, Документ.РеализацияТоваровУслуг, Документ.ЗаказПокупателя и другие), в базе данных это реализуется не как простое поле, а как пара: поле ссылки (UUID) и поле типа (код типа).

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

Оптимизация плана выполнения запроса

Функция ВЫРАЗИТЬ в условии ПО служит своего рода подсказкой для оптимизатора запросов (подобно тому, как влияет на структуру добавление данных в существующую временную таблицу). Когда мы пишем:

ВЫРАЗИТЬ(ПолеСоставногоТипа КАК Документ.ТипА) = Таблица.Ссылка

мы явно говорим системе, что нас интересуют только те записи из составного поля, которые относятся к конкретному типу Документ.ТипА. Это позволяет оптимизатору:

  1. Отфильтровать записи еще до выполнения операции соединения.
  2. Эффективнее использовать индексы, построенные по конкретным таблицам, а не по всей массе данных составного типа.
  3. Снизить объем передаваемых данных между сервером 1С и СУБД.

Когда стоит использовать ВЫРАЗИТЬ в соединении

Рассмотрим ситуации, когда применение этой функции становится оправданным:

Анализ конкретного примера

В приведенном в теме обсуждении разработчик столкнулся с использованием ВЫРАЗИТЬ внутри условия ПО для регистра сведений. Важно понимать, что если условия запроса уже достаточно жестко ограничивают выборку, использование ВЫРАЗИТЬ может показаться избыточным — повысить качество кода поможет ассистент разработчика для анализа метаданных и синтаксиса. Однако, всегда следует помнить о «перестраховке»:


ПО ((ВЫРАЗИТЬ(алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент КАК Документ.РеализацияТоваровУслуг)) = РеализацияТоваровУслугТоварыТекущий.Ссылка)

В данном случае, если поле УчетныйДокумент содержит только документы нужного типа, запрос отработает корректно и без функции. Но если объем данных в базе велик, а поле имеет широкий составной тип, использование данной конструкции — хороший способ предотвратить деградацию производительности при росте объемов данных.

Советы по диагностике

Не стоит слепо использовать ВЫРАЗИТЬ везде. Чтобы понять, действительно ли конструкция полезна для вашего конкретного запроса, выполните следующие действия:

  1. Проанализируйте план запроса: Воспользуйтесь инструментом «Замер производительности» в Конфигураторе или посмотрите план запроса через SQL Profiler / Технологический журнал — для этого есть анализ планов запросов и оптимизация производительности.
  2. Сравните варианты: Попробуйте выполнить запрос с функцией и без неё на реальной базе данных с большим объемом записей.
  3. Проверьте логику: Убедитесь, что в условиях соединения не заложены противоречия. Если вы ограничиваете тип одним значением, а затем пытаетесь соединить с другим — система вернет NULL, что приведет к ошибкам в логике формирования отчета.

Подводя итог: ВЫРАЗИТЬ — мощный инструмент управления производительностью. В простых случаях он может быть избыточным, но в высоконагруженных системах и при работе с «разнородными» составными типами данных, это верный способ направить оптимизатор по оптимальному пути выполнения.

← На главную