1с как объединить две таблицы значений

Наша сегодняшняя статья полностью, касается темы, связанной с программированием с таблицей значение с таблицей значений в системе 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

Товар Количество
1 Стул деревянный 4
2 Стол деревянный 1
Таблица 2
Товар Количество
1 Шкаф для одежды 1
2 Тумба прикроватная 2

и стоит задача их объединить. Самый элементарный способ реализации, который напрашивается: построчно скопировать строки второй таблицы в конец первой:

В результате мы получим таблицу вида:

Результат

Товар Количество
1 Стул деревянный 4
2 Стол деревянный 1
3 Шкаф для одежды 1
4 Тумба прикроватная 2

Но у приведенного выше алгоритма есть один недостаток: он привязан к именам колонок таблиц значений. Чтобы сделать этот код по настоящему универсальным, следует использовать функцию встроенного языка ЗаполнитьЗначенияСвойств(), тогда не понадобится прописывать имена колонок в коде каждый раз при объединении таблиц:

Почему я перенес инициализацию номера строки ниже, думаю, Вы догадаетесь сами. Если нет, рекомендую прорешать данную задачу на практике самостоятельно.

Здравствуйте, уважаемые читатели! Эта одна из статей, касающаяся темы программирования с таблицей значений в системе 1С:Предприятие 8. В этой статье приведена функция для слияния двух таблиц значений в одну с неповторяющимися строками.

Функция СлитьТЗ(ТЗ1, ТЗ2, КолонкаПоиска) возвращает таблицу значений в которой обединены все элементы
из таблиц значений ТЗ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 . СоздатьКолонки ( ) ;

НомерПоступления НомерДокумента
08090/0053975 23
GAI0363031 24
GAI0363032 25
НомерПоступления НомерДокумента
GAI0363031 24
GAI0363032 251
GAI0363032 205
НомерПоступления НомерДокумента
08090/0053975 23
GAI0363031 24
GAI0363032 25
GAI0363032 251
GAI0363032 205

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

Понравилась статья? Поделиться с друзьями:
Vkontakte.INFO
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: