Имя: Пароль:
1C
1С v8
Обработка для Новых контрагентов из Экселя
,
0 DEaD_EGOR
 
04.04.16
12:02
Народ, пишу обработку... Столкнулся с проблемой...


Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вставить содержимое обработчика.
КонецПроцедуры

Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбора.Заголовок = "Выберите файл";
    
    Если ДиалогВыбора.Выбрать() Тогда
        ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
    КонецЕсли;
    
КонецПроцедуры

Процедура ПрочитатьНажатие(Элемент)
    
    //подключаемся к эксел
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(ИмяФайла);
        Состояние("Обработка файла Microsoft Excel...");
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Попытка
        //Открываем необходимый лист
        Excel.Sheets(1).Select();  // лист 1, по умолчанию  
    Исключение
        //Закрываем Excel
        Excel.ActiveWorkbook.Close();     
        Excel = 0;
        Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        ОтменитьТранзакцию();
        Возврат;
    КонецПопытки;    
    
    //Получим количество строк и колонок.
    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
    Если Версия = "8" тогда
        ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
        ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 27);
    Иначе
        ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
        ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;  
    Конецесли;
    
    //создание колонок табличного документа  
    ТабЗнач = Новый ТаблицаЗначений;
    ТабЗнач.Колонки.Добавить("Завод");
    ТабЗнач.Колонки.Добавить("Имя");
    ТабЗнач.Колонки.Добавить("НазваниеФирмы");
    ТабЗнач.Колонки.Добавить("КППОбъекта");
    ТабЗнач.Колонки.Добавить("КодРегиона");
    ТабЗнач.Колонки.Добавить("Регион");     
    ТабЗнач.Колонки.Добавить("ПИндекс");
    ТабЗнач.Колонки.Добавить("Город");
    ТабЗнач.Колонки.Добавить("Улица");
    ТабЗнач.Колонки.Добавить("НомерДома");
    ТабЗнач.Колонки.Добавить("Дополнение");
    ТабЗнач.Колонки.Добавить("Телефон");
    
    //считываем первую строку и генерируем колонки
    Для НС = 2 По ФайлСтрок Цикл
        НоваяСтрока = ТабЗнач.Добавить();
        НоваяСтрока.Завод = Excel.Cells(НС, 1).Value;
        НоваяСтрока.Имя = Excel.Cells(НС, 2).Value; //Это грузополучатели-торговые точки    
        НоваяСтрока.НазваниеФирмы = (Excel.Cells(НС, 4).Value); //это контрагенты - плательщики
        НоваяСтрока.КППОбъекта = (Excel.Cells(НС, 9).Value);
        НоваяСтрока.КодРегиона = Excel.Cells(НС, 12).Value;
        НоваяСтрока.Регион = Excel.Cells(НС, 13).Value;
        НоваяСтрока.ПИндекс = Excel.Cells(НС, 14).Value;
        НоваяСтрока.Город = Excel.Cells(НС, 15).Value;
        НоваяСтрока.Улица = Excel.Cells(НС, 16).Value;
        НоваяСтрока.НомерДома = Excel.Cells(НС, 17).Value;
        НоваяСтрока.Дополнение = Excel.Cells(НС, 18).Value; //проверять на наличие
        НоваяСтрока.Телефон = Excel.Cells(НС, 19).Value;
    КонецЦикла;
    
    // Закрыть COM соединение для экономии памяти
    Excel.Application.Quit();
    
    //поместить считанные данные в форму обработки
    ЭлементыФормы.Таблица.Значение = ТабЗнач;
    ЭлементыФормы.Таблица.СоздатьКолонки();
    
    мФорма = ПолучитьФорму (Справочники.Контрагенты.ПолучитьФормуНовогоЭлемента());
    СозданиеКонтрагента(мФорма);
    
    мСообщение = Новый СообщениеПользователю();
    мСообщение.Текст = "Контрагенты загружены";
    мСообщение.Сообщить();
КонецПроцедуры

Процедура СозданиеКонтрагента (мФорма)
    
    Для Каждого СтрокаТаблицы из Таблица  Цикл
        НовыйОбъект = Справочники.Контрагенты.СоздатьЭлемент();
        НовыйОбъект.ГоловнойКонтрагент = СтрокаТаблицы.НазваниеФирмы;
        НовыйОбъект.Наименование = СтрокаТаблицы.Имя;
        НовыйОбъект.НаименованиеПолное = СтрокаТаблицы.Имя;
        НовыйОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
        НовыйОбъект.КПП = СтрокаТаблицы.КППОбъекта;
        Попытка
            НовыйОбъект.Записать();
        Исключение
            Продолжить;
        КонецПопытки;
        
        КонтагентСсылка = НовыйОбъект.Ссылка;
        МоеЗаполнение = Новый Структура("Представление,Тип,Вид",Строка(СтрокаТаблицы.ПИндекс) + " " + СтрокаТаблицы.Регион + " " + СтрокаТаблицы.Город + " " + СтрокаТаблицы.Улица + " " + СтрокаТаблицы.НомерДома,Перечисления.ТипыКонтактнойИнформации.Адрес,Справочники.ВидыКонтактнойИнформации.ФактАдресОрганизации);
        
        НЗ_КИ = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
        НЗ_КИ.Отбор.Объект.Значение      = КонтагентСсылка;
        НЗ_КИ.Отбор.Объект.Использование = Истина;
        НЗ_КИ.Отбор.Тип.Значение         = Перечисления.ТипыКонтактнойИнформации.Адрес;
        НЗ_КИ.Отбор.Тип.Использование    = Истина;
        НЗ_КИ.Отбор.Вид.Значение         = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
        НЗ_КИ.Отбор.Вид.Использование    = Истина;
        НЗ_КИ.Прочитать();
        НаборЗаписей = НЗ_КИ.Выгрузить();
                
        Для Каждого СтрокаТаблицы Из Таблица Цикл
            НЗ = НаборЗаписей.Добавить();
            //НЗ.Период = СтрокаТаблицы.?; // дата хранения адреса
            НЗ.Объект = СтрокаТаблицы.Имя; // ссылка на владельца адреса
            //НЗ.Тип    = СтрокаТаблицы.?; // ссылка на тип КИ
            //НЗ.Вид    = СтрокаТаблицы.?; // ссылка на вид КИ
            НЗ.Поле1  = СтрокаТаблицы.ПИндекс;
            НЗ.Поле2  = СтрокаТаблицы.Регион;
            //НЗ.Поле3  = СтрокаТаблицы.?; //район
            НЗ.Поле4  = СтрокаТаблицы.Город;
            //НЗ.Поле5  = СтрокаТаблицы.?; //село если не город
            НЗ.Поле6  = СтрокаТаблицы.Улица;
            //НЗ.Поле7  = СтрокаТаблицы.Дополнение;//если не определено, тогда пустая строка
            НЗ.Поле8  = СтрокаТаблицы.НомерДома;
            //НЗ.Поле9  = СтрокаТаблицы.?; //квартира
            //НЗ.Поле10 = СтрокаТаблицы.?; //не заполнено в оригинале
            
            НЗ.Представление = МоеЗаполнение.Представление;
            //НЗ.Комментарий   = СтрокаТаблицы.?;
            //НЗ.ФорматАдреса  = Российский; //как записать правильно?
            
            НоваяЗаписьНабора = НаборЗаписей.Добавить();
            НоваяЗаписьНабора.Объект = КонтагентСсылка;
            НоваяЗаписьНабора.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
            НоваяЗаписьНабора.Вид = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
            НоваяЗаписьНабора.Представление = МоеЗаполнение.Представление;
            НЗ_КИ.Загрузить(НаборЗаписей);
            НЗ_КИ.Записать(Истина);// если 'ИСТИНА' - будет замещение данных
            
            //НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
            //НовыйДоговор.Организация = Справочники.Организации.НайтиПоКоду(""); //по какому коду?
            //НовыйДоговор.Владелец = НовыйОбъект.ссылка;
            //НовыйДоговор.Наименование = "Основной договор";
            //НовыйДоговор.ВедениеВзаиморасчетов = Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоДоговоруВЦелом;
            //НовыйДоговор.ВалютаВзаиморасчетов = Справочники.Валюты.НайтиПоКоду(643);
            //НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем; //как устанавливать, если пятёрочка-грузополучатель?
            //Попытка
            //    НовыйДоговор.Записать();
            //Исключение
            //КонецПопытки;
        КонецЦикла;
    КонецЦикла;
    
    
    
    
КонецПроцедуры

Функция ПроверитьКонтрагента (Наименование)
    
    Контр = Справочники.Контрагенты.НайтиПоНаиенованию(Наименование);
    Если Контр <> Справочники.Контрагенты.ПустаяСсылка()  Тогда
        Возврат Контр;
        
        
    КонецЕсли;
    
КонецФункции;

В таком виде Конт.инфа не заполняется.... ЧЯДНТ?
1 Господин ПЖ
 
04.04.16
12:08
мизда - лучший отладчик
2 DEaD_EGOR
 
04.04.16
12:12
(1) да как раз в отладчике и дело((( запускаю отладку, если всё как в коде выше, выдаёт ошибку при записи.... смотрю значения НаборЗаписей и НЗ_КИ... и тут начинается для меня непонятка. если строки НоваяЗаписьНабора закоменчены-то не заполняются поля Объект, тип и вид. если незакоменчены-то появляются 2 строки.. в одной по отладке адрес без заполенных тех полей, в другой-заполненные поля но без адреса...
3 Господин ПЖ
 
04.04.16
12:14
1с не твое. бери метлу в руки
4 DEaD_EGOR
 
04.04.16
12:15
(3) спс за совет новичку.. а я всё думал, почему у меня не получается?.. оказывается решение то вот оно! на поверхности!!
5 ДенисЧ
 
04.04.16
12:16
"выдаёт ошибку при записи"

Текст ошибки мы должны протелепать? А сколько будет приз?
6 DEaD_EGOR
 
04.04.16
12:17
(5) {Форма.Форма.Форма(155)}: Ошибка при вызове метода контекста (Записать)
            НЗ_КИ.Записать(Истина);// если 'ИСТИНА' - будет замещение данных
по причине:
Не удалось записать: "Контактная информация"!


Прошу прощения, пока дополнял пост, отвлекли..
7 ДенисЧ
 
04.04.16
12:19
просто не удалось? Ой, почему я такой весь из себя Станиславский... И Немирович одновременно, который Данченко...
8 DEaD_EGOR
 
04.04.16
12:20
(7) я скопировал полный текст ошибки..
9 CountR
 
04.04.16
12:43
(0) Иногда все таки миста веселит!
Давай сюда весь код из конфигурации, а то так непонятно!
10 DDwe
 
04.04.16
12:49
(0) Пользуемся отладчиком, смотрим внимательно, долго думаем. Наступает просветление, исправляем ошибки и все работает.
11 Rie
 
04.04.16
12:52
(0) Вот это особо радует:
            НЗ_КИ.Загрузить(НаборЗаписей);
            НЗ_КИ.Записать(Истина)// если 'ИСТИНА' - будет замещение данных
Тем более в цикле.
12 DEaD_EGOR
 
04.04.16
12:53
(9) я в (0) выложил весь код(((( Я уже и правда начинаю сомневаться, ту ли я профессию выбрал?((

(10) Не поверишь, я уже 2й день думаю и варианты перебираю((

(11) в этом я разобрался, цикл лишний убрал..
13 Rie
 
04.04.16
12:54
Первая строка сообщения (12) несколько противоречит третьей.
14 Rie
 
04.04.16
12:55
+(13) Заодно и таблицу значений убери.
Открой "Справку" в Конфигураторе и посмотри, какие методы есть у набора записей.
Ну а насчёт того, чтобы книжки вумные почитать - об этом молчу, молчу, молчу.
15 DDwe
 
04.04.16
12:56
(12) Не нужно перебирать варианты и гадать, нужно увидеть ошибку. Далее по тексту.
Ошибка? Это не ошибка, это системная функция.