v3.0.0.1: Initial release - загрузка данных из Excel
This commit is contained in:
@@ -0,0 +1,213 @@
|
||||
#Область ОбработчикиСобытийФормы
|
||||
|
||||
&НаСервере
|
||||
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
|
||||
ИнициализироватьТаблицы();
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область ОбработчикиКоманд
|
||||
|
||||
&НаКлиенте
|
||||
Процедура ВыбратьФайл(Команда)
|
||||
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
|
||||
Диалог.МножественныйВыбор = Ложь;
|
||||
Диалог.Фильтр = "Excel файлы (*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm";
|
||||
Если Диалог.Выбрать() Тогда
|
||||
Объект.ПутьКФайлу = Диалог.ПолноеИмяФайла;
|
||||
КонецЕсли;
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Процедура ЗагрузитьДанные(Команда)
|
||||
Если Не ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
|
||||
Сообщить("Выберите файл!");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
ПрочитатьExcelНаКлиенте();
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Процедура ЗаписатьДанные(Команда)
|
||||
Если Объект.ДанныеРасчетаЗП.Количество() = 0 Тогда
|
||||
Сообщить("Нет данных для записи!");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
ЗаписатьДанныеНаСервере();
|
||||
Сообщить("Данные записаны!");
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область РаботаСExcel
|
||||
|
||||
&НаКлиенте
|
||||
Функция ПрочитатьЯчейку(Лист, Строка, Колонка, ФИО, ВидДанных)
|
||||
|
||||
Попытка
|
||||
Значение = Лист.Cells(Строка, Колонка).Value;
|
||||
Если Значение = Неопределено ИЛИ Значение = "" Тогда
|
||||
Возврат 0;
|
||||
КонецЕсли;
|
||||
Возврат Число(Значение);
|
||||
Исключение
|
||||
Сообщить("Ошибка чтения ячейки: " + ФИО + " | " + ВидДанных
|
||||
+ " | строка " + Строка + " колонка " + Колонка
|
||||
+ " | значение: """ + Значение + """ | " + ОписаниеОшибки());
|
||||
Возврат 0;
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Функция ПрочитатьСтроку(Лист, Строка, Колонка)
|
||||
|
||||
Попытка
|
||||
Значение = Лист.Cells(Строка, Колонка).Value;
|
||||
Если Значение = Неопределено Тогда
|
||||
Возврат "";
|
||||
КонецЕсли;
|
||||
Возврат СокрЛП("" + Значение);
|
||||
Исключение
|
||||
Возврат "";
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Процедура ПрочитатьExcelНаКлиенте()
|
||||
|
||||
Попытка
|
||||
ВременныйФайл = КаталогВременныхФайлов() + "temp_data.xls";
|
||||
КопироватьФайл(Объект.ПутьКФайлу, ВременныйФайл);
|
||||
|
||||
Excel = Новый COMОбъект("Excel.Application");
|
||||
Excel.Visible = Ложь;
|
||||
Excel.DisplayAlerts = Ложь;
|
||||
|
||||
Книга = Excel.Workbooks.Open(ВременныйФайл);
|
||||
|
||||
ЛистРасчет = Неопределено;
|
||||
Для Каждого Лист Из Книга.Sheets Цикл
|
||||
Если ВРег(Лист.Name) = "РАСЧЕТ" Тогда
|
||||
ЛистРасчет = Лист;
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Если ЛистРасчет = Неопределено Тогда
|
||||
Сообщить("Лист 'Расчет' не найден!");
|
||||
Книга.Close(Ложь);
|
||||
Excel.Quit();
|
||||
УдалитьФайлы(ВременныйФайл);
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
МесяцЗначение = ЛистРасчет.Cells(4, 1).Value;
|
||||
Если ЗначениеЗаполнено(МесяцЗначение) Тогда
|
||||
Попытка
|
||||
Объект.МесяцЗагрузки = Число(МесяцЗначение);
|
||||
Исключение
|
||||
Сообщить("Не удалось определить месяц из ячейки A4: " + МесяцЗначение);
|
||||
КонецПопытки;
|
||||
КонецЕсли;
|
||||
|
||||
ПоследняяСтрока = ЛистРасчет.Cells(1000, 1).End(-4121).Row;
|
||||
|
||||
МассивДанных = Новый Массив;
|
||||
МассивВзносов = Новый Массив;
|
||||
|
||||
Для Ном = 16 По ПоследняяСтрока Цикл
|
||||
|
||||
ФИО = ПрочитатьСтроку(ЛистРасчет, Ном, 1);
|
||||
Если Не ЗначениеЗаполнено(ФИО) Тогда Продолжить; КонецЕсли;
|
||||
Если СтрНачинаетсяС(ВРег(ФИО), "ИТОГО") Тогда Продолжить; КонецЕсли;
|
||||
|
||||
Строка = Новый Структура;
|
||||
Строка.Вставить("ФИО", ФИО);
|
||||
Строка.Вставить("Должность", ПрочитатьСтроку(ЛистРасчет, Ном, 2));
|
||||
Строка.Вставить("СчетБК", ПрочитатьСтроку(ЛистРасчет, Ном, 3));
|
||||
Строка.Вставить("ВидЗанятости", ПрочитатьСтроку(ЛистРасчет, Ном, 4));
|
||||
Строка.Вставить("Оклад", ПрочитатьЯчейку(ЛистРасчет, Ном, 8, ФИО, "Оклад"));
|
||||
Строка.Вставить("КоличествоСтавок", ПрочитатьЯчейку(ЛистРасчет, Ном, 7, ФИО, "Кол-во ставок"));
|
||||
Строка.Вставить("ОтработаноДней", ПрочитатьЯчейку(ЛистРасчет, Ном, 6, ФИО, "Отработано дней"));
|
||||
Строка.Вставить("ИтогоНачислено", ПрочитатьЯчейку(ЛистРасчет, Ном, 39, ФИО, "Итого начислено"));
|
||||
Строка.Вставить("НДФЛ", ПрочитатьЯчейку(ЛистРасчет, Ном, 40, ФИО, "НДФЛ"));
|
||||
Строка.Вставить("ИтогоУдержано", ПрочитатьЯчейку(ЛистРасчет, Ном, 53, ФИО, "Итого удержано"));
|
||||
Строка.Вставить("ВсегоНаРуки", ПрочитатьЯчейку(ЛистРасчет, Ном, 55, ФИО, "Всего на руки"));
|
||||
МассивДанных.Добавить(Строка);
|
||||
|
||||
СВ = ПрочитатьЯчейку(ЛистРасчет, Ном, 63, ФИО, "Страховые взносы итого");
|
||||
Если СВ > 0 Тогда
|
||||
СтрВзносов = Новый Структура;
|
||||
СтрВзносов.Вставить("ФИО", ФИО);
|
||||
СтрВзносов.Вставить("ДТ6Процент", ПрочитатьЯчейку(ЛистРасчет, Ном, 58, ФИО, "ДТ 6%"));
|
||||
СтрВзносов.Вставить("ДТ4Процент", ПрочитатьЯчейку(ЛистРасчет, Ном, 59, ФИО, "ДТ 4%"));
|
||||
СтрВзносов.Вставить("ПФСтраховая", ПрочитатьЯчейку(ЛистРасчет, Ном, 60, ФИО, "ПФ страховая"));
|
||||
СтрВзносов.Вставить("ФССФОМС", ПрочитатьЯчейку(ЛистРасчет, Ном, 61, ФИО, "ФСС/ФОМС"));
|
||||
СтрВзносов.Вставить("НСПЗ", ПрочитатьЯчейку(ЛистРасчет, Ном, 62, ФИО, "НС и ПЗ"));
|
||||
СтрВзносов.Вставить("Итого", СВ);
|
||||
МассивВзносов.Добавить(СтрВзносов);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Книга.Close(Ложь);
|
||||
Excel.Quit();
|
||||
УдалитьФайлы(ВременныйФайл);
|
||||
|
||||
ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов);
|
||||
|
||||
Сообщить("Загружено сотрудников: " + МассивДанных.Количество());
|
||||
|
||||
Исключение
|
||||
Сообщить("Ошибка чтения Excel: " + ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СерверныеПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Процедура ИнициализироватьТаблицы()
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Процедура ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов)
|
||||
|
||||
ТЗРасчет = РеквизитФормыВЗначение("Объект.ДанныеРасчетаЗП");
|
||||
ТЗРасчет.Очистить();
|
||||
Для Каждого Эл Из МассивДанных Цикл
|
||||
Строка = ТЗРасчет.Добавить();
|
||||
ЗаполнитьЗначенияСвойств(Строка, Эл);
|
||||
КонецЦикла;
|
||||
ЗначениеВРеквизитФормы(ТЗРасчет, "Объект.ДанныеРасчетаЗП");
|
||||
|
||||
ТЗВзносы = РеквизитФормыВЗначение("Объект.ДанныеСтраховыхВзносов");
|
||||
ТЗВзносы.Очистить();
|
||||
Для Каждого Эл Из МассивВзносов Цикл
|
||||
Строка = ТЗВзносы.Добавить();
|
||||
ЗаполнитьЗначенияСвойств(Строка, Эл);
|
||||
КонецЦикла;
|
||||
ЗначениеВРеквизитФормы(ТЗВзносы, "Объект.ДанныеСтраховыхВзносов");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Процедура ЗаписатьДанныеНаСервере()
|
||||
ГодЗагрузки = ТекущаяДата().Год();
|
||||
Период = Дата(ГодЗагрузки, Объект.МесяцЗагрузки, 1);
|
||||
|
||||
ТЗРасчет = РеквизитФормыВЗначение("Объект.ДанныеРасчетаЗП");
|
||||
Объект.ЗаписатьДанныеРасчета(ТЗРасчет, Период);
|
||||
|
||||
ТЗВзносы = РеквизитФормыВЗначение("Объект.ДанныеСтраховыхВзносов");
|
||||
Если ТЗВзносы.Количество() > 0 Тогда
|
||||
Объект.ЗаписатьДанныеСтраховыхВзносов(ТЗВзносы, Период);
|
||||
КонецЕсли;
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
Reference in New Issue
Block a user