#Область ОписаниеПеременных Перем ДанныеФайла; Перем СоответствиеСотрудников; Перем СоответствиеСтатейФинансирования; #КонецОбласти #Область ПрограммныйИнтерфейс // Получение данных из 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Процент; СтрокаВзносов.ПФСтраховая = ПФСтраховая; СтрокаВзносов.ФССФОМС = ФССФОМС; СтрокаВзносов.НСПЗ = НСПЗ; СтрокаВзносов.Итого = СВИтого; КонецЕсли; КонецЦикла; КонецПроцедуры #КонецОбласти