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

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как соединять таблицы по составным типам данных в 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #35562
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        Соединение таблиц по составному типу данных

      • #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 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С