Files
zagruzka-dannyh-iz-excel/DataProcessors/ЗагрузкаДанныхИзExcel/Ext/ObjectModule.bsl
T

277 lines
17 KiB
Plaintext
Executable File

#Область ОписаниеПеременных
Перем ДанныеФайла;
Перем СоответствиеСотрудников;
Перем СоответствиеСтатейФинансирования;
#КонецОбласти
#Область ПрограммныйИнтерфейс
// Получение данных из Excel файла
Функция ПолучитьДанныеИзExcel(ПутьКФайлу) Экспорт
Результат = Новый Структура("ДанныеРасчетаЗП, ДанныеСтраховыхВзносов, Ошибки");
Результат.ДанныеРасчетаЗП = Новый ТаблицаЗначений;
Результат.ДанныеСтраховыхВзносов = Новый ТаблицаЗначений;
Результат.Ошибки = Новый Массив;
Попытка
// Создание COM-соединения с Excel
ExcelПриложение = Новый COMОбъект("Excel.Application");
ExcelПриложение.Visible = Ложь;
ExcelПриложение.DisplayAlerts = Ложь;
// Открытие файла
РабочаяКнига = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
// Получение листа "Расчет"
ЛистРасчет = Неопределено;
Для Каждого Лист Из РабочаяКнига.Sheets Цикл
Если ВРег(Лист.Name) = "РАСЧЕТ" Тогда
ЛистРасчет = Лист;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЛистРасчет = Неопределено Тогда
Результат.Ошибки.Добавить("Лист 'Расчет' не найден в файле");
Возврат Результат;
КонецЕсли;
// Определение месяца из ячейки A4 (номер месяца) или строки заголовка
МесяцЗначение = ЛистРасчет.Cells(4, 1).Value;
Если Не ЗначениеЗаполнено(МесяцЗначение) Тогда
Результат.Ошибки.Добавить("Месяц не определен (ячейка A4 пуста)");
Возврат Результат;
КонецЕсли;
МесяцЗагрузки = Число(МесяцЗначение);
Если МесяцЗагрузки < 1 Или МесяцЗагрузки > 12 Тогда
Результат.Ошибки.Добавить("Некорректный номер месяца: " + МесяцЗначение);
Возврат Результат;
КонецЕсли;
// Чтение данных из листа "Расчет"
ПрочитатьДанныеРасчета(ЛистРасчет, Результат);
// Закрытие Excel
РабочаяКнига.Close(Ложь);
ExcelПриложение.Quit();
Исключение
Результат.Ошибки.Добавить("Ошибка чтения файла: " + ОписаниеОшибки());
КонецПопытки;
Возврат Результат;
КонецФункции
// Сопоставление сотрудника
Функция НайтиСотрудника(ФИО, ТабельныйНомер, Должность, ВидЗанятости) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Сотрудники.Ссылка КАК Сотрудник
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица
| ПО Сотрудники.ФизическоеЛицо = ФизическиеЛица.Ссылка
|ГДЕ
| ФизическиеЛица.ФИО = &ФИО
| И Сотрудники.Код = &ТабельныйНомер";
Запрос.УстановитьПараметр("ФИО", ФИО);
Запрос.УстановитьПараметр("ТабельныйНомер", ТабельныйНомер);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.Сотрудник;
КонецФункции
// Запись данных расчета ЗП
Процедура ЗаписатьДанныеРасчета(Данные, Период) Экспорт
ДокументОбъект = Документы.ПереносДанных.СоздатьДокумент();
ДокументОбъект.Дата = Период;
ДокументОбъект.Комментарий = "Загрузка расчета ЗП из Excel за " + Формат(Период, "ДФ='ММММ yyyy'");
Для Каждого СтрокаДанных Из Данные Цикл
// Движение по регистру НачисленияУдержанияПоСотрудникам
Движение = ДокументОбъект.Движения.НачисленияУдержанияПоСотрудникам.Добавить();
Движение.Сотрудник = СтрокаДанных.Сотрудник;
Движение.ФизическоеЛицо = СтрокаДанных.Сотрудник.ФизическоеЛицо;
Движение.Период = Период;
Движение.НачислениеУдержание = ПланыВидовРасчета.Начисления.ОкладПоЧасам;
Движение.Сумма = СтрокаДанных.ИтогоНачислено;
КонецЦикла;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
// Запись данных страховых взносов
Процедура ЗаписатьДанныеСтраховыхВзносов(Данные, Период) Экспорт
ДокументОбъект = Документы.ПереносДанных.СоздатьДокумент();
ДокументОбъект.Дата = Период;
ДокументОбъект.Комментарий = "Загрузка страховых взносов из Excel";
Для Каждого СтрокаДанных Из Данные Цикл
Движение = ДокументОбъект.Движения.ИсчисленныеСтраховыеВзносы.Добавить();
Движение.Сотрудник = СтрокаДанных.Сотрудник;
Движение.Период = Период;
Движение.ВидВзноса = СтрокаДанных.ВидВзноса;
Движение.Сумма = СтрокаДанных.Сумма;
КонецЦикла;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Чтение данных из листа "Расчет"
Процедура ПрочитатьДанныеРасчета(ЛистРасчет, Результат)
// Определение последней строки данных
ПоследняяСтрока = ЛистРасчет.Cells(1, 1).End(-4121).Row; // xlDown
// Чтение данных начиная со строки 16 (данные сотрудников)
Для НомерСтроки = 16 По ПоследняяСтрока Цикл
ФИО = ЛистРасчет.Cells(НомерСтроки, 1).Value;
Если Не ЗначениеЗаполнено(ФИО) Тогда
Продолжить;
КонецЕсли;
// Пропуск строк итогов
Если СтрНачинаетсяС(ВРег(СокрЛП(ФИО)), "ИТОГО") Тогда
Продолжить;
КонецЕсли;
// Чтение данных сотрудника
Должность = ЛистРасчет.Cells(НомерСтроки, 2).Value;
СчетБК = ЛистРасчет.Cells(НомерСтроки, 3).Value;
ВидЗанятости = ЛистРасчет.Cells(НомерСтроки, 4).Value;
ЧасоваяНорма = ЛистРасчет.Cells(НомерСтроки, 5).Value;
ОтработаноДней = ЛистРасчет.Cells(НомерСтроки, 6).Value;
КоличествоСтавок = ЛистРасчет.Cells(НомерСтроки, 7).Value;
Оклад = ЛистРасчет.Cells(НомерСтроки, 8).Value;
// Доплаты и надбавки
ЧасыДежурства = ЛистРасчет.Cells(НомерСтроки, 9).Value;
ЧасыНочные = ЛистРасчет.Cells(НомерСтроки, 10).Value;
ЧасыПраздничные = ЛистРасчет.Cells(НомерСтроки, 11).Value;
РабочиеЧасыПоТабелю = ЛистРасчет.Cells(НомерСтроки, 12).Value;
ИзРасчетаМесОкладаДни = ЛистРасчет.Cells(НомерСтроки, 13).Value;
ДоплатаСовместительство = ЛистРасчет.Cells(НомерСтроки, 14).Value;
ДоплатаСовмещение = ЛистРасчет.Cells(НомерСтроки, 15).Value;
ДоплатаИнтенсивность = ЛистРасчет.Cells(НомерСтроки, 16).Value;
ИзРасчетаМесОкладаЧасы = ЛистРасчет.Cells(НомерСтроки, 17).Value;
ДоплатаНочные = ЛистРасчет.Cells(НомерСтроки, 18).Value;
ДоплатаПраздничные = ЛистРасчет.Cells(НомерСтроки, 19).Value;
ЗаСтаж = ЛистРасчет.Cells(НомерСтроки, 20).Value;
НадбавкаЗаКатегорию = ЛистРасчет.Cells(НомерСтроки, 21).Value;
НадбавкаЗаВредность = ЛистРасчет.Cells(НомерСтроки, 22).Value;
ПовышающийКоэффициент = ЛистРасчет.Cells(НомерСтроки, 23).Value;
СтимулирующиеВыплаты = ЛистРасчет.Cells(НомерСтроки, 24).Value;
СтимулирующаяНадбавка = ЛистРасчет.Cells(НомерСтроки, 25).Value;
РайонныйКоэффициент = ЛистРасчет.Cells(НомерСтроки, 26).Value;
ВыплатыПоУказу597 = ЛистРасчет.Cells(НомерСтроки, 27).Value;
ПремияРазовая = ЛистРасчет.Cells(НомерСтроки, 28).Value;
БольничныйЛист = ЛистРасчет.Cells(НомерСтроки, 29).Value;
ДоплатаПрофактиву = ЛистРасчет.Cells(НомерСтроки, 30).Value;
Пусковые = ЛистРасчет.Cells(НомерСтроки, 31).Value;
Отпуск = ЛистРасчет.Cells(НомерСтроки, 32).Value;
КомпенсацияОтпуск = ЛистРасчет.Cells(НомерСтроки, 33).Value;
Прочие = ЛистРасчет.Cells(НомерСтроки, 34).Value;
ВыходноеПособие = ЛистРасчет.Cells(НомерСтроки, 35).Value;
ПособиеПоУходу = ЛистРасчет.Cells(НомерСтроки, 36).Value;
ДоплатаДоМРОТ = ЛистРасчет.Cells(НомерСтроки, 37).Value;
Родовые = ЛистРасчет.Cells(НомерСтроки, 38).Value;
// Итоговые суммы
ИтогоНачислено = ЛистРасчет.Cells(НомерСтроки, 39).Value;
НДФЛ = ЛистРасчет.Cells(НомерСтроки, 40).Value;
ПрофВзнос = ЛистРасчет.Cells(НомерСтроки, 41).Value;
Исполнительные = ЛистРасчет.Cells(НомерСтроки, 42).Value;
Аванс = ЛистРасчет.Cells(НомерСтроки, 43).Value;
ПФСофинансирование = ЛистРасчет.Cells(НомерСтроки, 44).Value;
ПремияУд = ЛистРасчет.Cells(НомерСтроки, 45).Value;
Касса1 = ЛистРасчет.Cells(НомерСтроки, 46).Value;
Касса2 = ЛистРасчет.Cells(НомерСтроки, 47).Value;
Касса3 = ЛистРасчет.Cells(НомерСтроки, 48).Value;
ПособиеДо3Лет = ЛистРасчет.Cells(НомерСтроки, 49).Value;
Безналичные = ЛистРасчет.Cells(НомерСтроки, 50).Value;
ВозвратВКассу = ЛистРасчет.Cells(НомерСтроки, 51).Value;
Депонент = ЛистРасчет.Cells(НомерСтроки, 52).Value;
ИтогоУдержано = ЛистРасчет.Cells(НомерСтроки, 53).Value;
ОстатокНаНачало = ЛистРасчет.Cells(НомерСтроки, 54).Value;
ВсегоНаРуки = ЛистРасчет.Cells(НомерСтроки, 55).Value;
// Страховые взносы
ДТ6Процент = ЛистРасчет.Cells(НомерСтроки, 58).Value;
ДТ4Процент = ЛистРасчет.Cells(НомерСтроки, 59).Value;
ПФСтраховая = ЛистРасчет.Cells(НомерСтроки, 60).Value;
ФССФОМС = ЛистРасчет.Cells(НомерСтроки, 61).Value;
НСПЗ = ЛистРасчет.Cells(НомерСтроки, 62).Value;
СВИтого = ЛистРасчет.Cells(НомерСтроки, 63).Value;
// Сопоставление сотрудника
Сотрудник = НайтиСотрудника(ФИО, "", Должность, ВидЗанятости);
Если Сотрудник = Неопределено Тогда
Результат.Ошибки.Добавить("Сотрудник не найден: " + ФИО);
Продолжить;
КонецЕсли;
// Добавление строки в таблицу расчета ЗП
СтрокаДанных = Результат.ДанныеРасчетаЗП.Добавить();
СтрокаДанных.Сотрудник = Сотрудник;
СтрокаДанных.ФИО = ФИО;
СтрокаДанных.Должность = Должность;
СтрокаДанных.СчетБК = СчетБК;
СтрокаДанных.ВидЗанятости = ВидЗанятости;
СтрокаДанных.Оклад = Оклад;
СтрокаДанных.КоличествоСтавок = КоличествоСтавок;
СтрокаДанных.ОтработаноДней = ОтработаноДней;
СтрокаДанных.ИтогоНачислено = ИтогоНачислено;
СтрокаДанных.НДФЛ = НДФЛ;
СтрокаДанных.ИтогоУдержано = ИтогоУдержано;
СтрокаДанных.ВсегоНаРуки = ВсегоНаРуки;
// Добавление строки в таблицу страховых взносов
Если ЗначениеЗаполнено(СВИтого) И СВИтого > 0 Тогда
СтрокаВзносов = Результат.ДанныеСтраховыхВзносов.Добавить();
СтрокаВзносов.Сотрудник = Сотрудник;
СтрокаВзносов.ФИО = ФИО;
СтрокаВзносов.ДТ6Процент = ДТ6Процент;
СтрокаВзносов.ДТ4Процент = ДТ4Процент;
СтрокаВзносов.ПФСтраховая = ПФСтраховая;
СтрокаВзносов.ФССФОМС = ФССФОМС;
СтрокаВзносов.НСПЗ = НСПЗ;
СтрокаВзносов.Итого = СВИтого;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти