277 lines
17 KiB
Plaintext
Executable File
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Процент;
|
|
СтрокаВзносов.ПФСтраховая = ПФСтраховая;
|
|
СтрокаВзносов.ФССФОМС = ФССФОМС;
|
|
СтрокаВзносов.НСПЗ = НСПЗ;
|
|
СтрокаВзносов.Итого = СВИтого;
|
|
КонецЕсли;
|
|
|
|
КонецЦикла;
|
|
|
|
КонецПроцедуры
|
|
|
|
#КонецОбласти
|