Как объединить две таблицы значений в системе 1С:Предприятие 8?
Здравствуйте, уважаемые читатели! Эта одна из статей, касающаяся темы программирования с таблицей значений в системе 1С:Предприятие 8. В этой статье приведена функция для слияния двух таблиц значений в одну с неповторяющимися строками.
Функция СлитьТЗ(ТЗ1, ТЗ2, КолонкаПоиска) возвращает таблицу значений в которой объединены все элементы из таблиц значений ТЗ1 и ТЗ2 по полю КолонкаПоиска.
Функция СлитьТЗ(ТЗ1, ТЗ2, КолонкаПоиска) Результат = Новый ТаблицаЗначений; Результат = ТЗ1.Скопировать(); Для Каждого Эл из ТЗ1 цикл //Проверяем значение в таблице Результат, //если такого значения нет, то продолжаем Если Результат.Найти(Эл[КолонкаПоиска],КолонкаПоиска) = Неопределено Тогда //Проверяем значение в таблице ТЗ2, //если такого значения нет, то добавляем Если ТЗ2.Найти(Эл[КолонкаПоиска],КолонкаПоиска) = Неопределено Тогда НоваяСтрока = Результат.Добавить(); Для Каждого Кол Из Результат.Колонки Цикл НоваяСтрока[Кол.Имя] = Эл[Кол.Имя]; КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; Для Каждого Эл из ТЗ2 цикл //Проверяем значение в таблице Результат, //если такого значения нет, то продолжаем Если Результат.Найти(Эл[КолонкаПоиска],КолонкаПоиска) = Неопределено Тогда //Проверяем значение в таблице ТЗ1, //если такого значения нет, то добавляем Если ТЗ1.Найти(Эл[КолонкаПоиска],КолонкаПоиска) = Неопределено Тогда НоваяСтрока1 = Результат.Добавить(); Для Каждого Кол Из Результат.Колонки Цикл НоваяСтрока1[Кол.Имя] = Эл[Кол.Имя]; КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции
Напрмер, создадим две таблицы значений ТаблицаЗначений1 и ТаблицаЗначений2 и заполним их значениями.
ТаблицаЗначений1 = Новый ТаблицаЗначений; ТаблицаЗначений2 = Новый ТаблицаЗначений; // Создать нужные колонки. ТаблицаЗначений1.Колонки.Добавить("НомерПоступления"); ТаблицаЗначений1.Колонки.Добавить("НомерДокумента"); // Добавить новую строку и задать значения в колонках таблицы. НоваяСтрока = ТаблицаЗначений1.Добавить(); НоваяСтрока.НомерПоступления = "08090/0053975"; НоваяСтрока.НомерДокумента = "23"; // Добавить новую строку и задать значения в колонках таблицы. НоваяСтрока = ТаблицаЗначений1.Добавить(); НоваяСтрока["НомерПоступления"] = "GAI0363031"; НоваяСтрока["НомерДокумента"] = "24"; НоваяСтрока = ТаблицаЗначений1.Добавить(); НоваяСтрока["НомерПоступления"] = "GAI0363032"; НоваяСтрока["НомерДокумента"] = "25"; // Создать нужные колонки. ТаблицаЗначений2.Колонки.Добавить("НомерПоступления"); ТаблицаЗначений2.Колонки.Добавить("НомерДокумента"); // Добавить новую строку и задать значения в колонках таблицы. НоваяСтрока = ТаблицаЗначений2.Добавить(); НоваяСтрока["НомерПоступления"] = "GAI0363031"; НоваяСтрока["НомерДокумента"] = "24"; НоваяСтрока = ТаблицаЗначений2.Добавить(); НоваяСтрока["НомерПоступления"] = "GAI0363032"; НоваяСтрока["НомерДокумента"] = "251"; НоваяСтрока = ТаблицаЗначений2.Добавить(); НоваяСтрока["НомерПоступления"] = "GAI0363032"; НоваяСтрока["НомерДокумента"] = "205"; // Создадим новую обработку и вставим на форму // три табличных поля, затем отобразим на них наши таблицы ЭлементыФормы.ТабличноеПоле1.Значение = ТаблицаЗначений1; ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки(); ЭлементыФормы.ТабличноеПоле2.Значение = ТаблицаЗначений2; ЭлементыФормы.ТабличноеПоле2.СоздатьКолонки(); ЭлементыФормы.ТабличноеПоле3.Значение = СлитьТЗ(ТаблицаЗначений1, ТаблицаЗначений2, "НомерДокумента"); ЭлементыФормы.ТабличноеПоле3.СоздатьКолонки();
Рзультат ТаблицаЗначений1:
НомерПоступления | НомерДокумента |
08090/0053975 | 23 |
GAI0363031 | 24 |
GAI0363032 | 25 |
Рзультат ТаблицаЗначений2:
НомерПоступления | НомерДокумента |
GAI0363031 | 24 |
GAI0363032 | 251 |
GAI0363032 | 205 |
Рзультат объединения:
НомерПоступления | НомерДокумента |
08090/0053975 | 23 |
GAI0363031 | 24 |
GAI0363032 | 25 |
GAI0363032 | 251 |
GAI0363032 | 205 |
Как видим, после выполнения этой функции произошло объединение двух таблиц значений. Хотя в таблицах встречаются как разные, так и одинаковые элементы в результирующей таблице совпадающие элементы не повторяются.
А не проще использовать Временные таблицы?
Может и проще, смотрите сами.