Как объединить две таблицы значений в системе 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

Как видим, после выполнения этой функции произошло объединение двух таблиц значений. Хотя в таблицах встречаются как разные, так и одинаковые элементы в результирующей таблице совпадающие элементы не повторяются.

ПОДПИСКА

2 ответы
  1. Дмитрий говорит:

    А не проще использовать Временные таблицы?

Комментарии закрыты.