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

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

При изучении языка запросов 1С:Предприятие начинающие разработчики часто сталкиваются с конструкциями, которые на первый взгляд кажутся избыточными или непонятными. Одной из таких конструкций является условие ГДЕ Таблица.Ссылка = &Ссылка. Разберем подробно, что скрывается за этими именами, как система понимает этот код и почему это условие является критически важным для корректной работы программы.

Различие между полем таблицы и параметром запроса

Прежде всего, проанализируем синтаксис самого условия. В выражении ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка левая и правая части выполняют принципиально разные роли:

  1. Поле таблицы (Ссылка) — это имя колонки в базе данных. В 1С практически каждый ссылочный объект (справочник, документ) имеет скрытое для пользователя, но доступное в запросах поле Ссылка. Это уникальный идентификатор записи.
  2. Параметр запроса (&Ссылка) — это переменная, которую программист передает в запрос извне. Символ амперсанда & как раз и указывает платформе на то, что это не имя поля, а значение, которое будет подставлено в момент выполнения кода.

Важно понимать, что имя параметра может быть любым. Как справедливо отмечено в обсуждении, мы могли бы написать ГДЕ Таблица.Ссылка = &МойДокумент. Однако использование имени &Ссылка является стандартом де-факто, если мы передаем в запрос ссылку на конкретный объект.

Зачем нужно условие по ссылке в табличных частях?

Рассмотрим ситуацию, когда запрос обращается к табличной части документа, например, ОказаниеУслуги.ПереченьНоменклатуры. В базе данных все строки всех табличных частей всех документов этого типа хранятся в одной огромной плоской таблице.

Если мы напишем запрос без условия:


ВЫБРАТЬ
    ТЧ.Номенклатура,
    ТЧ.Количество
ИЗ
    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ТЧ

Система вернет нам строки всех документов «Оказание услуги», которые когда-либо были созданы в базе. Чтобы получить данные только из того документа, с которым мы работаем в данный момент (например, для печати или расчета), нам нужно «отфильтровать» лишнее. Для этого и используется поле Ссылка, которое в контексте табличной части хранит ссылку на документ-владелец.

Проанализируем пример правильного запроса:


ВЫБРАТЬ
    ТЧ.Номенклатура,
    ТЧ.Количество
ИЗ
    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ТЧ
ГДЕ
    ТЧ.Ссылка = &Ссылка

В этом случае платформа выберет только те записи, у которых в поле «владелец» (которое в запросе называется Ссылка) стоит именно тот документ, который мы передали в параметр &Ссылка.

Техническая реализация: GUID и индексация

Выясним, что происходит на уровне системы управления базами данных (СУБД). Каждый объект в 1С имеет свой уникальный идентификатор — GUID (UUID). Это 128-битное число, которое гарантированно не повторяется. На уровне SQL-таблиц поле Ссылка обычно индексировано (по нему построен кластерный индекс). Это означает, что поиск по ссылке происходит практически мгновенно, даже если в таблице миллионы записей.

Когда мы устанавливаем параметр в коде 1С:

Запрос.УстановитьПараметр("Ссылка", ТекущийОбъект.Ссылка);

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

Особенности работы с типами данных

Нужно помнить о строгой типизации. Посмотрим на типичные ошибки:

Работа с пустыми ссылками

Разберем ситуацию, когда нам нужно найти записи, у которых ссылка не заполнена. В 1С существует понятие «Пустая ссылка». Это не NULL и не 0, это специальное значение GUID, состоящее из одних нулей. Если вы хотите проверить поле на пустоту в запросе, это можно сделать так:


ГДЕ
    ОказаниеУслугиПереченьНоменклатуры.Ссылка = ЗНАЧЕНИЕ(Документ.ОказаниеУслуги.ПустаяСсылка)

Или передать пустую ссылку через параметр, результат будет идентичным.

Массовый отбор: использование оператора «В»

Иногда требуется выбрать данные не по одному документу, а по списку. В этом случае условие = (равно) заменяется на оператор В. Это позволяет значительно оптимизировать код, избегая выполнения запроса в цикле.

Рассмотрим пример:


ВЫБРАТЬ
    ТЧ.Номенклатура,
    ТЧ.Ссылка КАК ДокументВладелец
ИЗ
    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ТЧ
ГДЕ
    ТЧ.Ссылка В (&МассивСсылок)

В параметр &МассивСсылок можно передать массив, содержащий ссылки на несколько разных документов. Запрос вернет строки табличных частей для всех указанных объектов за один проход.

Итоги

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

← На главную