//Перем ExcelПриложение;
&НаКлиенте
Процедура ФайлЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|Документ Excel (*.xlsx)|*.xlsx";
ВыборФайла.ПроверятьСуществованиеФайла = Истина;
ВыборФайла.ПолноеИмяФайла = Объект.ФайлЗагрузки;
Выбор = ВыборФайла.Выбрать();
Если НЕ Выбор Тогда
Возврат;
КонецЕсли;
Объект.ФайлЗагрузки = ВыборФайла.ВыбранныеФайлы[0];
КонецПроцедуры
&НаКлиенте
Процедура Загрузить(Команда)
ВыгрузкаДанныхИзЕксель();
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузкаДанныхИзЕксель()
Если ПустаяСтрока(Объект.ФайлЗагрузки) Тогда
Предупреждение("Для запуска обработки необходимо предварительно выбрать файл 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(Объект.НомерЛиста); // Какой лист читаем
ЧтениеИзФайлаСервера(ExcelЛист);
ПрошлоЧтение = Истина;
Исключение
Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
// Закрыть COM соединение для экономии памяти
ExcelПриложение.Quit();
ПрошлоЧтение = Ложь;
КонецПопытки;
Если ПрошлоЧтение Тогда
ExcelПриложение.Quit();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЧтениеИзФайлаСервера(ExcelЛист)
Если не ЗначениеЗаполнено(Объект.ФайлЗагрузки) Тогда
Сообщить("Может сначала выбрать файл!");
Возврат;
КонецЕсли;
АнализВыполнен = 1;
Лист = ExcelЛист;//.WorkSheets(1);
НомПоляАртикул = 1;
НомСтрокиАртикул = 1;
КолАрт = 0 ;
КатНом = "";
ПерКатНом = "";
НайденАртикул = ПоискСтрокиПоляАртикула(ExcelЛист, НомСтрокиАртикул, НомПоляАртикул);
Пока НайденАртикул Цикл
КолАрт = КолАрт + 1;
Артикул = СокрЛП(Лист.Cells(НомСтрокиАртикул+1, НомПоляАртикул).Text);
СледСтрока = Ложь;
Пока Артикул <> "" Цикл
Если Не СледСтрока Тогда
НомПоляЦена = НомПоляАртикул;
НайденаЦена = ПоискСтрокиПоляЦена(ExcelЛист, НомСтрокиАртикул, НомПоляЦена);
Если НайденаЦена Тогда
ЦенаНом = СокрЛП(Лист.Cells(НомСтрокиАртикул+1, НомПоляЦена).Text);
НайдСимвол = Найти(ЦенаНом, "р");
Если НайдСимвол <> 0 Тогда
КолСимволов = (СтрДлина(ЦенаНом)+1)-НайдСимвол;
ЦенаНом = Лев(ЦенаНом, СтрДлина(ЦенаНом)-КолСимволов);
КонецЕсли;
Иначе
ЦенаНом = 0;
КонецЕсли;
КонецЕсли;
НайденаяНоменклатура = ПоискЭлементаСпрНоменклатуры(Артикул);
Если Не СледСтрока Тогда
НаимНом = СокрЛП(Лист.Cells(НомСтрокиАртикул-1, НомПоляАртикул).Text);
КатНом = СокрЛП(Лист.Cells(НомСтрокиАртикул-2, НомПоляАртикул).Text);
Если КатНом <>"" Тогда
ПерКатНом = КатНом;
КонецЕсли;
КонецЕсли;
Если НайденаяНоменклатура <> Неопределено Тогда
ЗаписьЦен(НайденаяНоменклатура, ЦенаНом);
Иначе
НПоля = НомПоляАртикул + 1;
ОписаниеНом = "";
Пока НПоля < НомПоляЦена Цикл
ОписаниеНом = ОписаниеНом + СокрЛП(Лист.Cells(НомСтрокиАртикул+1, НПоля).Text)+"/";
НПоля = НПоля + 1;
КонецЦикла;
НовНомеклатура = ЗаписьНовогоЭлемНоменклатуры(НаимНом, Артикул, ОписаниеНом, ПерКатНом);
ЗаписьЦен(НовНомеклатура, ЦенаНом);
КонецЕсли;
НомСтрокиАртикул = НомСтрокиАртикул + 1;
Артикул = СокрЛП(Лист.Cells(НомСтрокиАртикул+1, НомПоляАртикул).Text);
СледСтрока = Истина;
КонецЦикла;
//
НомСтрокиАртикул = НомСтрокиАртикул + 1;
НайденАртикул = ПоискСтрокиПоляАртикула(ExcelЛист, НомСтрокиАртикул, НомПоляАртикул);
КонецЦикла;
Сообщить(КолАрт);
КонецПроцедуры
&НаКлиенте
Функция ПоискСтрокиПоляЦена(Лист, НомСтрокиАртикул, НомПоляЦена)
ПустыеСтроки = 0;
ПустыеПоля = 0;
Пока ПустыеПоля < 3 Цикл //+3 - ?????????? ИЛИ НомСтроки<24
НаверноеЦена = СокрЛП(Лист.Cells(НомСтрокиАртикул, НомПоляЦена).Text);
ТутЦена = Найти(НРег(НаверноеЦена), "цен");
Если ТутЦена <> 0 Тогда
Возврат(Истина);
ИначеЕсли НаверноеЦена = "" Тогда
ПустыеПоля = ПустыеПоля + 1;
Иначе
НомПоляЦена = НомПоляЦена + 1;
КонецЕсли;
КонецЦикла;
Возврат(Ложь);
КонецФункции
&НаКлиенте
Функция ПоискСтрокиПоляАртикула(Лист, НомСтрокиАртикул, НомПоляАртикул)
ПустыеСтроки = 0;
ПустыеПоля = 0;
Пока ПустыеСтроки < 7 ИЛИ ПустыеПоля < 7 Цикл //+3 - ?????????? ИЛИ НомСтроки<24
НаверноеАртикул = СокрЛП(Лист.Cells(НомСтрокиАртикул, НомПоляАртикул).Text);
ТутАрт = Найти(НРег(НаверноеАртикул), "арт");
Если ТутАрт <> 0 Тогда
Возврат(Истина);
ИначеЕсли НаверноеАртикул = "" Тогда
ПустыеСтроки = ПустыеСтроки + 1;
НомСтрокиАртикул = НомСтрокиАртикул + 1;
Если ПустыеСтроки = 7 Тогда
Если ПустыеПоля < 8 Тогда
ПустыеСтроки = 0;
КонецЕсли;
ПустыеПоля = ПустыеПоля + 1;
НомПоляАртикул = НомПоляАртикул + 1;
НомСтрокиАртикул = 1;
КонецЕсли;
Иначе
НомСтрокиАртикул = НомСтрокиАртикул + 1;
КонецЕсли;
КонецЦикла;
Возврат(Ложь);
КонецФункции
&НаСервере
Функция ПоискЭлементаСпрНоменклатуры(ПоискПоАртиклу)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул
|
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул";
Запрос.УстановитьПараметр("Артикул", ПоискПоАртиклу);
Рез = Запрос.Выполнить();
Если Рез.Пустой() Тогда
Возврат(Неопределено);
ИначеЕсли Рез.Выбрать().Количество() = 1 Тогда
Выборка = Рез.Выбрать();
Выборка.Следующий();
Возврат(Выборка.Ссылка);
КонецЕсли;
КонецФункции
&НаСервере
Процедура ОбновитьЦеныНоменклатуры(НайденаяНоменклатура)
КонецПроцедуры
&НаСервере
Функция ЗаписьНовогоЭлемНоменклатуры(НаимНом, Артикул, ОписаниеНом, КатегорияНом)
Группа = Справочники.Номенклатура.НайтиПоНаименованию(КатегорияНом);
Если Группа.Пустая() Тогда
СоздГруппы = Справочники.Номенклатура.СоздатьГруппу();
СоздГруппы.Наименование = КатегорияНом;
СоздГруппы.Записать();
КонецЕсли;
НовЭлСпрНоменклатуры = Справочники.Номенклатура.СоздатьЭлемент();
НовЭлСпрНоменклатуры.Наименование = НаимНом;
НовЭлСпрНоменклатуры.НаименованиеПолное = НаимНом;
НовЭлСпрНоменклатуры.ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт"); // будет наверное меняться
НовЭлСпрНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Запас;
НовЭлСпрНоменклатуры.НоменклатурнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Товары"); // будет меняться
НовЭлСпрНоменклатуры.Артикул = Артикул;
НовЭлСпрНоменклатуры.Комментарий = ОписаниеНом;
НовЭлСпрНоменклатуры.Родитель = Справочники.Номенклатура.НайтиПоНаименованию(КатегорияНом);
Попытка
//УправлениеСвойствами.ПередЗаписьюНаСервере(ЭлемФормы, НовЭлСпрНоменклатуры);
НовЭлСпрНоменклатуры.Записать();
Сообщить("Записана номенклатура: "+ НовЭлСпрНоменклатуры.Наименование);
Возврат(НовЭлСпрНоменклатуры.Ссылка);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецФункции
Процедура ЗаписьЦен(ЭлемНом, ЦенаНом)
НаборЗап = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗап.Отбор.Номенклатура.Установить(ЭлемНом);
НаборЗап.Отбор.Период.Установить(ТекущаяДата());
НовЗапись = НаборЗап.Добавить();
НовЗапись.Номенклатура = ЭлемНом.Ссылка;
НовЗапись.Период = ТекущаяДата();
НовЗапись.ВидЦен = Справочники.ВидыЦен.Оптовая;
НовЗапись.Цена = ЦенаНом;
НовЗапись.ЕдиницаИзмерения = ЭлемНом.ЕдиницаИзмерения;
НаборЗап.Записать(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Объект.НомерЛиста = 1;
КонецПроцедуры
Структура прайса
Комментариев нет :
Отправить комментарий