Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Загрузка данных из Excel в 1с

Загрузка данных из Excel в 1с
Я
   almaz102
 
03.02.18 - 00:20
Всем привет! Ребята подскажите пож-та есть обработка по загрузке из эксель в 1с., при загрузке он обходит каждую строку в эксель и записывает , в итоге получается он перезаписывает один и тот же объект, в справочнике должно быть около 1000 моделей авто в итоге только одна запись, самая последняя строка которая в экселе

Попытка
        ExcelApplication = Новый COMObject("Excel.Application");
        ExcelApplication.WorkBooks.Open(Объект.ВыборФайла);
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    //Открываем необходимый лист

    ExcelApplication.Sheets(1).Select();
    //Получим количество строк и колонок.

    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel

    Версия = Лев(ExcelApplication.Version,Найти(ExcelApplication.Version,".")-1);
    Если Версия = "8" тогда
        ВсегоСтрок = ExcelApplication.Cells.CurrentRegion.Rows.Count;
        ВсегоСтолбцов = Макс(ExcelApplication.Cells.CurrentRegion.Columns.Count, 13);
    Иначе
        ВсегоСтрок = ExcelApplication.Cells(1,1).SpecialCells(11).Row;
        ВсегоСтолбцов = ExcelApplication.Cells(1,1).SpecialCells(11).Column;
    Конецесли;

    //считываем первую строку и генерируем колонки в таблице Значений

    ТЗКонтрагентов = Новый ТаблицаЗначений;
        Сч = 1;
    Пока ЗначениеЗаполнено(ExcelApplication.Cells(1, Сч).Text) Цикл
        ИмяКолонки = ExcelApplication.Cells(1, Сч).Text;
        ИмяКолонки = СтрЗаменить(ИмяКолонки," ","");// убираем из имени колонок пробелы

        ИмяКолонки = СтрЗаменить(ИмяКолонки,"/","");// убираем слеш

        ИмяКолонки = СтрЗаменить(ИмяКолонки,".","");// убираем точки

        ИмяКолонки = СтрЗаменить(ИмяКолонки,"-","");// убираем точки

        ТЗКонтрагентов.Колонки.Добавить(ИмяКолонки);
        Сч = Сч + 1;
    КонецЦикла;
    // Добавляем значения строк начиная со второй

  Для СтрСЧ = 2 по ВсегоСтрок Цикл 
      НоваяСтрока = ТЗКонтрагентов.Добавить();
      Для НомерКолонки = 1 по ТЗКонтрагентов.Колонки.Количество() Цикл
          Если ЗначениеЗаполнено(ExcelApplication.Cells(СтрСЧ,1).Text) = Истина Тогда//До первой пустой строки

          //заполняем строку значениями

          ТекущееЗначение = ExcelApplication.Cells(СтрСЧ, НомерКолонки).Text;
          ИмяКолонки = ТЗКонтрагентов.Колонки[НомерКолонки-1].Имя;
          НоваяСтрока[ИмяКолонки] = ТекущееЗначение;
          КонецЕсли;
      КонецЦикла;
  КонецЦикла;
ExcelApplication.Quit();
КонтрГр = Справочники.Контрагенты.ПустаяСсылка();
Для Каждого Стр ИЗ ТЗКонтрагентов Цикл
            Запрос = Новый Запрос;
            Запрос.Текст="ВЫБРАТЬ
                         |    асМодели.Наименование,
                         |    асМодели.НаименованиеПолное,
                         |    асВариантыКомплектации.Наименование КАК НаименованиеКомпл,
                         |    асВариантыКомплектации.НаименованиеПолное КАК НаименованиеПолноеКомпл,
                         |    асВариантыКомплектации.Ссылка КАК комплек,
                         |    асМодели.Ссылка КАК модель,
                         |    асВариантыКомплектации.Владелец
                         |ИЗ
                         |    Справочник.асВариантыКомплектации КАК асВариантыКомплектации
                         |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.асМодели КАК асМодели
                         |        ПО асВариантыКомплектации.Владелец = асМодели.Ссылка";
            
            
            Выборка = Запрос.Выполнить().Выбрать();
            Пока Выборка.Следующий() Цикл
                 МодельАвто = Выборка.модель.ПолучитьОбъект();
                 МодельАвто.НаименованиеПолное = Стр.Марка + " " + Стр.Модель + " " + Стр.Поколение + " " + "(" + Стр.Годот + "-" + Стр.ГодДо+ ")";
                 МодельАвто.Наименование = Стр.Марка + " " + Стр.Модель + " " + Стр.Поколение;
                 МодельАвто.Записать();
                 
                 КомплекАвто = Выборка.комплек.ПолучитьОбъект();
                 КомплекАвто.Наименование =  Стр.Модификация + " " + "кузов" + " " + Стр.Серия;
                 КомплекАвто.НаименованиеПолное =  Стр.Модификация + " " + "(" + Стр.Годот + "-" + Стр.ГодДо+ ")"+" " + "кузов" + " " + Стр.Серия;
                 КомплекАвто.Владелец = МодельАвто.Ссылка; 
                 КомплекАвто.Записать();
                 
            КонецЦикла;     
           
КонецЦикла;
 
 
   Fram
 
1 - 03.02.18 - 00:44
(0) опиши свой алгоритм простыми фразами пошагово
   Fram
 
2 - 03.02.18 - 00:46
особенно последний цикл с запросом
   almaz102
 
3 - 03.02.18 - 00:50
в запросе я получаю объект справочника модели авто и так справочник комплектация и в нее записываю из таблицы эксель марку модель год и т.д. записал справочник модель авто далее записываю с справочник комплектация ее же комплектацию
   Fram
 
4 - 03.02.18 - 00:52
(3) > получаю объект справочника

а подразумевается что он у тебя уже существует?
   almaz102
 
5 - 03.02.18 - 00:52
В итоге у меня в справочнике добавилась только одна запись, а должно добавиться столько же записей сколько строк в документе Excel, что то не то делаю((
   almaz102
 
6 - 03.02.18 - 00:55
(4) Сам справочник пустой, получается он не существует(
   roman844
 
7 - 03.02.18 - 00:59
автор, ты меня извини, но код написан отвратительно - вторая половину уж точно.
   almaz102
 
8 - 03.02.18 - 01:00
(7) не спорю, я только учусь программировать
   roman844
 
9 - 03.02.18 - 01:00
что такое ТЗКонтрагентов ???
   roman844
 
10 - 03.02.18 - 01:03
(8) какая информация содержится в тзКонтрагентов?
 
 Рекламное место пустует
   roman844
 
11 - 03.02.18 - 01:08
ну смотри если ты хочешь добавить элемент справочника, то надо использовать конструкцию
ЭлСправочника = Справочники.ТвойСправочник.СоздатьЭлемент()

а у тебя такого нет, у тебя какойто запрос. не понятно зачем он тут нужен?
   almaz102
 
12 - 03.02.18 - 01:16
(11) пробую, запрос весь убрал, просто создаю элемент. Ну почему у меня только одна запись  добавилась(
   roman844
 
13 - 03.02.18 - 01:25
вместо этого

Для Каждого Стр ИЗ ТЗКонтрагентов Цикл
            Запрос = Новый Запрос;
            Запрос.Текст="ВЫБРАТЬ
                         |    асМодели.Наименование,
                         |    асМодели.НаименованиеПолное,
                         |    асВариантыКомплектации.Наименование КАК НаименованиеКомпл,
                         |    асВариантыКомплектации.НаименованиеПолное КАК НаименованиеПолноеКомпл,
                         |    асВариантыКомплектации.Ссылка КАК комплек,
                         |    асМодели.Ссылка КАК модель,
                         |    асВариантыКомплектации.Владелец
                         |ИЗ
                         |    Справочник.асВариантыКомплектации КАК асВариантыКомплектации
                         |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.асМодели КАК асМодели
                         |        ПО асВариантыКомплектации.Владелец = асМодели.Ссылка";
            
            
            Выборка = Запрос.Выполнить().Выбрать();
            Пока Выборка.Следующий() Цикл
                 МодельАвто = Выборка.модель.ПолучитьОбъект();
                 МодельАвто.НаименованиеПолное = Стр.Марка + " " + Стр.Модель + " " + Стр.Поколение + " " + "(" + Стр.Годот + "-" + Стр.ГодДо+ ")";
                 МодельАвто.Наименование = Стр.Марка + " " + Стр.Модель + " " + Стр.Поколение;
                 МодельАвто.Записать();
                 
                 КомплекАвто = Выборка.комплек.ПолучитьОбъект();
                 КомплекАвто.Наименование =  Стр.Модификация + " " + "кузов" + " " + Стр.Серия;
                 КомплекАвто.НаименованиеПолное =  Стр.Модификация + " " + "(" + Стр.Годот + "-" + Стр.ГодДо+ ")"+" " + "кузов" + " " + Стр.Серия;
                 КомплекАвто.Владелец = МодельАвто.Ссылка; 
                 КомплекАвто.Записать();
                 
            КонецЦикла;     
           
КонецЦикла;


Напиши 

Для Каждого Стр Из тзКонтрагенты Цикл

спрАсМодели = Справочники.асМодели.СоздатьЭлемент();
спрАсМодели.Наименование = Стр.Марка + " " + Стр.Модель + " " + Стр.Поколение + " " + "(" + Стр.Годот + "-" + Стр.ГодДо+ ")";
Попытка;
спрАсМодели.Записать();
исключение;
Сообщить("Не удалось записать...");
КонецПопытки;

КонецЦикла;
   roman844
 
14 - 03.02.18 - 01:26
ну и соответсвенно сколько записей будет в тзКонтрагенты столько элементов справочника асМодели у тебя добавится. как то так.
   roman844
 
15 - 03.02.18 - 01:28
а при обходе каждой строки тзКонтрагенты  у тебя выполняется запрос, который перебирает данные и перезаписывает их, при чем данные в них только последние тзКонтрагенты
   almaz102
 
16 - 03.02.18 - 01:29
(15) Спасибо!
   roman844
 
17 - 03.02.18 - 01:30
не зачто
   roman844
 
18 - 03.02.18 - 01:31
сегодня только писал обработку по загрузке данных из файла

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует