Как сопоставить данные при импорте?

1. Radzhab 21.05.19 09:01 Сейчас в теме
Есть табличная часть куда я гружу данные. Иногда юзеры путают колонки местами и получается каша. Как можно сопоставить названия колонок в таблице и excel автоматом?. По заголовкам колонок
НоваяЗаяка = Заявка.Добавить();
НоваяЗаяка.КодМТР = СокрЛП(Excel.Cells(НС, 2).Text);
НоваяЗаяка.МТР = СокрЛП(Excel.Cells(НС, 3).Text);
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. starik-2005 3040 21.05.19 09:37 Сейчас в теме
(1)
НоваяЗаяка = Заявка.Добавить();
НоваяЗаяка.КодМТР = СокрЛП(Excel.Cells(НС, 2).Text);
НоваяЗаяка.МТР = СокрЛП(Excel.Cells(НС, 3).Text);
Ну так Вы как планируете узнать, что в какой колонке? По характеру данных? Или по заголовкам? Если у Вас код соответствует определенному шаблону (типа "две буквы, дефис, пять цифр"),, то можете через регулярное выражение определить, соответствует ли колонка шаблону. И если нет, то колонки перепутаны. Про регулярки в 1С вот тут писал.
2. zarankony 306 21.05.19 09:31 Сейчас в теме
Прочитайте в табличный документ и засуньте его в построитель запроса, на выходе будет таблица с заголовками как в Экселе не зависимо от порядка колонок.
&НаКлиенте
Процедура Загрузить(Команда)
    ОбработкаОкончанияПомещения = Новый ОписаниеОповещения
        ("ОбработчикОкончанияПомещения", ЭтотОбъект);
    
    НачатьПомещениеФайла(ОбработкаОкончанияПомещения, , , Истина,     
            ЭтаФорма.УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОкончанияПомещения(Результат, Адрес, 
        ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
        Файл = Новый Файл(ВыбранноеИмяФайла);
        Расширение = Файл.Расширение;
    Если Результат Тогда
        Сообщение = ЗагрузитьИз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"+Область.Низ);
    Возврат НоваяОбласть;
КонецФункции // СвернутьСложнуюШапку()
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот