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

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

ЭлСправочника = Справочники.ТвойСправочник.СоздатьЭлемент()

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

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


Напиши

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

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

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