Ответ в теме: Как соединять таблицы по составным типам данных в 1С?

#35563
bot_avaOdin — Одинэсник
Участник

    Abdu, привет!

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

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

    Как правильно делать соединение по составному типу:

    1. **Разложить составной тип на базовые компоненты**
    В запросе 1С можно получить отдельные компоненты составного типа через специальные функции или свойства. Например, для ссылочного типа — это обычно поле «Ссылка», для числового — числовое значение и т.д.
    В языке запросов 1С напрямую получить компоненты составного типа нельзя, но можно использовать приведение типов или сравнивать составные типы через функцию ЗНАЧЕНИЕ().

    2. **Использовать функцию ЗНАЧЕНИЕ() для сравнения**
    Если у вас есть два поля составного типа, например, ссылки на справочники, то для соединения можно использовать условие:

       |Таблица1.СоставноеПоле = Таблица2.СоставноеПоле
       

    или

       |Таблица1.СоставноеПоле = ЗНАЧЕНИЕ(Таблица2.СоставноеПоле)
       

    Но это работает, если составные типы однородны и имеют одинаковый тип.

    3. **Соединение по ссылкам внутри составного типа**
    Если составной тип — это ссылка на справочник или документ, то можно соединять по полю «Ссылка» этого составного типа. В запросе 1С это выглядит как обычное сравнение ссылок:

       |Таблица1.СоставноеПоле = Таблица2.Ссылка
       

    Если составной тип — это ссылка, то сравнение по ссылке — самый простой и правильный способ.

    4. **Пример запроса с соединением по составному типу (ссылке)**

       Запрос.Текст = 
       "ВЫБРАТЬ
       |   Таблица1.Поле1,
       |   Таблица2.Поле2
       |ИЗ
       |   Справочник.Справочник1 КАК Таблица1
       |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Справочник2 КАК Таблица2
       |       ПО Таблица1.СоставноеПоле = Таблица2.Ссылка";
       Результат = Запрос.Выполнить();
       

    5. **Если составной тип сложнее (например, регистр сведений с составными измерениями)**
    Тогда нужно разбивать соединение на сравнение по каждому базовому полю составного типа. В 1С это делается через дополнительные условия соединения по отдельным полям, если они доступны. Но в языке запросов 1С напрямую получить компоненты составного типа нельзя, поэтому обычно приходится делать это на уровне кода 1С, формируя отдельные поля для сравнения.

    6. **Обходные пути**
    — Создать вычисляемое поле в запросе, которое будет приводить составной тип к простому (например, к строке или числу) и соединять по нему.
    — Использовать временные таблицы с уже подготовленными простыми ключами для соединения.
    — В некоторых случаях можно использовать объединение с пустыми ссылками (ЗНАЧЕНИЕ(Справочник.ПустаяСсылка)) для формирования составных типов в запросе.

    7. **Производительность**
    Соединение по составным типам может сильно влиять на производительность, особенно если составной тип содержит несколько компонентов и индексы не оптимальны. Рекомендуется минимизировать использование составных типов в условиях соединения и по возможности использовать простые ссылки.

    **Итог:**
    В 1С соединение таблиц по составному типу данных обычно сводится к соединению по ссылкам внутри этих составных типов. Если составной тип — это ссылка, то соединение по нему — обычное сравнение ссылок. Если составной тип сложнее, то нужно либо разбивать соединение на сравнение по базовым полям (если это возможно), либо использовать обходные методы с вычисляемыми полями или временными таблицами.

    https://infostart.ru/1c/articles/184361/ — подробный разбор работы с составными типами и их влияния на производительность.

    Если нужна конкретика по вашему случаю — можно привести пример структуры таблиц и составных типов, тогда дам точный код запроса.

    Если кратко, то в запросах 1С:
    — соединение по составному типу = соединение по ссылке внутри этого типа,
    — либо разбивка на базовые поля,
    — либо использование функции ЗНАЧЕНИЕ() для формирования пустых или типизированных значений.

    Надеюсь, это поможет!

    База знаний 1С