&НаКлиенте Процедура ФайлExcelНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбора.Заголовок = "Выберите файл"; ДиалогВыбора.Фильтр ="Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|"; Если ДиалогВыбора.Выбрать() Тогда ИмяФайла = ДиалогВыбора.ПолноеИмяФайла; КонецЕсли; КонецПроцедуры
&НаКлиенте Процедура ОбработатьExcelФайл(Команда) ОчиститьСообщения(); Если ПустаяСтрока(ИмяФайла) Тогда Возврат; КонецЕсли; //Логируем LogФайл = Новый ТекстовыйДокумент; мсооб = Новый СообщениеПользователю; мсооб.Текст = ""+ТекущаяДата()+": Начало обработки."; LogФайл.ДобавитьСтроку(мсооб.Текст); мсооб.Сообщить(); Excel = ПодключитьсяКЭкселю(); Если Excel=Неопределено Тогда Возврат; КонецЕсли; Книга = Excel.WorkBooks.Open(ИмяФайла); Лист = Книга.WorkSheets(1); ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; ИсточникКодВ1 = ОпределитьЧтоЕстьКод(СокрЛП(Лист.Cells(2,1).Value)); НаборСтрокФайла = новый массив; СчетчикПроблемныхПозиций = 0; //Начинаем с второй строки в первой шапка) для Строка = 2 по ВсегоСтрок цикл //Находим номенклатуру по ШК Код_товара = СокрЛП(Лист.Cells(Строка,ЭксельНомерКолонкиСКодом).Value); Если не ЗначениеЗаполнено(Код_товара) И ЗначениеЗаполнено(СокрЛП(Лист.Cells(Строка,15).Value)) Тогда мсооб = Новый СообщениеПользователю; ИмяПозиции1 = "("+СокрЛП(Лист.Cells(Строка,15).Value)+")"; ИмяПозиции2 = " ("+СокрЛП(Лист.Cells(Строка,2).Value)+")"; ОбщеИмяПозиции = ИмяПозиции1+ИмяПозиции2; мсооб.Текст = ""+ТекущаяДата()+": Для позиции "+ОбщеИмяПозиции+" не указан код на PromUa"; LogФайл.ДобавитьСтроку(мсооб.Текст); мсооб.Сообщить(); Продолжить; ИначеЕсли не ЗначениеЗаполнено(Код_товара) Тогда Продолжить; КонецЕсли; Если ЗначениеЗаполнено(СокрЛП(ЭксельКолдПозицииДляОбработки)) И Код_товара<>СокрЛП(ЭксельКолдПозицииДляОбработки) Тогда Продолжить; КонецЕсли; НоменклатураИлиХарактеристикаПоШтрихКоду = НайтиПозициюПоШК(Код_товара); //Проверяем колонку с номером группы разновидностй ID_группы_разновидностей = СокрЛП(Лист.Cells(Строка,ЭксельНомерКолонкиСКодомГруппы).Value); ЭтоВторостепеннаяХарактеристика=УжеЕстьВТЗУжеОбработанных(Код_товара,ID_группы_разновидностей); НовыйГуид = ПолучитьГУИДНоменклатурыИДИХарКИ(НоменклатураИлиХарактеристикаПоШтрихКоду,ЭтоВторостепеннаяХарактеристика,Код_товара,СчетчикПроблемныхПозиций,ID_группы_разновидностей,LogФайл,ОбщеИмяПозиции); Если СокрЛП(строка(Лист.Cells(Строка,ЭксельНомерКолонкиСГУИД1С).Value))<>СокрЛП(строка(НовыйГуид)) Тогда ЭксельКолВоИзмененныхЗаписией = ЭксельКолВоИзмененныхЗаписией+1; Лист.Cells(Строка,ЭксельНомерКолонкиСГУИД1С).Value = строка(НовыйГуид); КонецЕсли; //Обновляем индикатор прогресса ИндикаторОбработкиExcel = Строка; //Заглушка если нужно остановить цикл Если КоличествоСтрокДляОбработки>0 И Строка=(КоличествоСтрокДляОбработки+1) Тогда ОтключитьсяОтЭкселя(Excel,ИмяФайла); Прервать; КонецЕсли; КонецЦикла; //сохранить и Закрываем эксель ОтключитьсяОтЭкселя(Excel,ИмяФайла); //Закрываем лог LogФайл.ДобавитьСтроку(""+ТекущаяДата()+": Обработка завершена"); Если ЭксельСохранятьЛог Тогда LogФайл.Записать(ЭксельПутьДляСохраненияЛога,КодировкаТекста.UTF8,Символы.ВК + Символы.ПС); КонецЕсли; мсооб = новый СообщениеПользователю; мсооб.Текст = "Отчет сохранен в файле: "+ЭксельПутьДляСохраненияЛога; мсооб.Сообщить(); КонецПроцедуры
&НаКлиенте Функция ПодключитьсяКЭкселю() Excel = Неопределено; Попытка Excel = Новый COMОбъект("Excel.Application"); Исключение Сообщить("Ошибка при открытии файла с помощью Excel! Возможно не устанволен Эксель на этом ПК"); Сообщить(ОписаниеОшибки()); Excel.DisplayAlerts = 0; Excel.ActiveWorkbook.Close(); Excel.DisplayAlerts = 1; Excel.Application.Quit(); Excel = Неопределено; Возврат Excel; КонецПопытки; Возврат Excel; КонецФункции
&НаКлиенте Процедура ОтключитьсяОтЭкселя(Excel,ИмяФайла) Если Excel<>Неопределено Тогда ПолныйПутьНовоеИмяФайла = СгенерироватьНовоеИмяФайла(ИмяФайла); Excel.ActiveWorkBook.SaveAs(ПолныйПутьНовоеИмяФайла); Excel.DisplayAlerts = 0; Excel.ActiveWorkbook.Close(); Excel.DisplayAlerts = 1; Excel.Application.Quit(); Excel = Неопределено; ХранилищеТЗ = ""; мсооб = Новый СообщениеПользователю; мсооб.Текст = ""+ТекущаяДата()+": Загрузка завершена.Новый файл сохранен по адресу: "+ПолныйПутьНовоеИмяФайла; мсооб.Сообщить(); КонецЕсли; КонецПроцедуры
&НаКлиенте Функция СгенерироватьНовоеИмяФайла(СтароеИмя) толькоимя = СтрНайти(СтароеИмя,".xlsx")-1; НовоеИмя = Лев(СтароеИмя,толькоимя)+"_new.xlsx"; Возврат НовоеИмя; КонецФункции