Ошибка загрузки из Excel

1. sajmon45 05.08.21 12:09 Сейчас в теме
Делаю загрузка Табеля из Excel в ЗУП. Грузится, но не правильно. Если в предшествующей строке по конкретному дню стоит цифра или пуста, то по последующей строке по этому дню выходит всегда null. Где ошибка в коде, подскажите пожалуйста?
&НаКлиенте
Процедура ПослеВыбораЛиста(ВыбранныйЭлемент, Об_Конект) Экспорт 

	Если ВыбранныйЭлемент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаСписка = ВыбранныйЭлемент.Значение;
	
	Если СтрокаСписка <> Неопределено Тогда
		//Сообщить("Выбран лист "+СтрокаСписка);
		ТекстЗапроса = "SEL ECT * FR OM ["+СтрокаСписка+"]";
		
		Попытка			
			//RecordSet = Об_Конект.Execute(ТекстЗапроса); //не работало количество строк RecordSet.RecordCount
			RecordSet = Новый COMОбъект("ADODB.Recordset");
			RecordSet.CursorType = 3;
			RecordSet.Open(ТекстЗапроса, Об_Конект);
		Исключение			
			Сообщить("Не удалось выполнить запрос к файлу Excel 
			|"+ ОписаниеОшибки(),СтатусСообщения.Важное);			
			Возврат;			
		КонецПопытки;
		
		Сч = 0;
		НомерСт = 0;
		
		Пока НЕ RecordSet.EOF() Цикл 
			
			Сч = Сч + 1;
			
			RecordSet.MoveNext();	
			
			//Состояние("Идет считывание с файла xls", (Сч/RecordSet.RecordCount)*100);	
			
			//Проверим период
			Если СокрЛП(RecordSet.Fields(1).value) = "структурное подразделение" Тогда
				ДатаНачала = RecordSet.Fields(35).value;
				ДатаОкончания = RecordSet.Fields(39).value;
			КонецЕсли;
			
			//обойдём всех сотрудников
			Если ТипЗнч(RecordSet.Fields(0).value) = Тип("Число") Тогда
				
				ОбработкаПрерыванияПользователя();
				
				ФИОСотрудника = RecordSet.Fields(1).value;
				ТабНомер = Найти(ФИОСотрудника, "(");
				
				Если ТабНомер <> 0 Тогда
					ТабНомер = Прав(ФИОСотрудника, СтрДлина(ФИОСотрудника)-ТабНомер);
					ТабНомер = СтрЗаменить(ТабНомер, ")", "");
					Сотрудник = ПолучитьСотрудникаПоТабНомеру(ТабНомер);
					СтрокаФЛ = ВладелецФормы.Объект.ФизическиеЛица.Добавить();		
					СтрокаФЛ.ФизическоеЛицо = ПолучитьФизЛицоСотрудника(Сотрудник);
					СтруктураУв = УволенныйСотр(СтрокаФЛ.ФизическоеЛицо,ТабНомер);
					Если не СтруктураУв.ФизЛицо = Неопределено Тогда
						ПоказатьПредупреждение(,"Сотрудник: " + Строка(СтруктураУв.ФизЛицо)+" с Табельным номером: "+ ТабНомер + " является уволенным от " + Строка(СтруктураУв.Пер) + " заполните вручную!!!");
					КонецЕсли;
				КонецЕсли;
								
				//Я = 1 явка
				//ВЧ = 2 веч часы
				//НЧ = 3 ноч часы
				//Б = б больничный
				//ОТ = о отпуск
				//НН = н невыход
				//В = ? выходной
				//ДО = а Отпуск неоплачиваемый с разрешения работодателя

				Явка = 0;
				ВечерниеЧасы = 0;
				НочныеЧасы = 0;
				Отпуск = 0;
				Больничный = 0;
				Неявка = 0;
				ОтпускН = 0;
				
				НомерСт = НомерСт + 1;
				ВладелецФормы.Модифицированность = Истина;
				
				СтрокаВР = ВладелецФормы.Объект.ДанныеОВремени.Добавить();
				СтрокаВР.НомерСтрокиСотрудник = НомерСт;

				СтрокаВР.Сотрудник = Сотрудник;
				СтрокаВР.ЭтоПерваяСтрокаПоСотруднику = Истина;
				НоваяСтрока = Истина;
				ВтораяСтрока = Неопределено;
				
				//обойдём все дни
				Для Сч = Число(Лев(ДатаНачала,2)) по Число(Лев(ДатаОкончания,2)) цикл
										
					Состояние("Идёт загрузка "+RecordSet.Fields(0).value+". "+RecordSet.Fields(1).value+" "+Сч+"/"+Число(Лев(ДатаОкончания,2)), (Сч/Число(Лев(ДатаОкончания,2)))*100);
					
					БуквенныйКод = "";
					ЗначениеДня = "";
					ЗначениеДня = RecordSet.Fields(1+Сч).value;
					Сообщить("1 День "+(Сч)+" - [" + ТипЗнч(ЗначениеДня)+"]");
					
					Если СокрЛП(НРег(ЗначениеДня)) = "1" Тогда
						//явка
						Явка = Явка + 1;
						БуквенныйКод = "Я";
						//ДобавитьСтроку("Я",8, Сотрудник, Сч);
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("Я");
						СтрокаВР["Часов"+Сч] = 8;	
						//Сообщить("0 - "+ВладелецФормы.Объект.ДанныеОВремени[0].Часов3);
					ИначеЕсли СокрЛП(НРег(ЗначениеДня)) = "11" Тогда
						//явка
						Явка = Явка + 1;
						БуквенныйКод = "Я";
						//ДобавитьСтроку("Я",11, Сотрудник, Сч);
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("Я");
						СтрокаВР["Часов"+Сч] = 11;	
					ИначеЕсли СокрЛП(НРег(ЗначениеДня)) = "2" Тогда
						//вечерние часы
						ВечерниеЧасы = ВечерниеЧасы + 1;
						БуквенныйКод = "Я";
						//ДобавитьСтроку("Я",8, Сотрудник, Сч);						
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("Я");
						СтрокаВР["Часов"+Сч] = 8;	
						Если ВтораяСтрока = Неопределено Тогда
							ВтораяСтрока = ДобавитьСтроку("ВЧ",8, Сотрудник, Сч);
						Иначе
							ВтораяСтрока["ВидВремени"+Сч] = ПолучитьВидВремени("ВЧ");
							ВтораяСтрока["Часов"+Сч] = 8;	
						КонецЕсли; 
					ИначеЕсли СокрЛП(НРег(ЗначениеДня)) = "12" Тогда
						//вечерние часы
						ВечерниеЧасы = ВечерниеЧасы + 1;
						БуквенныйКод = "Я";
						//ДобавитьСтроку("Я",11, Сотрудник, Сч);
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("Я");
						СтрокаВР["Часов"+Сч] = 11;	
						Если ВтораяСтрока = Неопределено Тогда
							ВтораяСтрока = ДобавитьСтроку("Н",7, Сотрудник, Сч);
						Иначе
							ВтораяСтрока["ВидВремени"+Сч] = ПолучитьВидВремени("Н");
							ВтораяСтрока["Часов"+Сч] = 7;	
						КонецЕсли;
					ИначеЕсли СокрЛП(НРег(ЗначениеДня)) = "3" Тогда
						//ночные часы	
						НочныеЧасы = НочныеЧасы + 1;
						БуквенныйКод = "Я";
						//ДобавитьСтроку("Я",8, Сотрудник, Сч);
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("Я");
						СтрокаВР["Часов"+Сч] = 8;	
						Если ВтораяСтрока = Неопределено Тогда
							ВтораяСтрока = ДобавитьСтроку("Н",7, Сотрудник, Сч);	
						Иначе
							ВтораяСтрока["ВидВремени"+Сч] = ПолучитьВидВремени("Н");
							ВтораяСтрока["Часов"+Сч] = 7;	
						КонецЕсли; 
					//ИначеЕсли СокрЛП(НРег(ЗначениеДня)) = "о" Тогда
					ИначеЕсли СокрЛП(НРег(ЗначениеДня)) = "о" или СокрЛП(НРег(ЗначениеДня)) = "0" Тогда
						//отпуск		
						Отпуск = Отпуск + 1;
						БуквенныйКод = "ОТ";
						//ДобавитьСтроку("ОТ",8, Сотрудник, Сч);
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("ОТ");
						СтрокаВР["Часов"+Сч] = 8;	
					ИначеЕсли СокрЛП(НРег(ЗначениеДня)) = "б" Тогда
						//больничный
						Больничный = Больничный + 1;
						БуквенныйКод = "Б";
						//ДобавитьСтроку("Б",8, Сотрудник, Сч);
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("Б");
						//СтрокаВР["Часов"+Сч] = 8;	
					ИначеЕсли СокрЛП(НРег(ЗначениеДня)) = "н" Тогда
						//неявка
						Неявка = Неявка + 1;
						БуквенныйКод = "НН";
						//ДобавитьСтроку("НН",8, Сотрудник, Сч);
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("НН");
						СтрокаВР["Часов"+Сч] = 8;	
					ИначеЕсли СокрЛП(НРег(ЗначениеДня)) = "а" Тогда
						//отпуск неоплачиваемый 
						ОтпускН = ОтпускН + 1;
						БуквенныйКод = "ДО";
						//ДобавитьСтроку("ДО",8, Сотрудник, Сч);
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("ДО");
						СтрокаВР["Часов"+Сч] = 8;	
					Иначе
						//выходной
						//Сообщить("2 День "+(1+Сч)+" - " + НРег(ЗначениеДня) = "о");
						БуквенныйКод = "В";
						СтрокаВР["ВидВремени"+Сч] = ПолучитьВидВремени("В");
						//ДобавитьСтроку("В",0, Сотрудник, Сч);
						//НоваяСтрока["ПервыйВидВремени"+Сч] = Справочники.КлассификаторИспользованияРабочегоВремени.НайтиПоРеквизиту("БуквенныйКод","В");;
						//НоваяСтрока["ПервыйЧасов"+Сч] = 8;	
					КонецЕсли;
					
					НоваяСтрока = Ложь;
					
					ОбновитьФорму(СтрокаВР, БуквенныйКод, Сч, ВтораяСтрока);
					
				КонецЦикла;								
				
				//Сообщить(Строка(RecordSet.Fields(0).value) + " " + RecordSet.Fields(1).value + " Я:"+Явка+", ВЧ:"+ВечерниеЧасы+", НЧ:"+НочныеЧасы+", ОТ:"+Отпуск+", Б:"+Больничный+", НН:"+Неявка+", ДО:"+ОтпускН);				
								
			КонецЕсли;			
			
			Если СокрЛП(RecordSet.Fields(1).value) = "ВСЕГО:" Тогда
				//Состояние("Идет считывание с файла xls",100);	
				Прервать;
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
	//закрываем соединение с Excel
	Об_Конект.Close();
	Об_Конект = Неопределено;	
			
	УчетРабочегоВремениРасширенныйКлиентСервер.ТабельУстановитьИнфонадписьВысотаСтрок(ВладелецФормы);
	
	ВладелецФормы.ОбновитьОтображениеДанных();
	

КонецПроцедуры // ()
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dka80 20 05.08.21 15:05 Сейчас в теме
В такой портянке сложно разобраться.
Почему бы не загрузить excel-файл в табличный документ, табличный документ преобразовать в таблицу значений и уже с ней работать? Так будет понятно откуда какие данные. А вот что ваш sel ect fr om возвращает и почему...
3. sajmon45 05.08.21 15:56 Сейчас в теме
4. dka80 20 05.08.21 16:14 Сейчас в теме
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
	
	Оп = Новый ОписаниеОповещения("НачатьПомещениеФайлаОкончание", ЭтотОбъект);
 	АдресВременногоХранилища = "";
	НачатьПомещениеФайла(Оп, АдресВременногоХранилища, ПутьКФайлу,Ложь, ЭтаФорма.УникальныйИдентификатор);
 		
КонецПроцедуры

&НаКлиенте
Процедура НачатьПомещениеФайлаОкончание(Результат, АдресВременногоХранилища, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	
	ПрочитатьФайлНаСервере(АдресВременногоХранилища, "СписокСотрудников");
	
	ПодготовитьДанныеДляЗагрузки(ЕстьОшибки);

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

&НаСервере
Процедура ПрочитатьФайлНаСервере(АдресВременногоХранилища, ИмяТД)
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Объект.РасширениеФайла);
	ДвоичныеДанные.Записать(ИмяВременногоФайла);
	
	ТД.Прочитать(ИмяВременногоФайла);
	УдалитьФайлы(ИмяВременногоФайла);
	
КонецПроцедуры

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

Функция ПреобразоватьТабличныйДокументВТаблицуЗначений(ИмяТД, УпрощенныйШаблон = Ложь) 
	
	ТабДокумент = ЭтаФорма[ИмяТД];
	ПоследняяСтрока = ТабДокумент.ВысотаТаблицы;
	ПоследняяКолонка = ТабДокумент.ШиринаТаблицы;
	ОбластьЯчеек = ТабДокумент.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка); 
	
	// Создаем описание источника данных на основании области ячеек табличного документа.
	ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);  
	// Создаем объект для интеллектуального построения отчетов,
	// указываем источник данных и выполняем построение отчета.
	ПостроительОтчета = Новый ПостроительОтчета; 
	ПостроительОтчета.ИсточникДанных = ИсточникДанных;
	ПостроительОтчета.Выполнить();
	// Результат выгружаем в таблицу значений.
	ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
	Возврат ТабЗначений;
	
КонецФункции
Показать
5. dka80 20 05.08.21 16:15 Сейчас в теме
Но тупо не копипасти. Это из рабочего инструмента. Что-то тебе не нужно (переменные, параметры функций)
6. sajmon45 05.08.21 16:46 Сейчас в теме
(5) А как считать данные с определенного листа?
7. dka80 20 06.08.21 10:23 Сейчас в теме
(6) каждый лист в табличном документе представляет одноименную область. получи область и обрабатывай ее
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот