Разработка и Конфигурация · 9 мин
Как объединить 2 таблицы в 1С: все рабочие способы
Способы объединить две таблицы в 1С: соединение в запросе, ОБЪЕДИНИТЬ, слияние таблиц значений и табличных документов. Примеры кода, ошибки и проверка результата.
Под объединением двух таблиц в 1С обычно понимают одну из трёх задач: соединить данные по ключевому полю в запросе, сложить строки двух выборок в одну, либо программно слить две таблицы значений. У каждой задачи свой инструмент, и выбор неправильного — самая частая причина «пустых» результатов и задвоенных строк.
Если таблицы нужно связать по общему полю (например, номенклатура и цены по коду товара), используется соединение в запросе — LEFT, INNER или полное соединение. Если нужно просто «приклеить» строки одной выборки к другой без связывания, применяется оператор ОБЪЕДИНИТЬ. Для таблиц значений в памяти существуют методы ЗаполнитьЗначения, циклы переноса строк и загрузка колонок.
Перед началом работы определите, что именно вы хотите получить: горизонтальное расширение таблицы новыми колонками или вертикальное добавление строк. От этого зависит весь дальнейший механизм. Ниже разобраны оба сценария с примерами кода, которые можно адаптировать под свою конфигурацию.
Определите тип объединения: по строкам или по колонкам
Первый шаг — понять структуру результата. Вертикальное объединение увеличивает число строк: у вас было две таблицы по 100 записей, стала одна на 200. Горизонтальное соединение увеличивает число колонок: к данным о товарах добавляются цены, остатки или свойства из второй таблицы, а строк остаётся столько же (или меньше при фильтрации).
Типичный признак вертикальной задачи — таблицы имеют одинаковый набор полей и содержат однотипные данные за разные периоды или из разных источников. Признак горизонтальной задачи — таблицы разные по составу колонок, но у них есть общий ключ: ссылка на номенклатуру, контрагента, номер документа.
Как выбрать способ
Соединение таблиц в запросе по ключевому полю
Соединение — основной способ объединить разнородные таблицы в языке запросов 1С. В конструкторе запроса это делается на закладке «Связи», но удобнее понимать текст запроса. Базовый синтаксис левого соединения:
ВЫБРАТЬ
Товары.Ссылка КАК Номенклатура,
Цены.Цена КАК Цена
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних() КАК Цены
ПО Товары.Ссылка = Цены.Номенклатура
Левое соединение возвращает все строки левой таблицы, даже если в правой пары не нашлось — в таких колонках будет NULL. Внутреннее соединение (ВНУТРЕННЕЕ) вернёт только те строки, где совпадение нашлось в обеих таблицах. Полное соединение (ПОЛНОЕ) вернёт всё из обеих сторон, заполняя отсутствующие значения NULL.
Проверяйте типы соединяемых полей: соединение ссылки со строкой или числом даст пустой результат без сообщения об ошибке. Если условие связи составное (например, по организации и номенклатуре одновременно), перечислите все условия через И — иначе получите декартово произведение и «взрыв» количества строк.
Вертикальное объединение выборок через ОБЪЕДИНИТЬ
Оператор ОБЪЕДИНИТЬ складывает строки двух и более запросов в один результат. Главное требование — одинаковое количество и совместимые типы полей в каждой выборке, причём порядок полей имеет значение, а не их имена.
ВЫБРАТЬ
Продажи.Номенклатура КАК Товар,
Продажи.Количество КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Продажи
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Возвраты.Номенклатура,
-Возвраты.Количество
ИЗ
Документ.ВозвратТоваровОтПокупателя.Товары КАК Возвраты
Разница между ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ принципиальна. Вариант без ВСЕ убирает полностью совпадающие строки-дубликаты, но работает медленнее на больших данных. Вариант с ВСЕ сохраняет все строки как есть и выполняется быстрее. Если дубликаты в вашей задаче недопустимы — используйте чистое ОБЪЕДИНИТЬ, если каждая строка значима (например, движения по документам) — ОБЪЕДИНИТЬ ВСЕ.
Объединение таблиц значений программно
Когда данные уже получены в виде таблиц значений (объект ТаблицаЗначений), объединить их можно без запроса. Для вертикального слияния переносите строки циклом:
Для Каждого Строка Из Таблица2 Цикл
НоваяСтрока = Таблица1.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
КонецЦикла;
Метод ЗаполнитьЗначенияСвойств переносит значения по совпадающим именам колонок, поэтому колонки с разными именами останутся пустыми. Перед циклом убедитесь, что в первой таблице есть все нужные колонки; при необходимости добавьте их методом Колонки.Добавить() с указанием типа.
Для горизонтального слияния таблиц значений по ключу удобнее всего поместить обе таблицы во временные таблицы запроса и выполнить соединение уже запросом. Это быстрее и надёжнее ручного поиска строк через Найти() в цикле, особенно на тысячах записей.
- 1Создайте запрос и менеджер временных таблиц
- 2Поместите первую ТЗ во временную таблицу через параметр (ВЫБРАТЬ ... ПОМЕСТИТЬ Таб1 ИЗ &Таб1)
- 3Аналогично поместите вторую ТЗ в Таб2
- 4Напишите запрос с соединением Таб1 и Таб2 по ключевому полю
- 5Выполните запрос и выгрузите результат в новую таблицу значений
- 6Проверьте количество строк и отсутствие NULL в ключевых полях
Объединение табличных документов
Отдельная задача — слить два готовых табличных документа, например два отчёта или печатные формы, в один для вывода. Здесь работают методы Вывести() и Присоединить(). Вывести добавляет область второго документа ниже текущего, Присоединить — справа от уже выведенной области.
Типовой приём: создать итоговый табличный документ, последовательно вывести в него первый документ, затем второй. Если нужен разрыв страницы между ними, используйте метод ВывестиГоризонтальныйРазделительСтраниц(). Учитывайте, что ширины колонок двух документов могут не совпадать — при вертикальном склеивании это визуально заметно.
Проверка результата и типичные ошибки
После объединения всегда сверяйте контрольные цифры: количество строк, итоговые суммы, число уникальных ключей. Расхождение с исходными данными — сигнал о дублях в ключе связи, потере строк при внутреннем соединении или несовпадении типов полей.
Как проверить результат
Совпадает с ожидаемым: сумма строк для ОБЪЕДИНИТЬ ВСЕ, число строк левой таблицы для ЛЕВОГО соединения без дублей
Строк больше ожидаемого — дубли в ключе связи; меньше — потеряны строки из-за типа соединения
Сходятся с суммами исходных таблиц
Суммы выросли — размножение строк при соединении
NULL только там, где реально нет пары в правой таблице
NULL в полях, которые должны быть заполнены — не сработало условие связи
Типы соответствуют ожиданию, группировки и сортировки работают
Составной тип поля ломает сравнение и итоги
Частые вопросы об объединении таблиц в 1С
Чем ОБЪЕДИНИТЬ отличается от СОЕДИНЕНИЯ?
ОБЪЕДИНИТЬ складывает строки выборок вертикально — результат содержит столько же колонок, сколько в исходных запросах. СОЕДИНЕНИЕ связывает таблицы горизонтально по условию и добавляет колонки одной таблицы к другой. Это разные операции для разных задач.
Почему после соединения таблиц результат пустой?
Чаще всего не совпадают типы или значения полей связи: например, ссылка соединяется со строкой, или в одном поле есть лишние пробелы. Проверьте типы обоих полей и попробуйте выполнить каждую выборку отдельно, чтобы убедиться, что ключевые значения реально совпадают.
Как объединить таблицы, у которых разные имена полей?
В запросе с ОБЪЕДИНИТЬ имена не важны — важен порядок полей в списке выборки. Расставьте поля в одинаковом логическом порядке в обеих частях. При соединении таблиц значений программно заранее переименуйте колонки или переносите значения по именам вручную в цикле.
Как убрать дубли строк после объединения?
Используйте ОБЪЕДИНИТЬ без ключевого слова ВСЕ — оно автоматически удаляет полностью совпадающие строки. Либо примените итоговую группировку (СГРУППИРОВАТЬ ПО) с агрегатными функциями, если дубли нужно свернуть с суммированием значений.
Можно ли объединить более двух таблиц за один запрос?
Да. ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ можно цепочкой применять к любому числу выборок. Соединения тоже наращиваются: после первого соединения добавляется второе, третье и так далее. Следите только за читаемостью — при большом числе источников удобнее выносить промежуточные данные во временные таблицы.
Что быстрее: соединение в запросе или цикл по таблицам значений?
На заметных объёмах данных запрос с соединением работает значительно быстрее, потому что выполняется на стороне СУБД с использованием индексов. Циклы с методом Найти() оправданы только для небольших таблиц или когда данные невозможно получить запросом.
Что важно запомнить
Связь по ключевому полю — это СОЕДИНЕНИЕ в запросе, сложение строк — ОБЪЕДИНИТЬ, таблицы значений в памяти удобнее всего сливать через временные таблицы. Всегда проверяйте результат по количеству строк и контрольным суммам: дубли в ключе связи и несовпадение типов полей — главные источники ошибок.