v3.0.0.2: Добавлен прогрессбар и статус загрузки

This commit is contained in:
Профи-Софт
2026-07-06 19:51:55 +00:00
parent d0ed6625e2
commit 1998c606fc
2 changed files with 73 additions and 17 deletions
@@ -60,6 +60,13 @@
<DataPath>Объект.ПутьКФайлу</DataPath> <DataPath>Объект.ПутьКФайлу</DataPath>
<Width>80</Width> <Width>80</Width>
</InputField> </InputField>
<ProgressBar name="Прогресс" id="50">
<DataPath>Прогресс</DataPath>
<Width>100</Width>
</ProgressBar>
<LabelField name="СтатусЗагрузки" id="51">
<DataPath>СтатусЗагрузки</DataPath>
</LabelField>
<InputField name="МесяцЗагрузки" id="23"> <InputField name="МесяцЗагрузки" id="23">
<DataPath>Объект.МесяцЗагрузки</DataPath> <DataPath>Объект.МесяцЗагрузки</DataPath>
<Title> <Title>
@@ -238,6 +245,22 @@
</Type> </Type>
<MainAttribute>true</MainAttribute> <MainAttribute>true</MainAttribute>
</Attribute> </Attribute>
<Attribute name="Прогресс" id="50">
<Type>
<v8:Type>Number</v8:Type>
</Type>
</Attribute>
<Attribute name="СтатусЗагрузки" id="51">
<Type>
<v8:Type>String</v8:Type>
</Type>
</Attribute>
<Attribute name="Объект" id="1">
<Type>
<v8:Type>cfg:DataProcessorObject.ЗагрузкаДанныхИзExcel</v8:Type>
</Type>
<MainAttribute
</Attribute>
</Attributes> </Attributes>
<Commands> <Commands>
<Command name="ВыбратьФайл" id="1"> <Command name="ВыбратьФайл" id="1">
@@ -25,6 +25,11 @@
Сообщить("Выберите файл!"); Сообщить("Выберите файл!");
Возврат; Возврат;
КонецЕсли; КонецЕсли;
Состояние("Инициализация загрузки...");
Прогресс = 0;
СтатусЗагрузки = "Подготовка...";
ПрочитатьExcelНаКлиенте(); ПрочитатьExcelНаКлиенте();
КонецПроцедуры КонецПроцедуры
@@ -44,7 +49,6 @@
&НаКлиенте &НаКлиенте
Функция ПрочитатьЯчейку(Лист, Строка, Колонка, ФИО, ВидДанных) Функция ПрочитатьЯчейку(Лист, Строка, Колонка, ФИО, ВидДанных)
Попытка Попытка
Значение = Лист.Cells(Строка, Колонка).Value; Значение = Лист.Cells(Строка, Колонка).Value;
Если Значение = Неопределено ИЛИ Значение = "" Тогда Если Значение = Неопределено ИЛИ Значение = "" Тогда
@@ -52,42 +56,46 @@
КонецЕсли; КонецЕсли;
Возврат Число(Значение); Возврат Число(Значение);
Исключение Исключение
Сообщить("Ошибка чтения ячейки: " + ФИО + " | " + ВидДанных Сообщить("Ошибка: " + ФИО + " | " + ВидДанных
+ " | строка " + Строка + " колонка " + Колонка + " | строка " + Строка + " колонка " + Колонка
+ " | значение: """ + Значение + """ | " + ОписаниеОшибки()); + " | значение: """ + Значение + """ | " + ОписаниеОшибки());
Возврат 0; Возврат 0;
КонецПопытки; КонецПопытки;
КонецФункции КонецФункции
&НаКлиенте &НаКлиенте
Функция ПрочитатьСтроку(Лист, Строка, Колонка) Функция ПрочитатьСтроку(Лист, Строка, Колонка)
Попытка Попытка
Значение = Лист.Cells(Строка, Колонка).Value; Значение = Лист.Cells(Строка, Колонка).Value;
Если Значение = Неопределено Тогда Если Значение = Неопределено Тогда Возврат ""; КонецЕсли;
Возврат "";
КонецЕсли;
Возврат СокрЛП("" + Значение); Возврат СокрЛП("" + Значение);
Исключение Исключение
Возврат ""; Возврат "";
КонецПопытки; КонецПопытки;
КонецФункции КонецФункции
&НаКлиенте &НаКлиенте
Процедура ПрочитатьExcelНаКлиенте() Процедура ПрочитатьExcelНаКлиенте()
Попытка Попытка
СтатусЗагрузки = "Копирование файла...";
Прогресс = 5;
ВременныйФайл = КаталогВременныхФайлов() + "temp_data.xls"; ВременныйФайл = КаталогВременныхФайлов() + "temp_data.xls";
КопироватьФайл(Объект.ПутьКФайлу, ВременныйФайл); КопироватьФайл(Объект.ПутьКФайлу, ВременныйФайл);
СтатусЗагрузки = "Открытие Excel...";
Прогресс = 10;
Excel = Новый COMОбъект("Excel.Application"); Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь; Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь; Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open(ВременныйФайл); Книга = Excel.Workbooks.Open(ВременныйФайл);
СтатусЗагрузки = "Поиск листа 'Расчет'...";
Прогресс = 15;
ЛистРасчет = Неопределено; ЛистРасчет = Неопределено;
Для Каждого Лист Из Книга.Sheets Цикл Для Каждого Лист Из Книга.Sheets Цикл
Если ВРег(Лист.Name) = "РАСЧЕТ" Тогда Если ВРег(Лист.Name) = "РАСЧЕТ" Тогда
@@ -101,29 +109,46 @@
Книга.Close(Ложь); Книга.Close(Ложь);
Excel.Quit(); Excel.Quit();
УдалитьФайлы(ВременныйФайл); УдалитьФайлы(ВременныйФайл);
СтатусЗагрузки = "Ошибка: лист не найден";
Прогресс = 0;
Возврат; Возврат;
КонецЕсли; КонецЕсли;
СтатусЗагрузки = "Определение месяца...";
Прогресс = 20;
МесяцЗначение = ЛистРасчет.Cells(4, 1).Value; МесяцЗначение = ЛистРасчет.Cells(4, 1).Value;
Если ЗначениеЗаполнено(МесяцЗначение) Тогда Если ЗначениеЗаполнено(МесяцЗначение) Тогда
Попытка Попытка
Объект.МесяцЗагрузки = Число(МесяцЗначение); Объект.МесяцЗагрузки = Число(МесяцЗначение);
Исключение Исключение
Сообщить("Не удалось определить месяц из ячейки A4: " + МесяцЗначение); Сообщить("Не удалось определить месяц: " + МесяцЗначение);
КонецПопытки; КонецПопытки;
КонецЕсли; КонецЕсли;
СтатусЗагрузки = "Подсчет строк...";
Прогресс = 25;
ПоследняяСтрока = ЛистРасчет.Cells(1000, 1).End(-4121).Row; ПоследняяСтрока = ЛистРасчет.Cells(1000, 1).End(-4121).Row;
ВсегоСтрок = ПоследняяСтрока - 16;
МассивДанных = Новый Массив; МассивДанных = Новый Массив;
МассивВзносов = Новый Массив; МассивВзносов = Новый Массив;
СтатусЗагрузки = "Чтение данных...";
Для Ном = 16 По ПоследняяСтрока Цикл Для Ном = 16 По ПоследняяСтрока Цикл
// Обновление прогресса
Прогресс = 25 + 65 * (Ном - 16) / Макс(ВсегоСтрок, 1);
ФИО = ПрочитатьСтроку(ЛистРасчет, Ном, 1); ФИО = ПрочитатьСтроку(ЛистРасчет, Ном, 1);
Если Не ЗначениеЗаполнено(ФИО) Тогда Продолжить; КонецЕсли; Если Не ЗначениеЗаполнено(ФИО) Тогда Продолжить; КонецЕсли;
Если СтрНачинаетсяС(ВРег(ФИО), "ИТОГО") Тогда Продолжить; КонецЕсли; Если СтрНачинаетсяС(ВРег(ФИО), "ИТОГО") Тогда Продолжить; КонецЕсли;
// Статус: загрузка расчетов
СтатусЗагрузки = "Расчет ЗП: " + ФИО + " (строка " + Ном + "/" + ПоследняяСтрока + ")";
Строка = Новый Структура; Строка = Новый Структура;
Строка.Вставить("ФИО", ФИО); Строка.Вставить("ФИО", ФИО);
Строка.Вставить("Должность", ПрочитатьСтроку(ЛистРасчет, Ном, 2)); Строка.Вставить("Должность", ПрочитатьСтроку(ЛистРасчет, Ном, 2));
@@ -138,13 +163,15 @@
Строка.Вставить("ВсегоНаРуки", ПрочитатьЯчейку(ЛистРасчет, Ном, 55, ФИО, "Всего на руки")); Строка.Вставить("ВсегоНаРуки", ПрочитатьЯчейку(ЛистРасчет, Ном, 55, ФИО, "Всего на руки"));
МассивДанных.Добавить(Строка); МассивДанных.Добавить(Строка);
СВ = ПрочитатьЯчейку(ЛистРасчет, Ном, 63, ФИО, "Страховые взносы итого"); // Страховые взносы
СтатусЗагрузки = "Страховые взносы: " + ФИО;
СВ = ПрочитатьЯчейку(ЛистРасчет, Ном, 63, ФИО, "СВ итого");
Если СВ > 0 Тогда Если СВ > 0 Тогда
СтрВзносов = Новый Структура; СтрВзносов = Новый Структура;
СтрВзносов.Вставить("ФИО", ФИО); СтрВзносов.Вставить("ФИО", ФИО);
СтрВзносов.Вставить("ДТ6Процент", ПрочитатьЯчейку(ЛистРасчет, Ном, 58, ФИО, "ДТ 6%")); СтрВзносов.Вставить("ДТ6Процент", ПрочитатьЯчейку(ЛистРасчет, Ном, 58, ФИО, "ДТ 6%"));
СтрВзносов.Вставить("ДТ4Процент", ПрочитатьЯчейку(ЛистРасчет, Ном, 59, ФИО, "ДТ 4%")); СтрВзносов.Вставить("ДТ4Процент", ПрочитатьЯчейку(ЛистРасчет, Ном, 59, ФИО, "ДТ 4%"));
СтрВзносов.Вставить("ПФСтраховая", ПрочитатьЯчейку(ЛистРасчет, Ном, 60, ФИО, "ПФ страховая")); СтрВзносов.Вставить("ПФСтраховая", ПрочитатьЯчейку(ЛистРасчет, Ном, 60, ФИО, "ПФ"));
СтрВзносов.Вставить("ФССФОМС", ПрочитатьЯчейку(ЛистРасчет, Ном, 61, ФИО, "ФСС/ФОМС")); СтрВзносов.Вставить("ФССФОМС", ПрочитатьЯчейку(ЛистРасчет, Ном, 61, ФИО, "ФСС/ФОМС"));
СтрВзносов.Вставить("НСПЗ", ПрочитатьЯчейку(ЛистРасчет, Ном, 62, ФИО, "НС и ПЗ")); СтрВзносов.Вставить("НСПЗ", ПрочитатьЯчейку(ЛистРасчет, Ном, 62, ФИО, "НС и ПЗ"));
СтрВзносов.Вставить("Итого", СВ); СтрВзносов.Вставить("Итого", СВ);
@@ -153,16 +180,26 @@
КонецЦикла; КонецЦикла;
СтатусЗагрузки = "Закрытие Excel...";
Прогресс = 95;
Книга.Close(Ложь); Книга.Close(Ложь);
Excel.Quit(); Excel.Quit();
УдалитьФайлы(ВременныйФайл); УдалитьФайлы(ВременныйФайл);
СтатусЗагрузки = "Передача данных на сервер...";
Прогресс = 98;
ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов); ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов);
Сообщить("Загружено сотрудников: " + МассивДанных.Количество()); Прогресс = 100;
СтатусЗагрузки = "Готово! Загружено: " + МассивДанных.Количество() + " сотрудников";
Сообщить(СтатусЗагрузки);
Исключение Исключение
Сообщить("Ошибка чтения Excel: " + ОписаниеОшибки()); Сообщить("Ошибка чтения Excel: " + ОписаниеОшибки());
СтатусЗагрузки = "Ошибка: " + ОписаниеОшибки();
Прогресс = 0;
КонецПопытки; КонецПопытки;
КонецПроцедуры КонецПроцедуры
@@ -177,7 +214,6 @@
&НаСервере &НаСервере
Процедура ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов) Процедура ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов)
ТЗРасчет = РеквизитФормыВЗначение("Объект.ДанныеРасчетаЗП"); ТЗРасчет = РеквизитФормыВЗначение("Объект.ДанныеРасчетаЗП");
ТЗРасчет.Очистить(); ТЗРасчет.Очистить();
Для Каждого Эл Из МассивДанных Цикл Для Каждого Эл Из МассивДанных Цикл
@@ -193,17 +229,14 @@
ЗаполнитьЗначенияСвойств(Строка, Эл); ЗаполнитьЗначенияСвойств(Строка, Эл);
КонецЦикла; КонецЦикла;
ЗначениеВРеквизитФормы(ТЗВзносы, "Объект.ДанныеСтраховыхВзносов"); ЗначениеВРеквизитФормы(ТЗВзносы, "Объект.ДанныеСтраховыхВзносов");
КонецПроцедуры КонецПроцедуры
&НаСервере &НаСервере
Процедура ЗаписатьДанныеНаСервере() Процедура ЗаписатьДанныеНаСервере()
ГодЗагрузки = ТекущаяДата().Год(); ГодЗагрузки = ТекущаяДата().Год();
Период = Дата(ГодЗагрузки, Объект.МесяцЗагрузки, 1); Период = Дата(ГодЗагрузки, Объект.МесяцЗагрузки, 1);
ТЗРасчет = РеквизитФормыВЗначение("Объект.ДанныеРасчетаЗП"); ТЗРасчет = РеквизитФормыВЗначение("Объект.ДанныеРасчетаЗП");
Объект.ЗаписатьДанныеРасчета(ТЗРасчет, Период); Объект.ЗаписатьДанныеРасчета(ТЗРасчет, Период);
ТЗВзносы = РеквизитФормыВЗначение("Объект.ДанныеСтраховыхВзносов"); ТЗВзносы = РеквизитФормыВЗначение("Объект.ДанныеСтраховыхВзносов");
Если ТЗВзносы.Количество() > 0 Тогда Если ТЗВзносы.Количество() > 0 Тогда
Объект.ЗаписатьДанныеСтраховыхВзносов(ТЗВзносы, Период); Объект.ЗаписатьДанныеСтраховыхВзносов(ТЗВзносы, Период);