Имя: Пароль:
1C
1С v8
Загрузка Excel, обновление существующих данных
,
0 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";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файл";
    
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
    Иначе
        Возврат;
    КонецЕсли;
    
    
    ТаблицаДанных = ЗагрузитьТаблицуДанных(ПутьКФайлу);
    
    ЗаполнитьФизЛиц(ТаблицаДанных);
КонецПроцедуры

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

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

       Элем = Справочники.Пользователи.ПолучитьОбъект(Поиск);
        Элем.Код = Строк.Код;
        Элем.Наименование = Строк.Наименование;
        Элем.EMail = Строк.EMail;
        Элем.Записать();

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

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

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

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

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

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