При работе с конструктором запросов в 1С разработчики часто сталкиваются с вопросом: почему система при автоматическом создании условий соединения использует просто имя реквизита, например, ЗаказКлиента.Сборщик, а не конструкцию ЗаказКлиента.Сборщик.Ссылка? Давайте разберем эту ситуацию подробно и выясним, как правильно строить запросы для обеспечения их максимальной производительности.
Прежде всего, важно уяснить фундаментальное правило: в языке запросов 1С мы оперируем таблицами базы данных и ссылками, но не объектами платформы. Объект, с которым мы работаем в коде (например, через Документы.ЗаказКлиента.ПолучитьОбъект()), существует только в оперативной памяти после того, как мы его явно вызвали. Запрос же взаимодействует с данными напрямую на уровне СУБД.
Когда вы создаете реквизит ссылочного типа в 1С (например, СправочникСсылка.ФизическиеЛица), в базе данных это поле уже содержит указатель — GUID записи. Следовательно, само поле реквизита уже является ссылкой. Дописывая .Ссылка после имени реквизита, вы выполняете избыточное действие, которое не несет функциональной нагрузки.
В языке запросов 1С «точка» — это не просто оператор доступа, это неявное левое соединение. Рассмотрим ситуацию, когда вы пишете запрос так:
ВЫБРАТЬ
ЗаказКлиента.Курьер.Наименование
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
Для выполнения такого запроса платформа 1С будет вынуждена выполнить соединение таблицы заказов с таблицей физических лиц, чтобы «дотянуться» до поля Наименование. Если таких обращений через точку в запросе много, количество соединений в итоговом SQL-запросе кратно возрастает. Это приводит к так называемому «раздуванию» запроса, что существенно замедляет скорость его выполнения, особенно при работе с большими объемами данных.
Когда вы используете явное ЛЕВОЕ СОЕДИНЕНИЕ, вы контролируете структуру запроса:
ВЫБРАТЬ
ФизическиеЛица.Наименование
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица
ПО ЗаказКлиента.Сборщик = ФизическиеЛица.Ссылка
В этом примере соединение происходит один раз по конкретному условию. Это дает оптимизатору запросов SQL возможность построить наиболее эффективный план выполнения операции.
Чтобы писать качественный и быстрый код, придерживайтесь следующих правил:
ЗаказКлиента.Курьер = ФизическиеЛица.Ссылка.ЛЕВОЕ СОЕДИНЕНИЕ. Это делает запрос прозрачным и предсказуемым..Ссылка: Поскольку реквизит и так содержит ссылку, добавление .Ссылка только загромождает код и вводит в заблуждение, не давая никаких преимуществ.Помните, что профессиональный подход заключается не в том, чтобы «просто работало», а в том, чтобы запрос был оптимален для системы управления базами данных. Использование правильной нотации и осознанное построение связей — это ключевые навыки программиста 1С, которые помогут избежать проблем с производительностью в будущем.