Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Загрузка Excel, обновление существующих данных

Загрузка Excel, обновление существующих данных
Я
   slimuz
 
20.08.20 - 14:00
Добрый день.
Написана простейшая обработка по загрузке xls файла. Реквизиты код, наименование, email. Нужно при загрузке обновлять имеющиеся данные, если с таким кодом уже есть. Сейчас если у реквизита код контроль уникальности, то при загрузке с имеющимся кодом выдает ошибку и не загружается, если выключить контроль уникальности, то в справочнике создаются дубли.


Функция ЗаполнитьФизЛиц(ТаблицаДанных)

    Для Каждого Строк из ТаблицаДанных Цикл
        Элем = Справочники.Пользователи.СоздатьЭлемент();
        Элем.Код = Строк.Код;
        Элем.Наименование = Строк.Наименование;
        Элем.EMail = Строк.EMail;
        Элем.Записать();
    КонецЦикла;
    
КонецФункции
 

Функция ИнициализацияТаблицыДанных()
    
    Результат = Новый ТаблицаЗначений;
    Результат.Колонки.Добавить("Код");
    Результат.Колонки.Добавить("Наименование");
    Результат.Колонки.Добавить("EMail");
    Возврат Результат;
    
КонецФункции


&НаКлиенте
Функция ЗагрузитьТаблицуДанных(ИмяФайла)
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(ИмяФайла);
        ExcelЛист = Excel.Sheets(1);
    Исключение
        Возврат Неопределено;
    КонецПопытки;
    
    СтруктураПолей = Новый Структура;
    Для ТекущаяКолонка = 1 По 50 Цикл
        ЗначениеТекущейЯчейки = СокрЛП(ExcelЛист.Cells(1, ТекущаяКолонка).Value);
        Если ПустаяСтрока(ЗначениеТекущейЯчейки) Тогда
            Прервать;
        КонецЕсли;
        
        СтруктураПолей.Вставить(ЗначениеТекущейЯчейки, ТекущаяКолонка);
    КонецЦикла;
    
    КоличествоКолонок = ТекущаяКолонка - 1;

    Результат = ИнициализацияТаблицыДанных();
    
    ОшибкаЧтения = Ложь;
    ТекущаяСтрока = 2;
    ТекущееЗначение = СокрЛП(ExcelЛист.Cells(ТекущаяСтрока, 1).Value);
    Пока ЗначениеЗаполнено(ТекущееЗначение) Цикл
        Состояние("Загрузка данных... строка " + ТекущаяСтрока);
        
        НомерКолонки = Неопределено;
        Если НЕ СтруктураПолей.Свойство("Код", НомерКолонки) Тогда
            ОшибкаЧтения = Истина;
            Прервать;
        КонецЕсли;
        Код = СокрЛП(ExcelЛист.Cells(ТекущаяСтрока, НомерКолонки).Value);
    
        НомерКолонки = Неопределено;
        Если НЕ СтруктураПолей.Свойство("Наименование", НомерКолонки) Тогда
            ОшибкаЧтения = Истина;
            Прервать;
        КонецЕсли;
        Наименование = СокрЛП(ExcelЛист.Cells(ТекущаяСтрока, НомерКолонки).Value);
        
        НомерКолонки = Неопределено;
        Если НЕ СтруктураПолей.Свойство("EMail", НомерКолонки) Тогда
            ОшибкаЧтения = Истина;
            Прервать;
        КонецЕсли;
        EMail = СокрЛП(ExcelЛист.Cells(ТекущаяСтрока, НомерКолонки).Value);
        
        СтрокаТаблицы = Результат.Добавить();
        СтрокаТаблицы.Код = Код;
        СтрокаТаблицы.Наименование = Наименование;
        СтрокаТаблицы.EMail = EMail;
        ТекущаяСтрока = ТекущаяСтрока + 1;
        ТекущееЗначение = СокрЛП(ExcelЛист.Cells(ТекущаяСтрока, 1).Value);
    КонецЦикла;
    
    Excel.WorkBooks.Close();
    Excel = 0;
    
    Если ОшибкаЧтения Тогда
        Возврат Неопределено;
    Иначе
        Возврат Результат;
    КонецЕсли;
КонецФункции

&НаКлиенте
Процедура Загрузить(Команда)
    
    Режим = РежимДиалогаВыбораФайла.Открытие; 
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); 
    ДиалогОткрытияФайла.ПолноеИмяФайла = ""; 
    Фильтр = "Таблица(*.xls)|*.xls"; 
    ДиалогОткрытияФайла.Фильтр = Фильтр; 
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь; 
    ДиалогОткрытияФайла.Заголовок = "Выберите файл"; 
    
    Если ДиалогОткрытияФайла.Выбрать() Тогда 
        ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
    Иначе
        Возврат;
    КонецЕсли;
    
    
    ТаблицаДанных = ЗагрузитьТаблицуДанных(ПутьКФайлу);
    
    ЗаполнитьФизЛиц(ТаблицаДанных);
КонецПроцедуры


   ChMikle
 
1 - 20.08.20 - 14:12
Функция ЗаполнитьФизЛиц(ТаблицаДанных)

    Для Каждого Строк из ТаблицаДанных Цикл
Поиск = Справочники.Пользователи.НайтиПоКоду(Строк.Код);
Если Поиск = Неопределено тогда
        Элем = Справочники.Пользователи.СоздатьЭлемент();
        Элем.Код = Строк.Код;
        Элем.Наименование = Строк.Наименование;
        Элем.EMail = Строк.EMail;
        Элем.Записать();
Иначе
 
       Элем = Справочники.Пользователи.ПолучитьОбъект(Поиск);
        Элем.Код = Строк.Код;
        Элем.Наименование = Строк.Наименование;
        Элем.EMail = Строк.EMail;
        Элем.Записать();

   КонецЦикла;
    
КонецФункции
   ChMikle
 
2 - 20.08.20 - 14:19
Функция ЗаполнитьФизЛиц(ТаблицаДанных)

    Для Каждого Строк из ТаблицаДанных Цикл
Поиск = Справочники.Пользователи.НайтиПоКоду(Строк.Код);
Если Поиск = Неопределено тогда
        Элем = Справочники.Пользователи.СоздатьЭлемент();
        Элем.Код = Строк.Код;
        Элем.Наименование = Строк.Наименование;
        Элем.EMail = Строк.EMail;
        Элем.Записать();
Иначе
 
       Элем = Справочники.Пользователи.ПолучитьОбъект(Поиск);
        Элем.Код = Строк.Код;
        Элем.Наименование = Строк.Наименование;
        Элем.EMail = Строк.EMail;
        Элем.Записать();
КонецЕсли// так лучше 

   КонецЦикла;
    
КонецФункции
   ChMikle
 
3 - 20.08.20 - 14:19
только почему это функция если ничего не возвращает , а не процедура ?
   slimuz
 
4 - 20.08.20 - 14:26
(3) Благодарю)) Ошибся..
   slimuz
 
5 - 20.08.20 - 14:34
(1) (2) Метод объекта не обнаружен (ПолучитьОбъект).
1С 8.2 УФ
   kubik_live
 
6 - 20.08.20 - 14:38
(5) Поиск = Справочники.Пользователи.ПустаяСсылка
   ChMikle
 
7 - 20.08.20 - 14:40
Элем = Поиск.ПолучитьОбъект();
   ChMikle
 
8 - 20.08.20 - 14:40
Функция ЗаполнитьФизЛиц(ТаблицаДанных)

    Для Каждого Строк из ТаблицаДанных Цикл
Поиск = Справочники.Пользователи.НайтиПоКоду(Строк.Код);
Если Поиск = Неопределено тогда
        Элем = Справочники.Пользователи.СоздатьЭлемент();
        Элем.Код = Строк.Код;
        Элем.Наименование = Строк.Наименование;
        Элем.EMail = Строк.EMail;
        Элем.Записать();
Иначе
 
        Элем = Поиск.ПолучитьОбъект()// поменяйте

        Элем.Код = Строк.Код;
        Элем.Наименование = Строк.Наименование;
        Элем.EMail = Строк.EMail;
        Элем.Записать();
КонецЕсл// так лучше 


   КонецЦикла;
    
КонецФункции
   ChMikle
 
9 - 20.08.20 - 14:44
Элем = Поиск.ПолучитьОбъект(); // поменяйте
   kubik_live
 
10 - 20.08.20 - 14:46
Возвращаемое значение:
Тип: СправочникСсылка.<Имя справочника>, Неопределено.
Если не существует ни одного элемента с требуемым кодом, то будет возвращена ПУСТАЯ ссылка.
Если для справочника код не задан (длина = 0), то будет возвращено Неопределено.
   ChMikle
 
11 - 20.08.20 - 14:47
Если Поиск = Неопределено  или Поиск  = Справочники.Пользователи.ПустаяСсылка тогда
   ChMikle
 
12 - 20.08.20 - 14:48
ТС , ну что там, победил ?
   slimuz
 
13 - 20.08.20 - 14:56
(12) Конечно победил)) Большое спасибо)

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