&НаКлиенте
Процедура Файл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";
Возврат НовоеИмя;
КонецФункции