Имя: Пароль:
1C
1С v8
Импорт Контрагентов из Екселя в 1с
,
0 V1rus93
 
15.08.19
17:30
Добрый вечер ! Вот в первые столкнулся с данной возможностью 1с и уже пару дней мучаюсь, не могу всё красиво оформить. Мне надо создать контрагентов в справочники и заполнить их данными из ексель файла. Так же создать в РегистрСведений.КонтактнаяИнформация данные контрагентов. И создать договора контрагентов.


Процедура КнопкаВыполнитьНажатие(Кнопка)

//Номер листа в книге Excel для получения данных
    НомерЛиста         = 1;
    
    ИмяФайла = СокрЛП(ИмяГлавногоФайла);    
    //Пытаемся подключиться к Excel
    Попытка
        Excel = новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
        
    КонецПопытки;    
  
    //Подключились удачно, открываем файл
    Excel.Workbooks.Open(ИмяФайла);
  
    //Открываем необходимый лист
    Excel.Sheets(НомерЛиста).select();  
  
    //Получим количество строк и колонок.
    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
    Если Версия = "8" тогда
        ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
        ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
    Иначе
        ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
        ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;  
    Конецесли;

    
    
    тзКонтр = Новый ТаблицаЗначений;
    тзКонтр.Колонки.Добавить("ПолноеНаименование");
    тзКонтр.Колонки.Добавить("КодПоЭГРПОУ");
    тзКонтр.Колонки.Добавить("Регион");
    тзКонтр.Колонки.Добавить("Телефон");
    тзКонтр.Колонки.Добавить("Почта");
    тзКонтр.Колонки.Добавить("Код");
    тзКонтр.Колонки.Добавить("Контакт");
    тзКонтр.Колонки.Добавить("Наименование");
    тзКонтр.Колонки.Добавить("Валюта");
    тзКонтр.Колонки.Добавить("СпособОплаты");
        
        Для нс = 2 по ФайлСтрок Цикл
            НоваяСтрока =  тзКонтр.Добавить();
            НоваяСтрока.Код = Excel.Cells(НС, 1).Value;
            НоваяСтрока.Наименование = Excel.Cells(НС, 3).Value;
            НоваяСтрока.ПолноеНаименование = Excel.Cells(НС, 19).Value;
            НоваяСтрока.КодПоЭГРПОУ = Excel.Cells(НС, 16).Value;
            НоваяСтрока.Регион = Excel.Cells(НС, 8).Value;
            НоваяСтрока.Телефон = Excel.Cells(НС, 10).Value;
            НоваяСтрока.Почта = Excel.Cells(НС, 11).Value;
            НоваяСтрока.Контакт = Excel.Cells(НС, 12).Value;
            НоваяСтрока.Валюта = Excel.Cells(НС, 15).Value;                                                                
            НоваяСтрока.СпособОплаты = Excel.Cells(НС, 4).Value;            
        КонецЦикла;
        
            
    // Закрыть COM соединение для экономии памяти
    Excel.Application.Quit();
    
    //поместить считанные данные в форму обработки
    ЭлементыФормы.ТабличноеПоле1.Значение = тзКонтр;
    ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
    
    мФорма = ПолучитьФорму(Справочники.Контрагенты.ПолучитьФормуНовогоЭлемента());
    СозданиеКонтрагента(мФорма);
    
    мСообщение = Новый СообщениеПользователю();
    мСообщение.Текст = "Контрагенты загружены";
    мСообщение.Сообщить();
    
КонецПроцедуры

Процедура СозданиеКонтрагента (мФорма)
    
     ТекстОшибок = "";
    
    Для Каждого СтрокаТаблицы из ТабличноеПоле1 Цикл
        НовыйОбъект = Справочники.Контрагенты.СоздатьЭлемент();
        НовыйОбъект.Родитель = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели");
        НовыйОбъект.Наименование = СтрокаТаблицы.Наименование;
        НовыйОбъект.НаименованиеПолное = СтрокаТаблицы.ПолноеНаименование;
        Если НовыйОбъект.ЮрФизЛицо = СтрДлина("12345678")
            И НовыйОбъект.ЮрФизЛицо <> Неопределено Тогда
            НовыйОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
        Иначе
            НовыйОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
        КонецЕсли;
        НовыйОбъект.Покупатель = Истина;
        НовыйОбъект.Регион = Справочники.Регионы.НайтиПоКоду("000000001");
        НовыйОбъект.Код = СтрокаТаблицы.Код;
        НовыйОбъект.КодПоЕДРПОУ = СтрокаТаблицы.КодПоЭГРПОУ;
          Попытка
            НовыйОбъект.Записать();
        Исключение
             ТекстОшибок = ТекстОшибок + ?(ТекстОшибок = "", "", Символы.ПС);
            ТекстОшибок = ТекстОшибок + "Ошибка создания контрагента '" + СтрокаТаблицы.Наименование + "'";
            Продолжить;
        КонецПопытки;
        
        КонтрагентСсылка = НовыйОбъект.ЭтотОбъект;
          МоеЗаполнение   = Новый Структура("Представление,Тип,Вид,Объект",  СтрокаТаблицы.Телефон,
                                          Перечисления.ТипыКонтактнойИнформации.Телефон,
                                          Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента,
                                          КонтрагентСсылка);
                                      
        Мен_Записи = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();    //СоздатьНаборЗаписей();  //    
        ЗаполнитьЗначенияСвойств(Мен_Записи, МоеЗаполнение);
        Мен_Записи.Объект = КонтрагентСсылка;
        Мен_Записи.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
        Мен_Записи.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
        Мен_Записи.Поле1 = СтрокаТаблицы.Телефон;
        
    
        
        НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
        НовыйДоговор.Организация =  УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяОрганизация");
        НовыйДоговор.Владелец = КонтрагентСсылка;
        НовыйДоговор.Наименование = "Основной договор";
        НовыйДоговор.ВедениеВзаиморасчетов = Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоДоговоруВЦелом;
        НовыйДоговор.ВалютаВзаиморасчетов = СтрокаТаблицы.Валюта;
        НовыйДоговор.ВестиПоДокументамРасчетовСКонтрагентом = Истина;
        НовыйДоговор.ВестиПоДокументамРасчетовСКонтрагентомРегл = Истина;
        НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
        
    КонецЦикла;
    
    Если ТекстОшибок <> "" Тогда
        
        мСообщение = Новый СообщениеПользователю();
        мСообщение.Текст = ТекстОшибок;
        мСообщение.Сообщить();
        
    КонецЕсли;
1 V1rus93
 
15.08.19
17:33
Проблема в следующем: Не правильно работает Перечисления ЮрФизЛицо. Я хочу чтобы был ФизЛицо если 8 чисел или пусто, а остальное ЮрЛицо
И не создаются Договора и Данные в регистр. Контрагенты создаются.
2 Маленький Вопросик
 
15.08.19
17:34
за тебя написать все?
3 V1rus93
 
15.08.19
17:35
(2) Да нет, просто подсказать в чем ошибка. И если не сложно подкорректировать код. Я только начинаю изучать и с этой функцией впервые столкнулся
4 Builder
 
15.08.19
17:36
Если НовыйОбъект.ЮрФизЛицо = СтрДлина("12345678") ....
Это шедеврально!
5 V1rus93
 
15.08.19
17:37
(4) Спасибо) Я старался !
6 mikecool
 
15.08.19
17:38
использовать загрузку из табличного документа с ИТС
дописать немного правила для нее
профит
7 Builder
 
15.08.19
17:38
НовыйОбъект.ЮрФизЛицо = СтрДлина("12345678")
Может надо количество цифр в ИНН проверять?
8 dka80
 
15.08.19
17:40
"Я хочу чтобы был ФизЛицо если 8 чисел или пусто"

Приведи пример реальных данных. Я подозреваю, что речь идет об ИНН, но ты ИНН нигде не загружаешь в таблицу значений тзКонтр
9 Builder
 
15.08.19
17:41
НовыйДоговор - надо записать, нигде не вижу записи!
10 dka80
 
15.08.19
17:42
(9) чтобы записать договор, нужно сначала контрагента записать, а у нас вот это КонтрагентСсылка = НовыйОбъект.ЭтотОбъект;
11 V1rus93
 
15.08.19
17:42
(8) Код ЕГРПОУ
2906810394
20472557

Вот разница.
12 V1rus93
 
15.08.19
17:44
(9) Исправил !
13 V1rus93
 
15.08.19
17:44
(10)  Попытка
            НовыйОбъект.Записать();
14 dka80
 
15.08.19
17:45
Если СтрДлина(СтрокаТаблицы.КодПоЭГРПОУ) = 8 ИЛИ ПустаяСтрока(СтрокаТаблицы.КодПоЭГРПОУ) Тогда  НовыйОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
15 Builder
 
15.08.19
17:45
(11) Ну так и проверяй длину КодПоЭГРПОУ !
Если СтрДлина(СокрЛП(КодПоЭГРПОУ))=8 Тогда
16 dka80
 
15.08.19
17:45
(13) КонтрагентСсылка = НовыйОбъект.Ссылка
17 V1rus93
 
15.08.19
17:48
(16) Вопрос почему ссылка ? Если в форме элемента справочника контрагенты мы на закладку контакты (где у нас контактная инфа) передаем объект, а не ссылку.
18 GreyK
 
15.08.19
17:49
(0) А зачем вы засунули контрагентов в эксель?
19 V1rus93
 
15.08.19
17:51
(18) Это не я, а клиент. Там более 1000 наименований и вводить это вручную сложно. Поэтому вот пытаюсь обработкой. Они то создаются и всё норм. Надо только разобраться с контактной информацией и договорами.
20 dka80
 
15.08.19
17:52
21 V1rus93
 
15.08.19
18:14
Спасибо всем ! буду разбираться. Хотя бы уже ошибки выводит и есть с чем работать
22 V1rus93
 
15.08.19
18:28
Всё заработало, остался последний момент. Как добавить к одному контрагенту несколько данных в регистрсведений.контактнаяинформация
В моем коде оно добавляет только телефон. А как сделать добавление разных типов и видов данных на одного контрагента?
23 Михаил Козлов
 
15.08.19
18:37
(22) 1. Создаете набор записей регистра (вне цикла).
2. Устанавливаете отбор по контрагенту (уже записанному, чтобы была Ссылка). Чистите его.
3. По каждому виду контактной информации добавляете в это набор записи с нужными значениями (тип КИ, вид КИ, представление).
4. Записываете набор записей.
24 V1rus93
 
15.08.19
18:39
(23) Я понял ! Спасибо большое )