&НаКлиенте Процедура Файл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 = Неопределено;
ХранилищеТЗ	=	"";
мсооб	=	Новый СообщениеПользователю;
мсооб.Текст	=	""+ТекущаяДата()+": Загрузка завершена.Новый файл сохранен по адресу: "+ПолныйПутьНовоеИмяФайла;
мсооб.Сообщить();
КонецЕсли;

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