В процессе разработки на платформе 1С часто возникает необходимость объединения данных из двух разных ТаблицаЗначений. Нередко встречается ситуация, когда у нас есть базовая таблица с набором данных, и вспомогательная таблица, которую нужно «присоединить», добавив новые колонки и значения в соответствующие строки. Давайте разберем, как реализовать это корректно.
Если структуры таблиц не совпадают, а нам необходимо расширить одну из них, оптимальным подходом будет программное добавление недостающих колонок и последовательное заполнение ячеек. Рассмотрим реализацию, которая позволяет гибко управлять этим процессом:
// Сначала дополняем структуру первой таблицы новыми колонками из второй
Для Каждого Колонка Из Таблица2.Колонки Цикл
Если Таблица1.Колонки.Найти(Колонка.Имя) = Неопределено Тогда
Таблица1.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
КонецЕсли;
КонецЦикла;
// Теперь заполняем значения в первой таблице на основе данных второй
Для Каждого Строка Из Таблица1 Цикл
Индекс = Таблица1.Индекс(Строка);
// Проверяем, существует ли соответствующая строка во второй таблице
Если Индекс <= Таблица2.Количество() - 1 Тогда
Для Каждого Колонка Из Таблица2.Колонки Цикл
Строка[Колонка.Имя] = Таблица2[Индекс][Колонка.Имя];
КонецЦикла;
КонецЕсли;
КонецЦикла;
В этом примере мы сначала итерируемся по колонкам второй таблицы. Используя метод Найти(), мы проверяем, существует ли такая колонка в целевой таблице. Если колонка отсутствует — добавляем её. После подготовки структуры переходим к наполнению данными. Мы используем Индекс текущей строки для синхронизации данных между объектами.
Если ваша задача упрощается до того, что имена колонок в обеих таблицах совпадают (или вы хотите скопировать только совпадающие поля), можно воспользоваться более лаконичным инструментом — ЗаполнитьЗначенияСвойств. Этот метод позволяет одной командой перенести значения из источника в приемник.
Разберем, как применить его для синхронизации строк:
Для Индекс = 0 По Таблица2.Количество() - 1 Цикл
// Заполняем строку первой таблицы данными из строки второй
ЗаполнитьЗначенияСвойств(Таблица1[Индекс], Таблица2[Индекс]);
КонецЦикла;
Важные нюансы работы:
ЗаполнитьЗначенияСвойств ищет в целевом объекте свойства (в нашем случае — колонки) с такими же именами, как у источника, и присваивает им значения.Таблица2 больше, чем Таблица1, при обращении по индексу можно получить ошибку выхода за границы массива. Всегда проверяйте количество элементов.Хотя циклы являются понятным способом решения задачи, при работе с большими объемами данных (тысячи строк) они могут работать медленно. Если данные в таблицах связаны каким-либо общим ключевым полем (например, артикулом или кодом), лучше использовать другие подходы:
МенеджерВременныхТаблиц. Используя оператор ЛЕВОЕ СОЕДИНЕНИЕ, вы сможете объединить данные на уровне СУБД, что работает в разы быстрее любого цикла.Индексы.Добавить() для ключевых колонок таблицы. Это значительно ускорит поиск с помощью метода НайтиСтроки().ОписаниеТипов. Это избавит вас от проблем с приведением значений в будущем, особенно если данные выгружаются из разных источников.Подводя итог: если таблицы небольшие, метод с циклами и методом ЗаполнитьЗначенияСвойств является быстрым и эффективным решением. Для серьезных задач с большими массивами данных рекомендуем переходить на использование механизмов запросов 1С.