Добавить колонку из одной таблицы значений к другой

Как добавить колонку одной таблицы значений к другой, связав, при этом, значения по ключевым полям?

Предположим, у нас есть две таблицы значений — «ПерваяТЗ» и «ВтораяТЗ». Их состав:

ПерваяТЗ:

Номенклатура        Цена
Торшер 1000
Утюг 750
Пылесос 5000

ВтораяТЗ:

Номенклатура        ДатаПоставки
Торшер 12.12.2013
Пылесос 16.12.2013
Микроволновая печь 30.11.2013

А получить необходимо таблицу, в которой будет номенклатура, цена этой номенклатуры и дата поставки именно для этой номенклатуры.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// В качестве колонки для связи строк используется "Номенклатура"
КолонкаПоиска = "Номенклатура";
ИтоговаяТЗ = Новый ТаблицаЗначений;
 
// В данном примере я добавляю только одно значение в массив, 
// но можно в цикле заполнить его и другими значениями поиска.
МассивКолонокПоиска = Новый Массив;
МассивКолонокПоиска.Добавить(КолонкаПоиска);
 
// Формируем новую таблицу значений - ИтоговаяТЗ из двух таблиц
Для Каждого КолонкаТаблицы ИЗ ПерваяТЗ.Колонки Цикл
	// из первой ТЗ берём все колонки
	ИтоговаяТЗ.Колонки.Добавить(КолонкаТаблицы.Имя);
КонецЦикла;
 
Для Каждого КолонкаТаблицы ИЗ ВтораяТЗ.Колонки Цикл
	// из второй все кроме ключевой
	Если МассивКолонокПоиска.Найти(КолонкаТаблицы.Имя) <> Неопределено Тогда
		Продолжить;
	КонецЕсли;
	ИтоговаяТЗ.Колонки.Добавить(КолонкаТаблицы.Имя);
КонецЦикла;
 
// Заполняем строчки ключей которых НЕТ в таблице значений ВтораяТЗ
Для Каждого СтрокаПервойТЗ ИЗ ПерваяТЗ Цикл
	// Формируем структуру поиска
	Отбор = Новый Структура;
	Для Каждого СтрокаПоиска ИЗ МассивКолонокПоиска Цикл
		Отбор.Вставить(СтрокаПоиска, СтрокаПервойТЗ[СтрокаПоиска]);
	КонецЦикла;
 
	Если ВтораяТЗ.НайтиСтроки(Отбор).Количество() = 0 Тогда
		СтрокаИтоговойТЗ = ИтоговаяТЗ.Добавить();
		// копируем все значения из строчки ПерваяТЗ
		Для Каждого КолонкаПервойТЗ ИЗ ПерваяТЗ.Колонки Цикл
			СтрокаИтоговойТЗ[КолонкаПервойТЗ.Имя] = СтрокаПервойТЗ[КолонкаПервойТЗ.Имя];
		КонецЦикла;
 
	КонецЕсли;
 
КонецЦикла;
 
// Заполняем строчки ключи которых ЕСТЬ в таблице значений ВтораяТЗ
Для Каждого СтрокаПервойТЗ ИЗ ПерваяТЗ Цикл
	// Формируем структуру поиска
	Отбор = Новый Структура;
 
	Для Каждого СтрокаПоиска ИЗ МассивКолонокПоиска Цикл
		Отбор.Вставить(СтрокаПоиска, СтрокаПервойТЗ[СтрокаПоиска]);
	КонецЦикла;
 
	НайденныеСтроки = ВтораяТЗ.НайтиСтроки(Отбор);
 
	Если НайденныеСтроки.Количество() > 0 Тогда
 
		Для Каждого НайденнаяСтрока ИЗ НайденныеСтроки Цикл
			// заполняем все колонки
			СтрокаИтоговойТЗ = ИтоговаяТЗ.Добавить();
 
			// из ПерваяТЗ
			Для Каждого КолонкаПервойТЗ ИЗ ПерваяТЗ.Колонки Цикл
				СтрокаИтоговойТЗ[КолонкаПервойТЗ.Имя] = СтрокаПервойТЗ[КолонкаПервойТЗ.Имя];
			КонецЦикла;
 
			// из ВтораяТЗ
			Для Каждого КолонкаВторойТЗ ИЗ ВтораяТЗ.Колонки Цикл
				СтрокаИтоговойТЗ[КолонкаВторойТЗ.Имя] = НайденнаяСтрока[КолонкаВторойТЗ.Имя];
			КонецЦикла;
 
		КонецЦикла;
 
	КонецЕсли;
 
КонецЦикла;
 
// Заполняем строчки из ВтораяТЗ ключей которых НЕТ в ПерваяТЗ
Для Каждого СтрокаВторойТЗ ИЗ ВтораяТЗ Цикл
 
	// Формируем структуру поиска
	Отбор = Новый Структура;
 
	Для Каждого СтрокаПоиска ИЗ МассивКолонокПоиска Цикл
		Отбор.Вставить(СтрокаПоиска, СтрокаВторойТЗ[СтрокаПоиска]);
	КонецЦикла;
 
	Если ПерваяТЗ.НайтиСтроки(Отбор).Количество() = 0 Тогда
 
		СтрокаИтоговойТЗ = ИтоговаяТЗ.Добавить();
 
		// копируем все значения из строчки ПерваяТЗ
		Для Каждого КолонкаВторойТЗ ИЗ ВтораяТЗ.Колонки Цикл
			СтрокаИтоговойТЗ[КолонкаВторойТЗ.Имя] = СтрокаВторойТЗ[КолонкаВторойТЗ.Имя];
		КонецЦикла;
 
	КонецЕсли;
 
КонецЦикла;

Результатом выполнения объединения таблиц значений будет следующая таблица:
ИтоговаяТЗ:

Номенклатура Цена ДатаПоставки
Торшер 1000 12.12.2013
Утюг 750
Пылесос 5000 16.12.2013

Для номенклатуры «Утюг» дата не проставилась, т.к. не нашлось соответствия во второй таблице значений.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

WP-SpamFree by Pole Position Marketing