База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как соединять таблицы по составным типам данных в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 5 дней, 5 часов назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
22 января 2026 в 14:00 #35562
Соединение таблиц по составному типу данных
-
22 января 2026 в 14:00 #35563
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С:
— соединение по составному типу = соединение по ссылке внутри этого типа,
— либо разбивка на базовые поля,
— либо использование функции ЗНАЧЕНИЕ() для формирования пустых или типизированных значений.Надеюсь, это поможет!
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.