Как объединить две таблицы значений в 1С, дополнив данные одной из другой?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С часто возникает необходимость объединения данных из двух разных ТаблицаЗначений. Нередко встречается ситуация, когда у нас есть базовая таблица с набором данных, и вспомогательная таблица, которую нужно «присоединить», добавив новые колонки и значения в соответствующие строки. Давайте разберем, как реализовать это корректно.

Метод ручного переноса данных через циклы

Если структуры таблиц не совпадают, а нам необходимо расширить одну из них, оптимальным подходом будет программное добавление недостающих колонок и последовательное заполнение ячеек. Рассмотрим реализацию, которая позволяет гибко управлять этим процессом:


// Сначала дополняем структуру первой таблицы новыми колонками из второй
Для Каждого Колонка Из Таблица2.Колонки Цикл
    Если Таблица1.Колонки.Найти(Колонка.Имя) = Неопределено Тогда
        Таблица1.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
    КонецЕсли;
КонецЦикла;

// Теперь заполняем значения в первой таблице на основе данных второй
Для Каждого Строка Из Таблица1 Цикл
    Индекс = Таблица1.Индекс(Строка);
    // Проверяем, существует ли соответствующая строка во второй таблице
    Если Индекс <= Таблица2.Количество() - 1 Тогда
        Для Каждого Колонка Из Таблица2.Колонки Цикл
            Строка[Колонка.Имя] = Таблица2[Индекс][Колонка.Имя];
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

В этом примере мы сначала итерируемся по колонкам второй таблицы. Используя метод Найти(), мы проверяем, существует ли такая колонка в целевой таблице. Если колонка отсутствует — добавляем её. После подготовки структуры переходим к наполнению данными. Мы используем Индекс текущей строки для синхронизации данных между объектами.

Использование метода ЗаполнитьЗначенияСвойств

Если ваша задача упрощается до того, что имена колонок в обеих таблицах совпадают (или вы хотите скопировать только совпадающие поля), можно воспользоваться более лаконичным инструментом — ЗаполнитьЗначенияСвойств. Этот метод позволяет одной командой перенести значения из источника в приемник.

Разберем, как применить его для синхронизации строк:


Для Индекс = 0 По Таблица2.Количество() - 1 Цикл
    // Заполняем строку первой таблицы данными из строки второй
    ЗаполнитьЗначенияСвойств(Таблица1[Индекс], Таблица2[Индекс]);
КонецЦикла;

Важные нюансы работы:

  1. Метод ЗаполнитьЗначенияСвойств ищет в целевом объекте свойства (в нашем случае — колонки) с такими же именами, как у источника, и присваивает им значения.
  2. Если в целевой таблице нет колонки с нужным именем, метод не будет выдавать ошибку, а просто проигнорирует данное поле.
  3. Будьте осторожны с количеством строк: если Таблица2 больше, чем Таблица1, при обращении по индексу можно получить ошибку выхода за границы массива. Всегда проверяйте количество элементов.

Рекомендации по оптимизации

Хотя циклы являются понятным способом решения задачи, при работе с большими объемами данных (тысячи строк) они могут работать медленно. Если данные в таблицах связаны каким-либо общим ключевым полем (например, артикулом или кодом), лучше использовать другие подходы:

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

← На главную