Есть табличная часть куда я гружу данные. Иногда юзеры путают колонки местами и получается каша. Как можно сопоставить названия колонок в таблице и excel автоматом?. По заголовкам колонок
НоваяЗаяка = Заявка.Добавить();
НоваяЗаяка.КодМТР = СокрЛП(Excel.Cells(НС, 2).Text);
НоваяЗаяка.МТР = СокрЛП(Excel.Cells(НС, 3).Text);
Ну так Вы как планируете узнать, что в какой колонке? По характеру данных? Или по заголовкам? Если у Вас код соответствует определенному шаблону (типа "две буквы, дефис, пять цифр"),, то можете через регулярное выражение определить, соответствует ли колонка шаблону. И если нет, то колонки перепутаны. Про регулярки в 1С вот тут писал.
Прочитайте в табличный документ и засуньте его в построитель запроса, на выходе будет таблица с заголовками как в Экселе не зависимо от порядка колонок.
&НаКлиенте
Процедура Загрузить(Команда)
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения
("ОбработчикОкончанияПомещения", ЭтотОбъект);
НачатьПомещениеФайла(ОбработкаОкончанияПомещения, , , Истина,
ЭтаФорма.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОкончанияПомещения(Результат, Адрес,
ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Файл = Новый Файл(ВыбранноеИмяФайла);
Расширение = Файл.Расширение;
Если Результат Тогда
Сообщение = ЗагрузитьИзExcel(Адрес,Расширение);
Предупреждение(Сообщение,,"Загрузка");
КонецЕсли
КонецПроцедуры
&НаСервере
Функция ЗагрузитьИзExcel(Адрес,Расширение)
Попытка
Файл = ПолучитьИмяВременногоФайла(Расширение);
ДД = ПолучитьИзВременногоХранилища(Адрес);
ДД.Записать(Файл);
Таб = ФайлExcelВТаблицуЗначений(Файл,1);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Таб",Таб);
Запрос.Текст =
#Область ТекстЗапроса
"ВЫБРАТЬ
| Таб.*
|ПОМЕСТИТЬ ВТ
|ИЗ
| &Таб КАК Таб
|;
|
|//Далее во 2 пакете дополняете ваш запрос ссылками из базы до готовой таблицы, которую загрузите в ТЧ
|";
#КонецОбласти
Таблица= Запрос.Выполнить().Выгрузить();
Объект.ТабличнаяЧасть.Загрузить(Таблица);
Возврат СтрШаблон("Загружено %1 строк",Таблица.Количество());
Исключение
Возврат СтрШаблон("Ошибка загрузки: %1",ОписаниеОшибки());
КонецПопытки;
КонецФункции
//Эту и следующую функцию лучше в общий модуль
Функция ФайлExcelВТаблицуЗначений(Файл,НомерЛиста=0,КолУровнейШапки=0,ЧитатьКакТекст=Ложь,УдалятьПустыеСтроки=Истина) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Файл,?(ЧитатьКакТекст,СпособЧтенияЗначенийТабличногоДокумента.Текст,СпособЧтенияЗначенийТабличногоДокумента.Значение));
ЧитаемаяОбласть = ТабДок.Область();
Если НомерЛиста>0 Тогда
ТабОбластей = Новый ТаблицаЗначений;
ТабОбластей.Колонки.Добавить("Верх");
ТабОбластей.Колонки.Добавить("Область");
Для Каждого Область Из ТабДок.Области Цикл
Строка = ТабОбластей.Добавить();
Строка.Область = Область;
Строка.Верх = Область.Верх;
КонецЦикла;
ТабОбластей.Сортировать("Верх");
Область = ТабОбластей[НомерЛиста-1].Область;
КонецЕсли;
Если КолУровнейШапки > 1 Тогда
Область = СвернутьСложнуюШапку(ТабДок,КолУровнейШапки,Область);
КонецЕсли;
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
Таб = ПЗ.Результат.Выгрузить();
Если НЕ УдалятьПустыеСтроки Тогда
Возврат Таб;
КонецЕсли;
Удаленные = 0;
Для инд = 0 По Таб.Количество()-1 Цикл
Стр = Таб[инд-Удаленные];
Заполнена = Ложь;
Для Каждого Колонка Из Таб.Колонки Цикл
Если ЗначениеЗаполнено(Стр[Колонка.Имя]) Тогда
Заполнена = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не Заполнена Тогда
Таб.Удалить(Стр);
Удаленные = Удаленные+1;
КонецЕсли;
КонецЦикла;
Возврат Таб;
КонецФункции // ФайлExcelВТаблицуЗначений()
// Для парсинга табличных документов: сворачивает шапку для построителя запросов до 1 уровня
//
// Параметры:
// Область - ТабличныйДокумент,ОбластьТабличногоДокумента - <описание параметра>
// КолУровней - Число - Исходное количество уровней начиная с 2. Передавать меньше 2 не имеет смысла.
//
// Возвращаемое значение:
// ОбластьТабличногоДокумента - Область с обрезанной до 1 строки шапкой.
Функция СвернутьСложнуюШапку(ТабДок,КолУровней,Область=Неопределено) Экспорт
Если Область=Неопределено Тогда
Область = ТабДок.Область();
КонецЕсли;
МассивЗаголовков = Новый Массив;
МаксКолонок = ТабДок.ПолучитьРазмерОбластиДанныхПоГоризонтали();
ПерваяСтрока = Область.Верх;
Для Сч = 1 По КолУровней Цикл
ПредЗначение = "";
Для Кол = 1 По МаксКолонок Цикл
Текст = ТабДок.Область("R"+Строка(ПерваяСтрока+Сч-1)+"C"+Кол).Текст;
Если Сч = 1 Тогда
МассивЗаголовков.Добавить(Новый Массив);
Если ЗначениеЗаполнено(Текст) Тогда
МассивЗаголовков[Кол-1].Добавить(Текст);
ПредЗначение = Текст;
Иначе
МассивЗаголовков[Кол-1].Добавить(ПредЗначение);
КонецЕсли;
Иначе
ИменаЗаголовка = МассивЗаголовков[Кол-1];
РодительОтличается = Ложь;
Если Кол >1 Тогда
Для Инд = 0 по Сч-2 Цикл
Если ИменаЗаголовка[Инд] <> МассивЗаголовков[Кол-2][Инд] Тогда
РодительОтличается = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(Текст) Тогда
ИменаЗаголовка.Добавить(Текст);
Иначе
Если ЗначениеЗаполнено(ПредЗначение) И НЕ РодительОтличается Тогда
ИменаЗаголовка.Добавить(ПредЗначение);
КонецЕсли;
КонецЕсли;
ПредЗначение = Текст;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Кол = 1 По МаксКолонок Цикл
ТабДок.Область("R"+Строка(ПерваяСтрока+КолУровней-1)+"C"+Кол).Текст = СтрСоединить(МассивЗаголовков[Кол-1],"_");
КонецЦикла;
НоваяОбласть = ТабДок.Область("R"+Строка(ПерваяСтрока+КолУровней-1)+":R"+Область.Низ);
Возврат НоваяОбласть;
КонецФункции // СвернутьСложнуюШапку()