v3.0.0.4: Динамические заголовки, личные данные, исправление формы, DDD-рефакторинг

This commit is contained in:
Профи-Софт
2026-07-07 18:06:52 +00:00
parent 29915573b3
commit 311969db49
6 changed files with 118 additions and 19 deletions
@@ -26,7 +26,7 @@
Возврат;
КонецЕсли;
Состояние("Инициализация загрузки...");
Состояние("Инициализация загрузки...", 0);
Прогресс = 0;
СтатусЗагрузки = "Подготовка...";
@@ -74,18 +74,28 @@
КонецПопытки;
КонецФункции
&НаКлиенте
Функция ИзвлечьЗначениеИзТекста(Текст, Префикс)
Если Не ЗначениеЗаполнено(Текст) Тогда Возврат ""; КонецЕсли;
Позиция = СтрНайти(ВРег(Текст), ВРег(Префикс));
Если Позиция = 0 Тогда Возврат СокрЛП(Текст); КонецЕсли;
Возврат СокрЛП(Сред(Текст, Позиция + СтрДлина(Префикс)));
КонецФункции
&НаКлиенте
Процедура ПрочитатьExcelНаКлиенте()
Попытка
СтатусЗагрузки = "Копирование файла...";
Прогресс = 5;
Состояние("Копирование файла...", 5);
ВременныйФайл = КаталогВременныхФайлов() + "temp_data.xls";
КопироватьФайл(Объект.ПутьКФайлу, ВременныйФайл);
СтатусЗагрузки = "Открытие Excel...";
Прогресс = 10;
Состояние("Открытие Excel...", 10);
Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь;
@@ -95,6 +105,7 @@
СтатусЗагрузки = "Поиск листа 'Расчет'...";
Прогресс = 15;
Состояние("Поиск листа 'Расчет'...", 15);
ЛистРасчет = Неопределено;
Для Каждого Лист Из Книга.Sheets Цикл
@@ -110,12 +121,14 @@
Excel.Quit();
УдалитьФайлы(ВременныйФайл);
СтатусЗагрузки = "Ошибка: лист не найден";
Состояние("Ошибка: лист 'Расчет' не найден", 0);
Прогресс = 0;
Возврат;
КонецЕсли;
СтатусЗагрузки = "Определение месяца...";
Прогресс = 20;
Состояние("Определение месяца...", 20);
МесяцЗначение = ЛистРасчет.Cells(4, 1).Value;
Если ЗначениеЗаполнено(МесяцЗначение) Тогда
@@ -128,26 +141,39 @@
СтатусЗагрузки = "Подсчет строк...";
Прогресс = 25;
ПоследняяСтрока = ЛистРасчет.Cells(1000, 1).End(-4121).Row;
ВсегоСтрок = ПоследняяСтрока - 16;
Состояние("Подсчет строк...", 25);
МассивДанных = Новый Массив;
МассивВзносов = Новый Массив;
СтатусЗагрузки = "Чтение данных...";
Для Ном = 16 По ПоследняяСтрока Цикл
// Обновление прогресса
Прогресс = 25 + 65 * (Ном - 16) / Макс(ВсегоСтрок, 1);
ПустыхПодряд = 0;
МаксПустых = 5;
Ном = 16;
Пока Истина Цикл
ФИО = ПрочитатьСтроку(ЛистРасчет, Ном, 1);
Если Не ЗначениеЗаполнено(ФИО) Тогда Продолжить; КонецЕсли;
Если СтрНачинаетсяС(ВРег(ФИО), "ИТОГО") Тогда Продолжить; КонецЕсли;
Если Не ЗначениеЗаполнено(ФИО) Тогда
ПустыхПодряд = ПустыхПодряд + 1;
Если ПустыхПодряд >= МаксПустых Тогда
Прервать;
КонецЕсли;
Ном = Ном + 1;
Продолжить;
КонецЕсли;
ПустыхПодряд = 0;
Если СтрНачинаетсяС(ВРег(ФИО), "ИТОГО") Тогда
Прервать;
КонецЕсли;
// Статус: загрузка расчетов
СтатусЗагрузки = "Расчет ЗП: " + ФИО + " (строка " + Ном + "/" + ПоследняяСтрока + ")";
СтатусЗагрузки = "Расчет ЗП: " + ФИО + " (строка " + Ном + ")";
Состояние("Расчет ЗП: " + ФИО, 25 + 65 * (Ном - 16) / Макс(Ном, 1));
Строка = Новый Структура;
Строка.Вставить("ФИО", ФИО);
@@ -156,11 +182,33 @@
Строка.Вставить("ВидЗанятости", ПрочитатьСтроку(ЛистРасчет, Ном, 4));
Строка.Вставить("Оклад", ПрочитатьЯчейку(ЛистРасчет, Ном, 8, ФИО, "Оклад"));
Строка.Вставить("КоличествоСтавок", ПрочитатьЯчейку(ЛистРасчет, Ном, 7, ФИО, "Кол-во ставок"));
Строка.Вставить("ОтработаноДней", ПрочитатьЯчейку(ЛистРасчет, Ном, 6, ФИО, "Отработано дней"));
Строка.Вставить("ОтработаноДней", ПрочитатьЯчейку(ЛистРасчет, Ном, 6, ФИО, "ОтработаноДней"));
Строка.Вставить("ИтогоНачислено", ПрочитатьЯчейку(ЛистРасчет, Ном, 39, ФИО, "Итого начислено"));
Строка.Вставить("НДФЛ", ПрочитатьЯчейку(ЛистРасчет, Ном, 40, ФИО, "НДФЛ"));
Строка.Вставить("ИтогоУдержано", ПрочитатьЯчейку(ЛистРасчет, Ном, 53, ФИО, "Итого удержано"));
Строка.Вставить("ВсегоНаРуки", ПрочитатьЯчейку(ЛистРасчет, Ном, 55, ФИО, "Всего на руки"));
// Чтение личных данных из листа сотрудника
ЛистСотрудника = Неопределено;
Для Каждого Лист Из Книга.Sheets Цикл
Если ВРег(Лист.Name) = ВРег(ФИО) Тогда
ЛистСотрудника = Лист;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЛистСотрудника <> Неопределено Тогда
Строка.Вставить("ИНН", ИзвлечьЗначениеИзТекста(ПрочитатьСтроку(ЛистСотрудника, 0, 10), "ИНН"));
Строка.Вставить("СНИЛС", ИзвлечьЗначениеИзТекста(ПрочитатьСтроку(ЛистСотрудника, 1, 10), "СНИЛС"));
Строка.Вставить("Паспорт", ИзвлечьЗначениеИзТекста(ПрочитатьСтроку(ЛистСотрудника, 2, 10), "Паспорт"));
Строка.Вставить("Адрес", ПрочитатьСтроку(ЛистСотрудника, 3, 10));
Иначе
Строка.Вставить("ИНН", "");
Строка.Вставить("СНИЛС", "");
Строка.Вставить("Паспорт", "");
Строка.Вставить("Адрес", "");
КонецЕсли;
МассивДанных.Добавить(Строка);
// Страховые взносы
@@ -178,10 +226,13 @@
МассивВзносов.Добавить(СтрВзносов);
КонецЕсли;
Ном = Ном + 1;
КонецЦикла;
СтатусЗагрузки = "Закрытие Excel...";
Прогресс = 95;
Состояние("Закрытие Excel...", 95);
Книга.Close(Ложь);
Excel.Quit();
@@ -189,16 +240,23 @@
СтатусЗагрузки = "Передача данных на сервер...";
Прогресс = 98;
Состояние("Передача данных на сервер...", 98);
ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов);
// Обновление табличных частей на форме
Элементы.ТаблицаРасчетЗП.ОбновитьСтроки();
Элементы.ТаблицаСтраховыеВзносы.ОбновитьСтроки();
Прогресс = 100;
СтатусЗагрузки = "Готово! Загружено: " + МассивДанных.Количество() + " сотрудников";
Состояние("Готово! Загружено: " + МассивДанных.Количество() + " сотрудников", 100);
Сообщить(СтатусЗагрузки);
Исключение
Сообщить("Ошибка чтения Excel: " + ОписаниеОшибки());
СтатусЗагрузки = "Ошибка: " + ОписаниеОшибки();
Состояние("Ошибка: " + ОписаниеОшибки(), 0);
Прогресс = 0;
КонецПопытки;