Почему в условиях соединения запроса 1С не нужно указывать .Ссылка?

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

При работе с конструктором запросов в 1С разработчики часто сталкиваются с вопросом: почему система при автоматическом создании условий соединения использует просто имя реквизита, например, ЗаказКлиента.Сборщик, а не конструкцию ЗаказКлиента.Сборщик.Ссылка? Давайте разберем эту ситуацию подробно и выясним, как правильно строить запросы для обеспечения их максимальной производительности.

Понимание ссылочных типов в запросах

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

Когда вы создаете реквизит ссылочного типа в 1С (например, СправочникСсылка.ФизическиеЛица), в базе данных это поле уже содержит указатель — GUID записи. Следовательно, само поле реквизита уже является ссылкой. Дописывая .Ссылка после имени реквизита, вы выполняете избыточное действие, которое не несет функциональной нагрузки.

Почему обращение через точку снижает производительность

В языке запросов 1С «точка» — это не просто оператор доступа, это неявное левое соединение. Рассмотрим ситуацию, когда вы пишете запрос так:


ВЫБРАТЬ
    ЗаказКлиента.Курьер.Наименование
ИЗ
    Документ.ЗаказКлиента КАК ЗаказКлиента

Для выполнения такого запроса платформа 1С будет вынуждена выполнить соединение таблицы заказов с таблицей физических лиц, чтобы «дотянуться» до поля Наименование. Если таких обращений через точку в запросе много, количество соединений в итоговом SQL-запросе кратно возрастает. Это приводит к так называемому «раздуванию» запроса, что существенно замедляет скорость его выполнения, особенно при работе с большими объемами данных.

Когда вы используете явное ЛЕВОЕ СОЕДИНЕНИЕ, вы контролируете структуру запроса:


ВЫБРАТЬ
    ФизическиеЛица.Наименование
ИЗ
    Документ.ЗаказКлиента КАК ЗаказКлиента
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица
        ПО ЗаказКлиента.Сборщик = ФизическиеЛица.Ссылка

В этом примере соединение происходит один раз по конкретному условию. Это дает оптимизатору запросов SQL возможность построить наиболее эффективный план выполнения операции.

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

Чтобы писать качественный и быстрый код, придерживайтесь следующих правил:

  1. Избегайте «точечной нотации» в условиях: Если реквизит является ссылочным, используйте его имя напрямую в условии сравнения ЗаказКлиента.Курьер = ФизическиеЛица.Ссылка.
  2. Выполняйте явные соединения: Если вам нужно получить данные из связанных справочников, используйте ЛЕВОЕ СОЕДИНЕНИЕ. Это делает запрос прозрачным и предсказуемым.
  3. Не дублируйте .Ссылка: Поскольку реквизит и так содержит ссылку, добавление .Ссылка только загромождает код и вводит в заблуждение, не давая никаких преимуществ.
  4. Минимизируйте количество соединений: Если данных нужно немного, старайтесь выбирать только необходимые поля. Каждый лишний «join» — это дополнительная нагрузка на сервер баз данных.

Помните, что профессиональный подход заключается не в том, чтобы «просто работало», а в том, чтобы запрос был оптимален для системы управления базами данных. Использование правильной нотации и осознанное построение связей — это ключевые навыки программиста 1С, которые помогут избежать проблем с производительностью в будущем.

← На главную