Делаю загрузка Табеля из 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();
Об_Конект = Неопределено;
УчетРабочегоВремениРасширенныйКлиентСервер.ТабельУстановитьИнфонадписьВысотаСтрок(ВладелецФормы);
ВладелецФормы.ОбновитьОтображениеДанных();
КонецПроцедуры // ()
ПоказатьПо теме из базы знаний
- Загрузка из EXCEL в 1С. Чтение файла XLSX средствами 1С. ЧтениеXML
- Загрузка из Excel книги покупок и книги продаж в 1С:Бухгалтерия 3.0, 1С:Бухгалтерия 2.0 для последующего формирования декларации НДС
- Загрузка из Excel в документы (4 вида) для УТ 11.4, УТ 11.5
- Универсальная загрузка из Excel
- Загрузка из Excel с выбором листа на управляемых формах
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
В такой портянке сложно разобраться.
Почему бы не загрузить excel-файл в табличный документ, табличный документ преобразовать в таблицу значений и уже с ней работать? Так будет понятно откуда какие данные. А вот что ваш sel ect fr om возвращает и почему...
Почему бы не загрузить excel-файл в табличный документ, табличный документ преобразовать в таблицу значений и уже с ней работать? Так будет понятно откуда какие данные. А вот что ваш sel ect fr om возвращает и почему...
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
Оп = Новый ОписаниеОповещения("НачатьПомещениеФайлаОкончание", ЭтотОбъект);
АдресВременногоХранилища = "";
НачатьПомещениеФайла(Оп, АдресВременногоХранилища, ПутьКФайлу,Ложь, ЭтаФорма.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура НачатьПомещениеФайлаОкончание(Результат, АдресВременногоХранилища, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
ПрочитатьФайлНаСервере(АдресВременногоХранилища, "СписокСотрудников");
ПодготовитьДанныеДляЗагрузки(ЕстьОшибки);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайлНаСервере(АдресВременногоХранилища, ИмяТД)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Объект.РасширениеФайла);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ТД.Прочитать(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
&НаСервере
Процедура ПодготовитьДанныеДляЗагрузки(ЕстьОшибки)
тзИсходныеДанные = ПреобразоватьТабличныйДокументВТаблицуЗначений("СписокСотрудников");
КонецПроцедуры
Функция ПреобразоватьТабличныйДокументВТаблицуЗначений(ИмяТД, УпрощенныйШаблон = Ложь)
ТабДокумент = ЭтаФорма[ИмяТД];
ПоследняяСтрока = ТабДокумент.ВысотаТаблицы;
ПоследняяКолонка = ТабДокумент.ШиринаТаблицы;
ОбластьЯчеек = ТабДокумент.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);
// Создаем описание источника данных на основании области ячеек табличного документа.
ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
// Создаем объект для интеллектуального построения отчетов,
// указываем источник данных и выполняем построение отчета.
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
// Результат выгружаем в таблицу значений.
ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
Возврат ТабЗначений;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот