Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 апр 2024, 11:21

Перенос данных из EXEL в 1с

Автор Елена1000000, 04 авг 2013, 23:24

0 Пользователей и 1 гость просматривают эту тему.

Елена1000000


У меня конфигурация Бух 8.2 на полной поддержке. Задача перенести в нее из файла EXEL большой объем данных, 40000 строк. Подскажите с чего начать. Спасибо за любую помощь.

GRADUS

Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)


СтандартнаяОбработка = Ложь;

// Выбор файла Microsoft Excel
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|Документ Excel (*.xlsx)|*.xlsx";
ВыборФайла.ПроверятьСуществованиеФайла = Истина;
ВыборФайла.ПолноеИмяФайла = ИмяФайла;
Выбор = ВыборФайла.Выбрать();
Если НЕ Выбор Тогда

Возврат;

КонецЕсли;

ИмяФайла = ВыборФайла.ВыбранныеФайлы[0];

КонецПроцедуры

Процедура ЗагрузитьXLSНажатие(Элемент)
Если ПустаяСтрока(ИмяФайла) Тогда
Предупреждение("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
Возврат;
КонецЕсли;

Попытка
// Загрузка Microsoft Excel
Состояние("Загрузка Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Ошибка при загрузке Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;

Попытка
// Открытие файла Microsoft Excel
Состояние("Открытие файла Microsoft Excel...");
ExcelФайл = ExcelПриложение.WorkBooks.Open(ИмяФайла);
Исключение
Сообщить("Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;

Попытка
// Обработка файла Microsoft Excel
Состояние("Обработка файла Microsoft Excel...");
// Читаем данные первого листа книги
ExcelЛист = ExcelФайл.Sheets(1);

// Определить количество строк и колонок выбранного листа книги Excel
xlCellTypeLastCell = 11;
ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;
Исключение
Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
// Закрыть COM соединение для экономии памяти
ExcelПриложение.Quit();
КонецПопытки;




// Создание описателя типов для таблицы значений
//КЧ = Новый КвалификаторыЧисла(15,2);
//КС = Новый КвалификаторыСтроки(200);
//Массив = Новый Массив;
//Массив.Добавить(Тип("Строка"));
//ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
//Массив.Очистить();
//Массив.Добавить(Тип("Число"));
//ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
//массив.Очистить();
//Массив.Добавить(Тип("СправочникСсылка.Номенклатура"));
//ОписаниеТиповНоменкл = Новый ОписаниеТипов(Массив);

// Очистить предыдущие значения
ТаблицаДокумента = новый ТаблицаЗначений;
ТаблицаДокумента.Очистить();
ТаблицаДокумента.Колонки.Очистить();


ТаблицаДокумента.Колонки.Добавить("Склад");
ТаблицаДокумента.Колонки.Добавить("Арктикул");
ТаблицаДокумента.Колонки.Добавить("Цвет"); //,ОписаниеТиповС,"Родитель",20);
ТаблицаДокумента.Колонки.Добавить("Размер1");
ТаблицаДокумента.Колонки.Добавить("Размер2"); 
ТаблицаДокумента.Колонки.Добавить("Размер3");
ТаблицаДокумента.Колонки.Добавить("Размер4");
ТаблицаДокумента.Колонки.Добавить("Размер5");
ТаблицаДокумента.Колонки.Добавить("Размер6");
ТаблицаДокумента.Колонки.Добавить("Цена");




//ТаблицаДокумента.Колонки.Добавить("Склад",ОписаниеТиповС,"Склад", 20);
//
////блицаДокумента.Колонки.Добавить("ОстатокльОригинал",20);
//ТаблицаДокумента.Колонки.Добавить("Остаток",ОписаниеТиповЧ,"Остаток",20);
//ТаблицаДокумента.Колонки.Добавить("ЦенаЗакуп",ОписаниеТиповЧ,"ЦенаЗакуп",20);
//ТаблицаДокумента.Колонки.Добавить("ЦенаПрод",ОписаниеТиповЧ,"ЦенаПрод",20);
//ТаблицаДокумента.Колонки.Добавить("МатериалОригинал",ОписаниеТиповС,"МатериалОригинал",20);
//ТаблицаДокумента.Колонки.Добавить("ЦветОригинал",ОписаниеТиповС,"ЦветОригинал",20);
//ТаблицаДокумента.Колонки.Добавить("РазмерОригинал",ОписаниеТиповС,"РазмерОригинал",20);
//ТаблицаДокумента.Колонки.Добавить("EAN",ОписаниеТиповС,"EAN",20);


Для Строка = 2 По (ExcelПоследняяСтрока) Цикл

Стр=ТаблицаДокумента.Добавить();
//Стр.Номер = Номер;
Попытка
Стр.Склад = СокрЛП(ExcelЛист.Cells(Строка, 1).Value) ;
Стр.Арктикул = СокрЛП(ExcelЛист.Cells(Строка, 2).Value) ;
Стр.Цвет = СокрЛП(ExcelЛист.Cells(Строка, 5).Value) ;
Стр.Размер1 = СокрЛП(ExcelЛист.Cells(Строка, 7).Value) ;
Стр.Размер2 = СокрЛП(ExcelЛист.Cells(Строка, 8).Value) ;
Стр.Размер3 = СокрЛП(ExcelЛист.Cells(Строка, 9).Value) ;
Стр.Размер4 = СокрЛП(ExcelЛист.Cells(Строка, 10).Value) ;
Стр.Размер5 = СокрЛП(ExcelЛист.Cells(Строка, 11).Value) ;
Стр.Размер6 = СокрЛП(ExcelЛист.Cells(Строка, 12).Value) ;
Стр.Цена = СокрЛП(ExcelЛист.Cells(Строка, 15).Value) ;

Исключение;
КонецПопытки;
КонецЦикла;
ExcelПриложение.Quit();

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
                | Номенклатура.Ссылка
                |ИЗ
                | Справочник.Номенклатура КАК Номенклатура
                |ГДЕ
                | Номенклатура.Артикул ПОДОБНО &Артикул
                | И Номенклатура.РазмерОригинальный = &Размер";

Запрос1 = Новый Запрос;
Запрос1.Текст = "ВЫБРАТЬ
| ДоговорыКонтрагентов.Ссылка
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Организация = &Организация
| И ДоговорыКонтрагентов.Владелец = &Владелец";


Документ = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();

Если Не ЗначениеЗаполнено(Склад) Тогда
Документ.СкладОрдер = Справочники.Склады.НайтиПоКоду("000000002");
Иначе
Документ.СкладОрдер = Склад;
КонецЕсли;

Если Не ЗначениеЗаполнено(Организация) Тогда
Справочники.Организации.НайтиПоКоду("000000002");
Иначе
Документ.Организация = Организация;
КонецЕсли;

Если Не ЗначениеЗаполнено(Контрагент) Тогда
Документ.Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000003");
Иначе
Документ.Контрагент = Контрагент;
КонецЕсли;
Документ.ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад;


Запрос1.УстановитьПараметр("Организация",Документ.Организация );
Запрос1.УстановитьПараметр("Владелец",Документ.Контрагент );
Результат = Запрос1.Выполнить();
Выборка = Результат.Выбрать();

Если Выборка.Следующий() Тогда
Документ.ДоговорКонтрагента = Выборка.Ссылка;
КонецЕсли;


//Документ.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("Организация",Документ.Организация.Ссылка);
Документ.ПроцентНаценки = 130;
Документ.ОбратныйКурс = 2.2;
Документ.Дата = ТекущаяДата();
Документ.ОтражатьВУправленческомУчете = Истина;
Документ.ОтражатьВБухгалтерскомУчете = Истина;
Документ.ОтражатьВНалоговомУчете = Истина;
Документ.УчитыватьНДС = Истина;

Для Каждого Строка Из ТаблицаДокумента Цикл
Если Строка.Арктикул = "" Тогда
Продолжить;
КонецЕсли;
Если Строка.Склад <> "" Тогда
НомерСклада = Лев(Строка.Склад,Найти(Строка.Склад,".")-1);
Склад = Справочники.Склады.ПустаяСсылка();
Склад = Справочники.Склады.НайтиПоРеквизиту("НомерМагазина",НомерСклада);
Если Не ЗначениеЗаполнено(Склад) Тогда
Сообщить("Не найден Склад под номером: " + НомерСклада);
КонецЕсли;
КонецЕсли;
Для N = 1 По 6 Цикл
Если Строка["Размер"+N] = "0" Тогда
Продолжить;
КонецЕсли;
Запрос.УстановитьПараметр("Артикул",СтрЗаменить(Строка.Арктикул," ","")+"%");
Запрос.УстановитьПараметр("Размер",Строка(N));

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
Если Выборка.Следующий() Тогда
Номенклатура = Выборка.Ссылка;
КонецЕсли;
Если ЗначениеЗаполнено(Номенклатура) Тогда
Стр = Документ.Товары.Добавить();
Стр.Номенклатура = Номенклатура;
//Стр.Арктикул = Стр.Номенклатура.Артикул;
Стр.Количество = Строка["Размер"+N];
Стр.ЕдиницаИзмерения = Стр.Номенклатура.ЕдиницаХраненияОстатков;
Стр.Коэффициент = Стр.ЕдиницаИзмерения.Коэффициент;
Стр.ЦенаИзИнвойса = Строка.Цена;
Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
Стр.СкладИзИнвойса = Склад;
Иначе
Сообщить("Арктикул "+Строка.Арктикул+" не найден");
КонецЕсли;
КонецЦикла;
КонецЦикла;

Для Каждого Стр Из Документ.Товары Цикл
Стр.Цена = Окр(Стр.ЦенаИзИнвойса * Документ.ПроцентНаценки / Документ.ОбратныйКурс, -1);
СтрокаТабличнойЧасти = Стр;
// Рассчитать реквизиты табличной части.
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, Документ);
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, Документ);
КонецЦикла;

Документ.ПолучитьФорму("ФормаДокумента").Открыть();



КонецПроцедуры

Dethmontt

Ты бы еще сюда выложил весь код обработки - ЗагрузкаИзТабличногоДокумента :D
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

GRADUS

Цитата: Dethmontt от 04 авг 2013, 23:35
Ты бы еще сюда выложил весь код обработки - ЗагрузкаИзТабличногоДокумента :D

Да кому оно надо :bleh:

Елена1000000


Dethmontt

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Елена1000000

Хорошо, начну по порядку с чем столкнулась.
1.Где писать обработку если конфигурация на поддержке?
2.Если взять готовую обработку, то как добавить ее в конфигурацию:
В меню поддержка нет пункта "настройка поддержки".
3.Можно добавить внешнюю обработку в самом Предприятии?
И опять возвращаемся к вопросу: где взять или где разработать или как снять с поддержки!!!
Р.С. Надеюсь на понимание, а не на страшную реакцию B)

Dethmontt

Цитата: Елена1000000 от 04 авг 2013, 23:543.Можно добавить внешнюю обработку в самом Предприятии?

Лучше это!

В предприятии:
Сервис - Дополнительные отчеты и обработки - обработки - Добавить!
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Елена1000000

Спасибо, пробую ее в самом предприятии..

Dethmontt

Цитата: Елена1000000 от 04 авг 2013, 23:541.Где писать обработку если конфигурация на поддержке?

В конфигураторе (и пофиг что конфигурация на поддержке):
Файл - Новый - Внешняя обработка
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск