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