Что происходит на стороне СУБД при доступе через точку?


В 1С при построении запросов часто используется доступ к реквизитам составных типов через оператор "точка" — например, Документ.Реквизит. Такой синтаксис в языке запросов 1С отражает структуру данных, где один реквизит объекта является ссылкой на другой объект или содержит вложенные поля.

При выполнении такого запроса на стороне СУБД происходит ряд операций, которые связаны с преобразованием этого обращения в SQL-запрос, взаимодействием с физической структурой базы данных и оптимизацией выполнения. Рассмотрим подробно, что именно происходит в СУБД при доступе к полям через точку.

1. Разбор запроса и построение плана выполнения

Когда 1С-платформа получает запрос с обращением через точку к составному типу, например, Документ.Реквизит, система запроса анализирует структуру метаданных и выясняет, что Документ — это ссылка на объект, а Реквизит — поле внутри этого объекта.

На уровне SQL это означает, что данные хранятся в нескольких связанных таблицах:

  • Таблица основного объекта (например, документы).

  • Таблица связанного объекта (на который ссылается реквизит).

Чтобы получить значение Реквизит, СУБД нужно выполнить соединение (JOIN) между таблицами по ключу, который хранит ссылку.

2. Генерация SQL-запроса с JOIN

В SQL-запросе с доступом через точку обычно создаётся конструкция с INNER JOIN или LEFT JOIN:

  • Основная таблица с данными документа связывается с таблицей справочника или другого объекта по полю ссылки.

  • В выборке указывается поле из связанной таблицы, соответствующее Реквизиту.

Пример:

SELECT
D.ID,
R.Реквизит
FROM
Документ D
LEFT JOIN
Справочник R ON D.Ссылка = R.Ссылка
WHERE

...

Это позволяет получить данные реквизита, лежащего в связанном объекте.

3. Выполнение соединения на уровне СУБД

После построения SQL-запроса СУБД приступает к выполнению соединения таблиц:

  • По ключу связи (обычно уникальному идентификатору, например, Ссылка или ID) происходит сопоставление строк из двух таблиц.

  • Для каждого документа СУБД находит соответствующую запись в таблице справочника и извлекает нужное поле.

Если связь необязательна, используется LEFT JOIN, чтобы не потерять записи из основной таблицы.

4. Использование индексов и оптимизация

Для быстрого выполнения JOIN и поиска значений СУБД применяет индексы:

  • Индексы по полям связи (Ссылка, ID) обеспечивают быстрое сопоставление строк.

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

Оптимальность зависит от качества индексации и объёма данных.

5. Обработка данных и построение результата

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

Это значение возвращается в 1С, где уже применяется логика обработки результата — например, отображение на форме или дальнейшие вычисления.

6. Дополнительные расходы на ресурсы

Обращение через точку повышает нагрузку на СУБД:

  • Увеличивается число операций JOIN.

  • Растёт объем передаваемых данных.

  • Увеличивается время выполнения запроса, особенно при больших таблицах и сложных связях.

7. Влияние на кэширование и повторное использование запросов

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

8. Влияние на параллелизм и блокировки

При выполнении таких запросов на уровне СУБД могут возникать дополнительные блокировки, связанные с чтением данных из нескольких таблиц, особенно если запросы участвуют в транзакциях с изменениями.

9. Ограничения и возможные ошибки

Если структура данных изменена, например, удалён реквизит или изменена связь, SQL-запрос, сформированный из запроса с обращением через точку, может стать некорректным, что приведёт к ошибкам выполнения.