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

1. Radzhab 21.05.19 09:01 Сейчас в теме
Есть табличная часть куда я гружу данные. Иногда юзеры путают колонки местами и получается каша. Как можно сопоставить названия колонок в таблице и excel автоматом?. По заголовкам колонок
НоваяЗаяка = Заявка.Добавить();
НоваяЗаяка.КодМТР = СокрЛП(Excel.Cells(НС, 2).Text);
НоваяЗаяка.МТР = СокрЛП(Excel.Cells(НС, 3).Text);
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. starik-2005 3033 21.05.19 09:37 Сейчас в теме
(1)
НоваяЗаяка = Заявка.Добавить();
НоваяЗаяка.КодМТР = СокрЛП(Excel.Cells(НС, 2).Text);
НоваяЗаяка.МТР = СокрЛП(Excel.Cells(НС, 3).Text);
Ну так Вы как планируете узнать, что в какой колонке? По характеру данных? Или по заголовкам? Если у Вас код соответствует определенному шаблону (типа "две буквы, дефис, пять цифр"),, то можете через регулярное выражение определить, соответствует ли колонка шаблону. И если нет, то колонки перепутаны. Про регулярки в 1С вот тут писал.
2. zarankony 304 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"+Область.Низ);
    Возврат НоваяОбласть;
КонецФункции // СвернутьСложнуюШапку()
Показать
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)