К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как объединить 2 таблицы в 1С: все рабочие способы

Способы объединить две таблицы в 1С: соединение в запросе, ОБЪЕДИНИТЬ, слияние таблиц значений и табличных документов. Примеры кода, ошибки и проверка результата.

Под объединением двух таблиц в 1С обычно понимают одну из трёх задач: соединить данные по ключевому полю в запросе, сложить строки двух выборок в одну, либо программно слить две таблицы значений. У каждой задачи свой инструмент, и выбор неправильного — самая частая причина «пустых» результатов и задвоенных строк.

Если таблицы нужно связать по общему полю (например, номенклатура и цены по коду товара), используется соединение в запросе — LEFT, INNER или полное соединение. Если нужно просто «приклеить» строки одной выборки к другой без связывания, применяется оператор ОБЪЕДИНИТЬ. Для таблиц значений в памяти существуют методы ЗаполнитьЗначения, циклы переноса строк и загрузка колонок.

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

Определите тип объединения: по строкам или по колонкам

Первый шаг — понять структуру результата. Вертикальное объединение увеличивает число строк: у вас было две таблицы по 100 записей, стала одна на 200. Горизонтальное соединение увеличивает число колонок: к данным о товарах добавляются цены, остатки или свойства из второй таблицы, а строк остаётся столько же (или меньше при фильтрации).

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

Маршрут решения

Как выбрать способ

Нужно добавить строки одной выборки к другой, поля совпадаютИспользуйте ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ в запросе
Нужно подтянуть данные из второй таблицы по общему полюИспользуйте ЛЕВОЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ в запросе
Таблицы уже в памяти как таблицы значенийПереносите строки циклом или используйте запрос с помещением ТЗ во временные таблицы
Нужно свести два табличных документа для печатиИспользуйте методы Вывести и Присоединить табличного документа

Соединение таблиц в запросе по ключевому полю

Соединение — основной способ объединить разнородные таблицы в языке запросов 1С. В конструкторе запроса это делается на закладке «Связи», но удобнее понимать текст запроса. Базовый синтаксис левого соединения:

ВЫБРАТЬ

Товары.Ссылка КАК Номенклатура,

Цены.Цена КАК Цена

ИЗ

Справочник.Номенклатура КАК Товары

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних() КАК Цены

ПО Товары.Ссылка = Цены.Номенклатура

Левое соединение возвращает все строки левой таблицы, даже если в правой пары не нашлось — в таких колонках будет NULL. Внутреннее соединение (ВНУТРЕННЕЕ) вернёт только те строки, где совпадение нашлось в обеих таблицах. Полное соединение (ПОЛНОЕ) вернёт всё из обеих сторон, заполняя отсутствующие значения NULL.

Проверяйте типы соединяемых полей: соединение ссылки со строкой или числом даст пустой результат без сообщения об ошибке. Если условие связи составное (например, по организации и номенклатуре одновременно), перечислите все условия через И — иначе получите декартово произведение и «взрыв» количества строк.

Вертикальное объединение выборок через ОБЪЕДИНИТЬ

Оператор ОБЪЕДИНИТЬ складывает строки двух и более запросов в один результат. Главное требование — одинаковое количество и совместимые типы полей в каждой выборке, причём порядок полей имеет значение, а не их имена.

ВЫБРАТЬ

Продажи.Номенклатура КАК Товар,

Продажи.Количество КАК Количество

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Продажи

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ

Возвраты.Номенклатура,

-Возвраты.Количество

ИЗ

Документ.ВозвратТоваровОтПокупателя.Товары КАК Возвраты

Разница между ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ принципиальна. Вариант без ВСЕ убирает полностью совпадающие строки-дубликаты, но работает медленнее на больших данных. Вариант с ВСЕ сохраняет все строки как есть и выполняется быстрее. Если дубликаты в вашей задаче недопустимы — используйте чистое ОБЪЕДИНИТЬ, если каждая строка значима (например, движения по документам) — ОБЪЕДИНИТЬ ВСЕ.

Объединение таблиц значений программно

Когда данные уже получены в виде таблиц значений (объект ТаблицаЗначений), объединить их можно без запроса. Для вертикального слияния переносите строки циклом:

Для Каждого Строка Из Таблица2 Цикл

НоваяСтрока = Таблица1.Добавить();

ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);

КонецЦикла;

Метод ЗаполнитьЗначенияСвойств переносит значения по совпадающим именам колонок, поэтому колонки с разными именами останутся пустыми. Перед циклом убедитесь, что в первой таблице есть все нужные колонки; при необходимости добавьте их методом Колонки.Добавить() с указанием типа.

Для горизонтального слияния таблиц значений по ключу удобнее всего поместить обе таблицы во временные таблицы запроса и выполнить соединение уже запросом. Это быстрее и надёжнее ручного поиска строк через Найти() в цикле, особенно на тысячах записей.

Слияние двух таблиц значений через запрос
  1. 1
    Создайте запрос и менеджер временных таблиц
  2. 2
    Поместите первую ТЗ во временную таблицу через параметр (ВЫБРАТЬ ... ПОМЕСТИТЬ Таб1 ИЗ &Таб1)
  3. 3
    Аналогично поместите вторую ТЗ в Таб2
  4. 4
    Напишите запрос с соединением Таб1 и Таб2 по ключевому полю
  5. 5
    Выполните запрос и выгрузите результат в новую таблицу значений
  6. 6
    Проверьте количество строк и отсутствие NULL в ключевых полях

Объединение табличных документов

Отдельная задача — слить два готовых табличных документа, например два отчёта или печатные формы, в один для вывода. Здесь работают методы Вывести() и Присоединить(). Вывести добавляет область второго документа ниже текущего, Присоединить — справа от уже выведенной области.

Типовой приём: создать итоговый табличный документ, последовательно вывести в него первый документ, затем второй. Если нужен разрыв страницы между ними, используйте метод ВывестиГоризонтальныйРазделительСтраниц(). Учитывайте, что ширины колонок двух документов могут не совпадать — при вертикальном склеивании это визуально заметно.

Проверка результата и типичные ошибки

После объединения всегда сверяйте контрольные цифры: количество строк, итоговые суммы, число уникальных ключей. Расхождение с исходными данными — сигнал о дублях в ключе связи, потере строк при внутреннем соединении или несовпадении типов полей.

Типичные ошибки
01
Соединение без проверки дублей в правой таблице — суммы в отчёте задваиваются и больше не сходятся с исходником
02
Использование ВНУТРЕННЕГО соединения там, где нужны все строки левой таблицы — часть данных молча пропадает
03
Разный порядок полей в частях ОБЪЕДИНИТЬ — данные попадают не в те колонки без какой-либо ошибки
04
Соединение по полям разных типов — результат пустой, хотя данные визуально совпадают
05
Перенос строк таблиц значений без добавления недостающих колонок — часть значений теряется
Контрольные точки

Как проверить результат

Количество строк результата
Норма

Совпадает с ожидаемым: сумма строк для ОБЪЕДИНИТЬ ВСЕ, число строк левой таблицы для ЛЕВОГО соединения без дублей

Тревожный признак

Строк больше ожидаемого — дубли в ключе связи; меньше — потеряны строки из-за типа соединения

Итоговые суммы
Норма

Сходятся с суммами исходных таблиц

Тревожный признак

Суммы выросли — размножение строк при соединении

Значения NULL
Норма

NULL только там, где реально нет пары в правой таблице

Тревожный признак

NULL в полях, которые должны быть заполнены — не сработало условие связи

Типы полей результата
Норма

Типы соответствуют ожиданию, группировки и сортировки работают

Тревожный признак

Составной тип поля ломает сравнение и итоги

Частые вопросы об объединении таблиц в 1С

Чем ОБЪЕДИНИТЬ отличается от СОЕДИНЕНИЯ?

ОБЪЕДИНИТЬ складывает строки выборок вертикально — результат содержит столько же колонок, сколько в исходных запросах. СОЕДИНЕНИЕ связывает таблицы горизонтально по условию и добавляет колонки одной таблицы к другой. Это разные операции для разных задач.

Почему после соединения таблиц результат пустой?

Чаще всего не совпадают типы или значения полей связи: например, ссылка соединяется со строкой, или в одном поле есть лишние пробелы. Проверьте типы обоих полей и попробуйте выполнить каждую выборку отдельно, чтобы убедиться, что ключевые значения реально совпадают.

Как объединить таблицы, у которых разные имена полей?

В запросе с ОБЪЕДИНИТЬ имена не важны — важен порядок полей в списке выборки. Расставьте поля в одинаковом логическом порядке в обеих частях. При соединении таблиц значений программно заранее переименуйте колонки или переносите значения по именам вручную в цикле.

Как убрать дубли строк после объединения?

Используйте ОБЪЕДИНИТЬ без ключевого слова ВСЕ — оно автоматически удаляет полностью совпадающие строки. Либо примените итоговую группировку (СГРУППИРОВАТЬ ПО) с агрегатными функциями, если дубли нужно свернуть с суммированием значений.

Можно ли объединить более двух таблиц за один запрос?

Да. ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ можно цепочкой применять к любому числу выборок. Соединения тоже наращиваются: после первого соединения добавляется второе, третье и так далее. Следите только за читаемостью — при большом числе источников удобнее выносить промежуточные данные во временные таблицы.

Что быстрее: соединение в запросе или цикл по таблицам значений?

На заметных объёмах данных запрос с соединением работает значительно быстрее, потому что выполняется на стороне СУБД с использованием индексов. Циклы с методом Найти() оправданы только для небольших таблиц или когда данные невозможно получить запросом.

Итог

Что важно запомнить

Связь по ключевому полю — это СОЕДИНЕНИЕ в запросе, сложение строк — ОБЪЕДИНИТЬ, таблицы значений в памяти удобнее всего сливать через временные таблицы. Всегда проверяйте результат по количеству строк и контрольным суммам: дубли в ключе связи и несовпадение типов полей — главные источники ошибок.