Умею таблицу, загруженную из екселя с помощью запроса ADO.
Помещаю результат запроса во временную таблицу, в результате во временной таблице не все колонки.
В результате анализа
Получается в функции ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс() общего модуля ирНеглобальный генерится ТЗ с колонками, для которых тип небыл задан (КолонкаДанных.ТипЗначения.Типы().Количество() > 0). Остальные колонки с типами в ТЗ не попадают.
Запустил следующим образом:
1) В консоли запроса в процедуре ПоместитьДанныеСтрокиЗапросаВоВременнуюТаблицу в вызове ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс убрал второй параметр
2) в ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс() внес следующие изменения для того, чтобы колонок с типом Null небыло:
Цитата
Функция ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс(Знач ТаблицаДанных, СужатьТолькоПроизвольныеКолонки = Ложь) Экспорт
ТипизированнаяТаблица = Новый ТаблицаЗначений;
//Состояние("Оптимизация типов колонок");
МетаданныеТаблицыИзменены = Ложь;
Для Каждого КолонкаДанных Из ТаблицаДанных.Колонки Цикл
Если Истина
И СужатьТолькоПроизвольныеКолонки
И КолонкаДанных.ТипЗначения.Типы().Количество() > 0
Тогда
Продолжить;
КонецЕсли;
Типы = Новый Массив;
ТаблицаКолонки = ТаблицаДанных.Скопировать(, КолонкаДанных.Имя);
ТаблицаКолонки.Свернуть(КолонкаДанных.Имя);
//Индикатор = УФ(сПолучитьИндикаторПроцесса, ТаблицаКолонки.Количество(), "Оптимизация типов колонки """ + КолонкаДанных.Имя + """");
Для Каждого СтрокаДанных Из ТаблицаКолонки Цикл
//ЛксОбработатьИндикатор(Индикатор);
ТипЗначения = ТипЗнч(СтрокаДанных[КолонкаДанных.Имя]);
//Симашкевич Начало 17.10.2013 12:13
Если ТипЗначения = ТипЗнч(Null) Тогда
Продолжить;
КонецЕсли;
//Симашкевич Окончание 17.10.2013 12:13
Если Типы.Найти(ТипЗначения) = Неопределено Тогда
Типы.Добавить(ТипЗначения);
КонецЕсли;
КонецЦикла;
//Симашкевич Начало 17.10.2013 12:13
Если Типы.Количество() = 0 Тогда
Типы.Добавить(Тип("Строка"));
МетаданныеТаблицыИзменены = Истина;
КонецЕсли;
//Симашкевич Окончание 17.10.2013 12:13
Если Типы.Количество() <> КолонкаДанных.ТипЗначения.Типы().Количество() Тогда
МетаданныеТаблицыИзменены = Истина;
КонецЕсли;
ТипизированнаяТаблица.Колонки.Добавить(КолонкаДанных.Имя, Новый ОписаниеТипов(Типы), КолонкаДанных.Заголовок);
КонецЦикла;
Если МетаданныеТаблицыИзменены Тогда
//Состояние("Загрузка таблицы данных");
ЛксЗагрузитьВТаблицуЗначений(ТаблицаДанных, ТипизированнаяТаблица);
//Состояние("");
Иначе
ТипизированнаяТаблица = ТаблицаДанных.Скопировать();
КонецЕсли;
Результат = ТипизированнаяТаблица;
Возврат Результат;
КонецФункции
Добавлено (17.10.2013, 13:42)
---------------------------------------------
3) Так как строка неограниченной длины в типе колоник временной таблицы неудобна при последующих соединениях и группировках сделал вот так:
Цитата
Функция ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс(Знач ТаблицаДанных, СужатьТолькоПроизвольныеКолонки = Ложь) Экспорт
ТипизированнаяТаблица = Новый ТаблицаЗначений;
//Состояние("Оптимизация типов колонок");
МетаданныеТаблицыИзменены = Ложь;
Для Каждого КолонкаДанных Из ТаблицаДанных.Колонки Цикл
Если Истина
И СужатьТолькоПроизвольныеКолонки
И КолонкаДанных.ТипЗначения.Типы().Количество() > 0
Тогда
Продолжить;
КонецЕсли;
Типы = Новый Массив;
ТаблицаКолонки = ТаблицаДанных.Скопировать(, КолонкаДанных.Имя);
ТаблицаКолонки.Свернуть(КолонкаДанных.Имя);
//Индикатор = УФ(сПолучитьИндикаторПроцесса, ТаблицаКолонки.Количество(), "Оптимизация типов колонки """ + КолонкаДанных.Имя + """");
//Симашкевич Начало 17.10.2013 12:29
ДлинаСтроки = 1;
//Симашкевич Окончание 17.10.2013 12:29
Для Каждого СтрокаДанных Из ТаблицаКолонки Цикл
//ЛксОбработатьИндикатор(Индикатор);
ТипЗначения = ТипЗнч(СтрокаДанных[КолонкаДанных.Имя]);
//Симашкевич Начало 17.10.2013 12:13
Если ТипЗначения = ТипЗнч(Null) Тогда
Продолжить;
ИначеЕсли ТипЗначения = Тип("Строка") Тогда
ДлинаСтроки = Макс(ДлинаСтроки, СтрДлина(СтрокаДанных[КолонкаДанных.Имя]));
КонецЕсли;
//Симашкевич Окончание 17.10.2013 12:13
Если Типы.Найти(ТипЗначения) = Неопределено Тогда
Типы.Добавить(ТипЗначения);
КонецЕсли;
КонецЦикла;
//Симашкевич Начало 17.10.2013 12:13
Если Типы.Количество() = 0 Тогда
Типы.Добавить(Тип("Строка"));
МетаданныеТаблицыИзменены = Истина;
КонецЕсли;
//Симашкевич Окончание 17.10.2013 12:13
Если Типы.Количество() <> КолонкаДанных.ТипЗначения.Типы().Количество() Тогда
МетаданныеТаблицыИзменены = Истина;
КонецЕсли;
ТипизированнаяТаблица.Колонки.Добавить(КолонкаДанных.Имя, Новый ОписаниеТипов(Типы, , Новый КвалификаторыСтроки(ДлинаСтроки)), КолонкаДанных.Заголовок); //Симашкевич Изменил 17.10.2013 12:32
КонецЦикла;
Если МетаданныеТаблицыИзменены Тогда
//Состояние("Загрузка таблицы данных");
ЛксЗагрузитьВТаблицуЗначений(ТаблицаДанных, ТипизированнаяТаблица);
//Состояние("");
Иначе
ТипизированнаяТаблица = ТаблицаДанных.Скопировать();
КонецЕсли;
Результат = ТипизированнаяТаблица;
Возврат Результат;
КонецФункции