Функция копирования колонок в таблицу или дерево значений (конструктор таблиц и деревьев значений)
Теги: 1С,ТаблицаЗначений,РезультатЗапроса,ДеревоЗначений

Данная функция может использоваться как конструктор для создания таблицы или дерева значений из других объектов, имеющих коллекцию колонок, включая РезультатЗапроса. А также дополнения колонок из других коллекций.

# Код реализации

```1c
// СкопироватьКолонки  —  Копирует заданные колонки из Источника в Приемник с учетом исключений
//
// Параметры:
// Приемник — ТаблицаЗначений, ДеревоЗначений — коллекция в которой создаются колонки
// Источник — РезультатЗапроса, ТаблицаЗначений, ДеревоЗначений — коллекция из которой копируются свойства колонок
//          — СтрокаДереваЗначений, СтрокаТаблицыЗначений — строка коллекции из которой копируются свойства колонок
// ИменаКолонок — Строка — разделенные запятыми имена колонок, которые подлежат копированию
//              — Массив, ФиксированныйМассив — массив имен колонок, которые подлежат копированию
//              — Неопределено — копируются все колонки с учетом исключений
// ИменаКолонокИсключений — Строка — разделенные запятыми имена колонок, которые исключены из копирования
//              		  — Массив, ФиксированныйМассив — массив имен колонок, которые исключены из копирования
//              		  — Неопределено — нет исключений
//
// Возвращаемое значение:
//      — ТаблицаЗначений, ДеревоЗначений — значение параметра Приемник
// Пример:
//       Дерево = СкопироватьКолонки(Новый ДеревоЗначений(), РезультатЗапроса);
//
Функция СкопироватьКолонки(Приемник, Знач Источник, Знач ИменаКолонок = Неопределено, Знач ИменаКолонокИсключений = Неопределено) Экспорт
	Перем Колонка, КоллекцияИмен, КоллекцияИменИсключений, КолонкиИсточника;

	Если ЗначениеЗаполнено(ИменаКолонок) Тогда
		Если ТипЗнч(ИменаКолонок) = Тип("Строка") Тогда
		    КоллекцияИмен = РазложитьСтрокуВМассивПодстрок(ИменаКолонок, ",", Истина, Истина);
		Иначе
		    КоллекцияИмен = ИменаКолонок;
		КонецЕсли;
	Иначе
		КоллекцияИмен = Неопределено;
	КонецЕсли;

	Если ЗначениеЗаполнено(ИменаКолонокИсключений) Тогда
		Если ТипЗнч(ИменаКолонокИсключений) = Тип("Строка") Тогда
		    КоллекцияИменИсключений = РазложитьСтрокуВМассивПодстрок(ИменаКолонокИсключений, ",", Истина, Истина);
		Иначе
		    КоллекцияИменИсключений = ИменаКолонокИсключений;
		КонецЕсли;
	Иначе
		КоллекцияИменИсключений = Неопределено;
	КонецЕсли;

	Если ТипЗнч(Источник) = Тип("СтрокаДереваЗначений")
		ИЛИ ТипЗнч(Источник) = Тип("СтрокаТаблицыЗначений") Тогда
		КолонкиИсточника = Источник.Владелец().Колонки;
	Иначе
		КолонкиИсточника = Источник.Колонки;
	КонецЕсли;

	Для Каждого Колонка Из КолонкиИсточника Цикл
		Если (КоллекцияИмен = Неопределено ИЛИ КоллекцияИмен.Найти(Колонка.Имя) <> Неопределено)
			И (КоллекцияИменИсключений = Неопределено ИЛИ КоллекцияИменИсключений.Найти(Колонка.Имя) = Неопределено)
		Тогда
            Если ТипЗнч(Источник) = Тип("РезультатЗапроса") Тогда
			    Приемник.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения, Колонка.Имя, Колонка.Ширина);
            Иначе
			    Приемник.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения, Колонка.Заголовок, Колонка.Ширина);
            КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Возврат Приемник;
КонецФункции
```