v3.0.0.18: full rebuild - all calc fields, fix NDFL, employees tab
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -230,35 +230,11 @@
|
||||
<ContextMenu name="ДанныеРасчетаЗПВсегоНаРукиКонтекстноеМеню" id="178"/>
|
||||
<ExtendedTooltip name="ДанныеРасчетаЗПВсегоНаРукиРасширеннаяПодсказка" id="179"/>
|
||||
</InputField>
|
||||
<InputField name="ДанныеРасчетаЗПИНН" id="181">
|
||||
<DataPath>Объект.ДанныеРасчетаЗП.ИНН</DataPath>
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<AutoEditMode>true</AutoEditMode>
|
||||
<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>
|
||||
<ContextMenu name="ДанныеРасчетаЗПИННКонтекстноеМеню" id="182"/>
|
||||
<ExtendedTooltip name="ДанныеРасчетаЗПИННРасширеннаяПодсказка" id="183"/>
|
||||
</InputField>
|
||||
<InputField name="ДанныеРасчетаЗПСНИЛС" id="185">
|
||||
<DataPath>Объект.ДанныеРасчетаЗП.СНИЛС</DataPath>
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<AutoEditMode>true</AutoEditMode>
|
||||
<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>
|
||||
<ContextMenu name="ДанныеРасчетаЗПСНИЛСКонтекстноеМеню" id="186"/>
|
||||
<ExtendedTooltip name="ДанныеРасчетаЗПСНИЛСРасширеннаяПодсказка" id="187"/>
|
||||
</InputField>
|
||||
<InputField name="ДанныеРасчетаЗПАдрес" id="189">
|
||||
<DataPath>Объект.ДанныеРасчетаЗП.Адрес</DataPath>
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<AutoEditMode>true</AutoEditMode>
|
||||
<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>
|
||||
<ContextMenu name="ДанныеРасчетаЗПАдресКонтекстноеМеню" id="190"/>
|
||||
<ExtendedTooltip name="ДанныеРасчетаЗПАдресРасширеннаяПодсказка" id="191"/>
|
||||
</InputField>
|
||||
</ChildItems>
|
||||
</Table>
|
||||
</ChildItems>
|
||||
</Page>
|
||||
<Page name="СтраницаДанныеНДФЛ" id="32">
|
||||
<Page name="СтраницаДанныеНДФЛ" id="32">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -423,7 +399,6 @@
|
||||
<ContextMenu name="ТаблицаСтраховыеВзносыУправлениеПоискомКонтекстноеМеню" id="102"/>
|
||||
<ExtendedTooltip name="ТаблицаСтраховыеВзносыУправлениеПоискомРасширеннаяПодсказка" id="103"/>
|
||||
</SearchControlAddition>
|
||||
|
||||
<ChildItems>
|
||||
<LabelField name="ТаблицаСтраховыеВзносыНомерСтроки" id="200">
|
||||
<DataPath>Объект.ДанныеСтраховыхВзносов.LineNumber</DataPath>
|
||||
@@ -480,7 +455,74 @@
|
||||
<ExtendedTooltip name="ТаблицаСтраховыеВзносыИтогоРасширеннаяПодсказка" id="223"/>
|
||||
</InputField>
|
||||
</ChildItems>
|
||||
</Table>
|
||||
</Table>
|
||||
</ChildItems>
|
||||
</Page>
|
||||
<Page name="СтраницаСотрудники" id="33">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Сотрудники</v8:content>
|
||||
</v8:item>
|
||||
</Title>
|
||||
<ExtendedTooltip name="СтраницаСотрудникиРасширеннаяПодсказка" id="700"/>
|
||||
<ChildItems>
|
||||
<Table name="ТаблицаСотрудники" id="800">
|
||||
<DataPath>Объект.Сотрудники</DataPath>
|
||||
<RowFilter xsi:nil="true"/>
|
||||
<ContextMenu name="ТаблицаСотрудникиКонтекстноеМеню" id="801"/>
|
||||
<AutoCommandBar name="ТаблицаСотрудникиКоманднаяПанель" id="802"/>
|
||||
<ExtendedTooltip name="ТаблицаСотрудникиРасширеннаяПодсказка" id="803"/>
|
||||
<ChildItems>
|
||||
<LabelField name="ТаблицаСотрудникиНомерСтроки" id="900">
|
||||
<DataPath>Объект.Сотрудники.LineNumber</DataPath>
|
||||
<ContextMenu name="ТаблицаСотрудникиНомерСтрокиКонтекстноеМеню" id="901"/>
|
||||
<ExtendedTooltip name="ТаблицаСотрудникиНомерСтрокиРасширеннаяПодсказка" id="902"/>
|
||||
</LabelField>
|
||||
<InputField name="ТаблицаСотрудникиФИО" id="903">
|
||||
<DataPath>Объект.Сотрудники.ФИО</DataPath>
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<AutoEditMode>true</AutoEditMode>
|
||||
<ContextMenu name="ТаблицаСотрудникиФИОКонтекстноеМеню" id="904"/>
|
||||
<ExtendedTooltip name="ТаблицаСотрудникиФИОРасширеннаяПодсказка" id="905"/>
|
||||
</InputField>
|
||||
<InputField name="ТаблицаСотрудникиИНН" id="906">
|
||||
<DataPath>Объект.Сотрудники.ИНН</DataPath>
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<AutoEditMode>true</AutoEditMode>
|
||||
<ContextMenu name="ТаблицаСотрудникиИННКонтекстноеМеню" id="907"/>
|
||||
<ExtendedTooltip name="ТаблицаСотрудникиИННРасширеннаяПодсказка" id="908"/>
|
||||
</InputField>
|
||||
<InputField name="ТаблицаСотрудникиСНИЛС" id="909">
|
||||
<DataPath>Объект.Сотрудники.СНИЛС</DataPath>
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<AutoEditMode>true</AutoEditMode>
|
||||
<ContextMenu name="ТаблицаСотрудникиСНИЛСКонтекстноеМеню" id="910"/>
|
||||
<ExtendedTooltip name="ТаблицаСотрудникиСНИЛСРасширеннаяПодсказка" id="911"/>
|
||||
</InputField>
|
||||
<InputField name="ТаблицаСотрудникиЛицевойСчет" id="912">
|
||||
<DataPath>Объект.Сотрудники.ЛицевойСчетВБанке</DataPath>
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<AutoEditMode>true</AutoEditMode>
|
||||
<ContextMenu name="ТаблицаСотрудникиЛицевойСчетКонтекстноеМеню" id="913"/>
|
||||
<ExtendedTooltip name="ТаблицаСотрудникиЛицевойСчетРасширеннаяПодсказка" id="914"/>
|
||||
</InputField>
|
||||
<InputField name="ТаблицаСотрудникиВидЗанятости" id="915">
|
||||
<DataPath>Объект.Сотрудники.ВидЗанятости</DataPath>
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<AutoEditMode>true</AutoEditMode>
|
||||
<ContextMenu name="ТаблицаСотрудникиВидЗанятостиКонтекстноеМеню" id="916"/>
|
||||
<ExtendedTooltip name="ТаблицаСотрудникиВидЗанятостиРасширеннаяПодсказка" id="917"/>
|
||||
</InputField>
|
||||
<InputField name="ТаблицаСотрудникиАдрес" id="918">
|
||||
<DataPath>Объект.Сотрудники.АдресРегистрации</DataPath>
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<AutoEditMode>true</AutoEditMode>
|
||||
<ContextMenu name="ТаблицаСотрудникиАдресКонтекстноеМеню" id="919"/>
|
||||
<ExtendedTooltip name="ТаблицаСотрудникиАдресРасширеннаяПодсказка" id="920"/>
|
||||
</InputField>
|
||||
</ChildItems>
|
||||
</Table>
|
||||
</ChildItems>
|
||||
</Page>
|
||||
</ChildItems>
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
&НаСервере
|
||||
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
|
||||
ИнициализироватьТаблицы();
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
@@ -25,11 +24,9 @@
|
||||
Сообщить("Выберите файл!");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
Состояние("Инициализация загрузки...", 0);
|
||||
Прогресс = 0;
|
||||
СтатусЗагрузки = "Подготовка...";
|
||||
|
||||
ПрочитатьExcelНаКлиенте();
|
||||
КонецПроцедуры
|
||||
|
||||
@@ -47,11 +44,6 @@
|
||||
|
||||
#Область ЧтениеExcel_Домен
|
||||
|
||||
// ============================================================================
|
||||
// ДОМЕН: Чтение Excel
|
||||
// Ответственность: открытие файла, поиск листов, чтение ячеек
|
||||
// ============================================================================
|
||||
|
||||
&НаКлиенте
|
||||
Функция ОткрытьФайлExcel(ПутьКФайлу)
|
||||
Попытка
|
||||
@@ -83,14 +75,10 @@
|
||||
Функция ПрочитатьЯчейкуЧисло(Лист, Строка, Колонка, КонтекстОшибки)
|
||||
Попытка
|
||||
Значение = Лист.Cells(Строка, Колонка).Value;
|
||||
Если Значение = Неопределено ИЛИ Значение = "" Тогда
|
||||
Возврат 0;
|
||||
КонецЕсли;
|
||||
Если Значение = Неопределено ИЛИ Значение = "" Тогда Возврат 0; КонецЕсли;
|
||||
Возврат Число(Значение);
|
||||
Исключение
|
||||
Сообщить("Ошибка чтения числа: " + КонтекстОшибки
|
||||
+ " | строка " + Строка + " колонка " + Колонка
|
||||
+ " | значение: """ + Значение + """ | " + ОписаниеОшибки());
|
||||
Сообщить("Ошибка чтения числа: " + КонтекстОшибки + " | строка " + Строка + " колонка " + Колонка + " | " + ОписаниеОшибки());
|
||||
Возврат 0;
|
||||
КонецПопытки;
|
||||
КонецФункции
|
||||
@@ -111,93 +99,23 @@
|
||||
Если Формула = Неопределено Тогда Возврат ""; КонецЕсли;
|
||||
ТекстФормулы = СокрЛП("" + Формула);
|
||||
Если Не СтрНачинаетсяС(ТекстФормулы, "='") Тогда Возврат ""; КонецЕсли;
|
||||
|
||||
ПозицияНачала = 3;
|
||||
ПозицияКонца = СтрНайти(ТекстФормулы, "'!", , , ПозицияНачала);
|
||||
Если ПозицияКонца = 0 Тогда Возврат ""; КонецЕсли;
|
||||
|
||||
Возврат Сред(ТекстФормулы, ПозицияНачала, ПозицияКонца - ПозицияНачала);
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Функция НайтиЛист(Книга, ИмяЛиста)
|
||||
Для Каждого Лист Из Книга.Sheets Цикл
|
||||
Если ВРег(Лист.Name) = ВРег(ИмяЛиста) Тогда
|
||||
Возврат Лист;
|
||||
КонецЕсли;
|
||||
Если ВРег(Лист.Name) = ВРег(ИмяЛиста) Тогда Возврат Лист; КонецЕсли;
|
||||
КонецЦикла;
|
||||
Возврат Неопределено;
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область МаппингЗаголовков_Домен
|
||||
|
||||
// ============================================================================
|
||||
// ДОМЕН: Маппинг заголовков
|
||||
// Ответственность: сопоставление имён колонок Excel с полями данных
|
||||
// ============================================================================
|
||||
|
||||
&НаКлиенте
|
||||
Функция СоздатьИндексЗаголовков(Лист, НомерСтрокиЗаголовков)
|
||||
Индекс = Новый Соответствие;
|
||||
ПоследняяКолонка = 1;
|
||||
Для Колонка = 1 По 100 Цикл
|
||||
Значение = Лист.Cells(НомерСтрокиЗаголовков, Колонка).Value;
|
||||
Если Значение <> Неопределено И Значение <> "" Тогда
|
||||
ПоследняяКолонка = Колонка;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Для Колонка = 1 По ПоследняяКолонка Цикл
|
||||
Имя = СокрЛП(НРег(Лист.Cells(НомерСтрокиЗаголовков, Колонка).Value));
|
||||
Если ЗначениеЗаполнено(Имя) Тогда
|
||||
Индекс.Вставить(Имя, Колонка);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
Возврат Индекс;
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Функция НайтиКолонкуПоЗаголовку(ИндексЗаголовков, КлючевоеСлово)
|
||||
Ключ = НРег(КлючевоеСлово);
|
||||
Для Каждого Эл Из ИндексЗаголовков Цикл
|
||||
Если СтрНайти(Эл.Ключ, Ключ) > 0 Тогда
|
||||
Возврат Эл.Значение;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
Возврат -1;
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Функция НайтиСтрокуЗаголовков(ЛистРасчет)
|
||||
КлючевыеСлова = Новый Массив;
|
||||
КлючевыеСлова.Добавить("сотрудник");
|
||||
КлючевыеСлова.Добавить("должность");
|
||||
КлючевыеСлова.Добавить("счет");
|
||||
КлючевыеСлова.Добавить("вид занятости");
|
||||
|
||||
Для Ном = 1 По Мин(30, ЛистРасчет.Rows.Count) Цикл
|
||||
КоличествоСовпадений = 0;
|
||||
Для Каждого КлючевоеСлово Из КлючевыеСлова Цикл
|
||||
Для Колонка = 1 По Мин(10, ЛистРасчет.Columns.Count) Цикл
|
||||
Значение = ЛистРасчет.Cells(Ном, Колонка).Value;
|
||||
Если Значение <> Неопределено Тогда
|
||||
Если СтрНайти(НРег(СокрЛП("" + Значение)), КлючевоеСлово) > 0 Тогда
|
||||
КоличествоСовпадений = КоличествоСовпадений + 1;
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
КонецЦикла;
|
||||
|
||||
Если КоличествоСовпадений >= 2 Тогда
|
||||
Возврат Ном;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Возврат 15;
|
||||
КонецФункции
|
||||
#Область ЧтениеДанныхСотрудника_Домен
|
||||
|
||||
&НаКлиенте
|
||||
Функция ПрочитатьДанныеИзЛистаСотрудника(ЛистСотрудника, ФИО)
|
||||
@@ -206,256 +124,182 @@
|
||||
Строка.Вставить("Должность", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 3, 3));
|
||||
Строка.Вставить("СчетБК", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 3, 4));
|
||||
Строка.Вставить("ВидЗанятости", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 5, 1));
|
||||
|
||||
БазоваяСтрока = 12;
|
||||
Смещение = Объект.МесяцЗагрузки;
|
||||
Если Не ЗначениеЗаполнено(Смещение) Тогда Смещение = 1; КонецЕсли;
|
||||
СтрокаДанных = БазоваяСтрока + Смещение;
|
||||
|
||||
Строка.Вставить("Оклад", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 3, ФИО + " Оклад"));
|
||||
Строка.Вставить("КоличествоСтавок", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 4, ФИО + " Ставки"));
|
||||
Строка.Вставить("ОтработаноДней", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 5, ФИО + " Отработано"));
|
||||
Строка.Вставить("ИтогоНачислено", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 10, ФИО + " Итого начислено"));
|
||||
Стр = БазоваяСтрока + Смещение;
|
||||
Строка.Вставить("Оклад", ПрочитатьЯчейкуЧисло(ЛистСотрудника, Стр, 3, ФИО + " Оклад"));
|
||||
Строка.Вставить("КоличествоСтавок", ПрочитатьЯчейкуЧисло(ЛистСотрудника, Стр, 4, ФИО + " Ставки"));
|
||||
Строка.Вставить("ОтработаноДней", ПрочитатьЯчейкуЧисло(ЛистСотрудника, Стр, 5, ФИО + " Отработано"));
|
||||
Строка.Вставить("ИтогоНачислено", ПрочитатьЯчейкуЧисло(ЛистСотрудника, Стр, 10, ФИО + " Итого начислено"));
|
||||
Строка.Вставить("НДФЛ", 0);
|
||||
Строка.Вставить("ИтогоУдержано", 0);
|
||||
Строка.Вставить("ВсегоНаРуки", 0);
|
||||
|
||||
Возврат Строка;
|
||||
КонецФункции
|
||||
|
||||
// Читает все расчётные поля из листа "Расчет" для строки сотрудника.
|
||||
// Колонки РАСЧЕТ: 9-38 расчёты, 39 итого, 40 НДФЛ, 41-52 удержания, 53 итого удержано, 55 на руки
|
||||
&НаКлиенте
|
||||
Функция НайтиСтрокуПервогоСотрудника(ЛистРасчет, НомерСтрокиЗаголовков)
|
||||
Для Ном = НомерСтрокиЗаголовков + 1 По ЛистРасчет.Rows.Count Цикл
|
||||
Значение = ЛистРасчет.Cells(Ном, 1).Value;
|
||||
Если ЗначениеЗаполнено(Значение)
|
||||
И Не СтрНачинаетсяС(ВРег(СокрЛП("" + Значение)), "ИТОГО") Тогда
|
||||
Возврат Ном;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
Возврат -1;
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Функция ИзвлечьЗначениеИзТекста(Текст, Префикс)
|
||||
Если Не ЗначениеЗаполнено(Текст) Тогда Возврат ""; КонецЕсли;
|
||||
Позиция = СтрНайти(ВРег(Текст), ВРег(Префикс));
|
||||
Если Позиция = 0 Тогда Возврат СокрЛП(Текст); КонецЕсли;
|
||||
Возврат СокрЛП(Сред(Текст, Позиция + СтрДлина(Префикс)));
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область ЧтениеДанныхСотрудника_Домен
|
||||
|
||||
// ============================================================================
|
||||
// ДОМЕН: Чтение данных сотрудника
|
||||
// Ответственность: извлечение данных из строки листа "Расчет" и листов сотрудников
|
||||
// ============================================================================
|
||||
|
||||
&НаКлиенте
|
||||
Функция ПрочитатьСтрокуРасчета(ЛистРасчет, Ном, ФИО, ИндексЗаголовков)
|
||||
Функция ПрочитатьСтрокуРасчета(ЛистРасчет, Ном, ФИО)
|
||||
Строка = Новый Структура;
|
||||
Строка.Вставить("ФИО", ФИО);
|
||||
|
||||
КолДолжность = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "должность");
|
||||
КолСчетБК = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "счет");
|
||||
КолВидЗанятости = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "вид занятости");
|
||||
КолОклад = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "оклад");
|
||||
КолСтавки = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "ставок");
|
||||
КолОтработано = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "отработано");
|
||||
КолИтогоНачислено = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "итого начислено");
|
||||
КолНДФЛ = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "ндфл");
|
||||
КолИтогоУдержано = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "итого удержано");
|
||||
КолВсегоНаРуки = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "всего на руки");
|
||||
|
||||
Строка.Вставить("Должность", ПрочитатьЯчейкуСтрока(ЛистРасчет, Ном, КолДолжность));
|
||||
Строка.Вставить("СчетБК", ПрочитатьЯчейкуСтрока(ЛистРасчет, Ном, КолСчетБК));
|
||||
Строка.Вставить("ВидЗанятости", ПрочитатьЯчейкуСтрока(ЛистРасчет, Ном, КолВидЗанятости));
|
||||
Строка.Вставить("Оклад", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолОклад, ФИО + " Оклад"));
|
||||
Строка.Вставить("КоличествоСтавок", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолСтавки, ФИО + " Ставки"));
|
||||
Строка.Вставить("ОтработаноДней", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолОтработано, ФИО + " Отработано"));
|
||||
Строка.Вставить("ИтогоНачислено", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолИтогоНачислено, ФИО + " Итого начислено"));
|
||||
Строка.Вставить("НДФЛ", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолНДФЛ, ФИО + " НДФЛ"));
|
||||
Строка.Вставить("ИтогоУдержано", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолИтогоУдержано, ФИО + " Итого удержано"));
|
||||
Строка.Вставить("ВсегоНаРуки", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолВсегоНаРуки, ФИО + " Всего на руки"));
|
||||
|
||||
Строка.Вставить("Должность", ПрочитатьЯчейкуСтрока(ЛистРасчет, Ном, 2));
|
||||
Строка.Вставить("СчетБК", ПрочитатьЯчейкуСтрока(ЛистРасчет, Ном, 3));
|
||||
Строка.Вставить("ВидЗанятости", ПрочитатьЯчейкуСтрока(ЛистРасчет, Ном, 4));
|
||||
Строка.Вставить("Оклад", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 8, ФИО + " Оклад"));
|
||||
Строка.Вставить("КоличествоСтавок", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 7, ФИО + " Ставки"));
|
||||
Строка.Вставить("ОтработаноДней", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 6, ФИО + " Отработано"));
|
||||
// Расчетные поля (col 9-38)
|
||||
Строка.Вставить("ЧасыДежурства", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 9, ФИО + " Часы дежурства"));
|
||||
Строка.Вставить("ЧасыНочные", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 10, ФИО + " Часы ночные"));
|
||||
Строка.Вставить("ЧасыПраздничные", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 11, ФИО + " Часы праздничные"));
|
||||
Строка.Вставить("РабочиеЧасыПоТабелю", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 12, ФИО + " Рабочие часы"));
|
||||
Строка.Вставить("ИзРасчетаМесячногоОкладаДни", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 13, ФИО + " Расчет оклада дни"));
|
||||
Строка.Вставить("ДоплатаСовместительство", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 14, ФИО + " Совместительство"));
|
||||
Строка.Вставить("ДоплатаСовмещениеПроцент", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 15, ФИО + " Совмещение %"));
|
||||
Строка.Вставить("ДоплатаИнтенсивность", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 16, ФИО + " Интенсивность"));
|
||||
Строка.Вставить("ИзРасчетаМесячногоОкладаЧасы", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 17, ФИО + " Расчет оклада часы"));
|
||||
Строка.Вставить("ДоплатаНочные", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 18, ФИО + " Доплата ночные"));
|
||||
Строка.Вставить("ДоплатаПраздничные", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 19, ФИО + " Доплата праздничные"));
|
||||
Строка.Вставить("ЗаСтаж", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 20, ФИО + " За стаж"));
|
||||
Строка.Вставить("НадбавкаЗаКатегорию", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 21, ФИО + " Надбавка категория"));
|
||||
Строка.Вставить("НадбавкаЗаВредность", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 22, ФИО + " Надбавка вредность"));
|
||||
Строка.Вставить("ПовышающийКоэффициент", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 23, ФИО + " Повыш. коэфф."));
|
||||
Строка.Вставить("СтимулирующиеВыплаты", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 24, ФИО + " Стимулирующие"));
|
||||
Строка.Вставить("СтимулирующаяНадбавка", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 25, ФИО + " Стимул. надбавка"));
|
||||
Строка.Вставить("РайонныйКоэффициент", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 26, ФИО + " Районный К"));
|
||||
Строка.Вставить("ВыплатыПоУказу597", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 27, ФИО + " Указ 597"));
|
||||
Строка.Вставить("ПремияРазовая", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 28, ФИО + " Премия разовая"));
|
||||
Строка.Вставить("БольничныйЛистЗаСчетПредприятия", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 29, ФИО + " Больничный"));
|
||||
Строка.Вставить("ДоплатаПрофактиву", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 30, ФИО + " Профактив"));
|
||||
Строка.Вставить("ПусковыеОбсервация", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 31, ФИО + " Пусковые"));
|
||||
Строка.Вставить("Отпуск", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 32, ФИО + " Отпуск"));
|
||||
Строка.Вставить("КомпенсацияЗаОтпуск", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 33, ФИО + " Компенсация отпуск"));
|
||||
Строка.Вставить("ПрочиеКомандировочныйУчебныйОтпуск", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 34, ФИО + " Прочие отпуска"));
|
||||
Строка.Вставить("ВыходноеПособие", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 35, ФИО + " Выходное пособие"));
|
||||
Строка.Вставить("ПоУходуЗаРебенкомИнвалидом", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 36, ФИО + " Уход ребенок-инвалид"));
|
||||
Строка.Вставить("ДоплатаДоМРОТ", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 37, ФИО + " Доплата МРОТ"));
|
||||
Строка.Вставить("Родовые", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 38, ФИО + " Родовые"));
|
||||
// Итоги
|
||||
Строка.Вставить("ИтогоНачислено", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 39, ФИО + " Итого начислено"));
|
||||
Строка.Вставить("НДФЛ", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 40, ФИО + " НДФЛ"));
|
||||
Строка.Вставить("ПрофВзнос", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 41, ФИО + " Проф. взнос"));
|
||||
Строка.Вставить("ИсполнительныеДокументы", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 42, ФИО + " Исп. документы"));
|
||||
Строка.Вставить("Аванс", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 43, ФИО + " Аванс"));
|
||||
Строка.Вставить("ИтогоУдержано", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 53, ФИО + " Итого удержано"));
|
||||
Строка.Вставить("ВсегоНаРуки", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, 55, ФИО + " Всего на руки"));
|
||||
Возврат Строка;
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Функция ПрочитатьСтрокуВзносов(ЛистРасчет, Ном, ФИО, ИндексЗаголовков)
|
||||
КолДТ6 = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "дт 6");
|
||||
КолДТ4 = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "дт 4");
|
||||
КолПФ = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "пф страховая");
|
||||
КолФСС = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "фсс");
|
||||
КолНСПЗ = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "нс и пз");
|
||||
КолСВИтого = НайтиКолонкуПоЗаголовку(ИндексЗаголовков, "св итого");
|
||||
|
||||
Функция ПрочитатьСтрокуВзносовИзРасчета(ЛистРасчет, Ном, ФИО)
|
||||
КолДТ6 = 58; КолДТ4 = 59; КолПФ = 60; КолФСС = 61; КолНСПЗ = 62; КолСВИтого = 63;
|
||||
СВ = ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолСВИтого, ФИО + " СВ итого");
|
||||
Если СВ <= 0 Тогда Возврат Неопределено; КонецЕсли;
|
||||
|
||||
СтрВзносов = Новый Структура;
|
||||
СтрВзносов.Вставить("ФИО", ФИО);
|
||||
СтрВзносов.Вставить("ДТ6Процент", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолДТ6, ФИО + " ДТ 6%"));
|
||||
СтрВзносов.Вставить("ДТ4Процент", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолДТ4, ФИО + " ДТ 4%"));
|
||||
СтрВзносов.Вставить("ПФСтраховая", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолПФ, ФИО + " ПФ"));
|
||||
СтрВзносов.Вставить("ФССФОМС", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолФСС, ФИО + " ФСС/ФОМС"));
|
||||
СтрВзносов.Вставить("НСПЗ", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолНСПЗ, ФИО + " НС и ПЗ"));
|
||||
СтрВзносов.Вставить("Итого", СВ);
|
||||
|
||||
Возврат СтрВзносов;
|
||||
Стр = Новый Структура;
|
||||
Стр.Вставить("ФИО", ФИО);
|
||||
Стр.Вставить("ДТ6Процент", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолДТ6, ФИО + " ДТ 6%"));
|
||||
Стр.Вставить("ДТ4Процент", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолДТ4, ФИО + " ДТ 4%"));
|
||||
Стр.Вставить("ПФСтраховая", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолПФ, ФИО + " ПФ"));
|
||||
Стр.Вставить("ФССФОМС", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолФСС, ФИО + " ФСС/ФОМС"));
|
||||
Стр.Вставить("НСПЗ", ПрочитатьЯчейкуЧисло(ЛистРасчет, Ном, КолНСПЗ, ФИО + " НС и ПЗ"));
|
||||
Стр.Вставить("Итого", СВ);
|
||||
Возврат Стр;
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Функция ПрочитатьЛичныеДанные(Книга, ФИО)
|
||||
ЛичныеДанные = Новый Структура("ИНН, СНИЛС, Паспорт, Адрес", "", "", "", "");
|
||||
|
||||
ЛистСотрудника = НайтиЛист(Книга, ФИО);
|
||||
Если ЛистСотрудника = Неопределено Тогда
|
||||
Возврат ЛичныеДанные;
|
||||
КонецЕсли;
|
||||
|
||||
ЛичныеДанные.ИНН = ИзвлечьЗначениеИзТекста(
|
||||
ПрочитатьЯчейкуСтрока(ЛистСотрудника, 0, 10), "ИНН");
|
||||
ЛичныеДанные.СНИЛС = ИзвлечьЗначениеИзТекста(
|
||||
ПрочитатьЯчейкуСтрока(ЛистСотрудника, 1, 10), "СНИЛС");
|
||||
ЛичныеДанные.Паспорт = ИзвлечьЗначениеИзТекста(
|
||||
ПрочитатьЯчейкуСтрока(ЛистСотрудника, 2, 10), "Паспорт");
|
||||
ЛичныеДанные.Адрес = ПрочитатьЯчейкуСтрока(ЛистСотрудника, 3, 10);
|
||||
|
||||
Возврат ЛичныеДанные;
|
||||
КонецФункции
|
||||
|
||||
// Читает данные НДФЛ и страховых взносов из блока внизу листа сотрудника.
|
||||
// Блок НДФЛ/СВ начинается с строки 31 ("Расчет НДФЛ и страховых взносов (СВ)").
|
||||
// Заголовки: строки 33-35. Данные по месяцам: строки 36-47 (Январь-Декабрь). Итого: строка 48.
|
||||
// Месяц выбирается по Объект.МесяцЗагрузки: строка = 35 + Месяц.
|
||||
// Читает данные НДФЛ и СВ из блока внизу листа сотрудника.
|
||||
// Заголовки блока: строки 33-35. Данные: строки 36-47 (Январь-Декабрь). Итого: строка 48.
|
||||
&НаКлиенте
|
||||
Функция ПрочитатьНДФЛСоЛистаСотрудника(ЛистСотрудника, ФИО)
|
||||
Если ЛистСотрудника = Неопределено Тогда
|
||||
Возврат Неопределено;
|
||||
КонецЕсли;
|
||||
|
||||
// Проверяем наличие блока НДФЛ: ячейка A31 содержит "Расчет НДФЛ"
|
||||
ЗаголовокБлока = ПрочитатьЯчейкуСтрока(ЛистСотрудника, 31, 1);
|
||||
Если СтрНайти(НРег(ЗаголовокБлока), "ндфл") = 0
|
||||
И СтрНайти(НРег(ЗаголовокБлока), "расчет") = 0 Тогда
|
||||
// Проверяем строку 33 (альтернативное расположение)
|
||||
ЗаголовокБлока33 = ПрочитатьЯчейкуСтрока(ЛистСотрудника, 33, 1);
|
||||
Если СтрНайти(НРег(ЗаголовокБлока33), "период") = 0 Тогда
|
||||
Возврат Неопределено;
|
||||
Если ЛистСотрудника = Неопределено Тогда Возврат Неопределено; КонецЕсли;
|
||||
// Проверяем наличие блока: строка 31 содержит "Расчет НДФЛ"
|
||||
ЕстьБлок = Ложь;
|
||||
Для ПроверяемаяСтрока = 30 По 32 Цикл
|
||||
Текст = НРег(ПрочитатьЯчейкуСтрока(ЛистСотрудника, ПроверяемаяСтрока, 1));
|
||||
Если СтрНайти(Текст, "ндфл") > 0 ИЛИ СтрНайти(Текст, "взнос") > 0 Тогда
|
||||
ЕстьБлок = Истина;
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
Если Не ЕстьБлок Тогда
|
||||
// Fallback: проверяем строку 36 — там должен быть "Январь"
|
||||
ТекстЯнв = НРег(ПрочитатьЯчейкуСтрока(ЛистСотрудника, 36, 1));
|
||||
Если СтрНайти(ТекстЯнв, "январь") = 0 Тогда Возврат Неопределено; КонецЕсли;
|
||||
ЕстьБлок = Истина;
|
||||
КонецЕсли;
|
||||
Если Не ЕстьБлок Тогда Возврат Неопределено; КонецЕсли;
|
||||
|
||||
// Определяем строку данных для выбранного месяца: 35 + МесяцЗагрузки
|
||||
// Определяем строку данных для выбранного месяца
|
||||
Смещение = Объект.МесяцЗагрузки;
|
||||
Если Не ЗначениеЗаполнено(Смещение) Тогда Смещение = 1; КонецЕсли;
|
||||
СтрокаДанных = 35 + Смещение; // Строка 36 = Январь, 37 = Февраль, ...
|
||||
СтрокаДанных = 35 + Смещение;
|
||||
|
||||
// Названия месяцев для проверки
|
||||
// Проверяем что в строке название месяца
|
||||
МассивМесяцев = Новый Массив;
|
||||
МассивМесяцев.Добавить("январь");
|
||||
МассивМесяцев.Добавить("февраль");
|
||||
МассивМесяцев.Добавить("март");
|
||||
МассивМесяцев.Добавить("апрель");
|
||||
МассивМесяцев.Добавить("май");
|
||||
МассивМесяцев.Добавить("июнь");
|
||||
МассивМесяцев.Добавить("июль");
|
||||
МассивМесяцев.Добавить("август");
|
||||
МассивМесяцев.Добавить("сентябрь");
|
||||
МассивМесяцев.Добавить("октябрь");
|
||||
МассивМесяцев.Добавить("ноябрь");
|
||||
МассивМесяцев.Добавить("декабрь");
|
||||
МассивМесяцев.Добавить("январь"); МассивМесяцев.Добавить("февраль");
|
||||
МассивМесяцев.Добавить("март"); МассивМесяцев.Добавить("апрель");
|
||||
МассивМесяцев.Добавить("май"); МассивМесяцев.Добавить("июнь");
|
||||
МассивМесяцев.Добавить("июль"); МассивМесяцев.Добавить("август");
|
||||
МассивМесяцев.Добавить("сентябрь"); МассивМесяцев.Добавить("октябрь");
|
||||
МассивМесяцев.Добавить("ноябрь"); МассивМесяцев.Добавить("декабрь");
|
||||
|
||||
// Проверяем что в найденной строке действительно данные за месяц
|
||||
ТекстМесяца = НРег(ПрочитатьЯчейкуСтрока(ЛистСотрудника, СтрокаДанных, 1));
|
||||
Если МассивМесяцев.Найти(ТекстМесяца) = Неопределено Тогда
|
||||
// Попробуем найти строку по названию месяца
|
||||
// Ищем строку с нужным месяцем
|
||||
Для Строка = 36 По 47 Цикл
|
||||
Текст = НРег(ПрочитатьЯчейкуСтрока(ЛистСотрудника, Строка, 1));
|
||||
Если МассивМесяцев.Найти(Текст) <> Неопределено Тогда
|
||||
Если (Строка - 35) = Смещение Тогда
|
||||
СтрокаДанных = Строка;
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
|
||||
// Колонки блока НДФЛ/СВ (по структуре xlsm):
|
||||
// 4: Сумма валового дохода за месяц
|
||||
// 6: Сумма валового дохода с начала года
|
||||
// 8: Скидка для НДФЛ за месяц
|
||||
// 9: Скидка для НДФЛ за год
|
||||
// 10: Скидка для СВ за месяц
|
||||
// 12: Вычет на работника за месяц
|
||||
// 13: Вычет на иждивенцев за месяц
|
||||
// 14: Всего вычетов за год
|
||||
// 15: Облагаемый доход за год
|
||||
// 16: НДФЛ начисленный за год
|
||||
// 18: Итого НДФЛ за месяц
|
||||
// 23: Налоговая база по СВ за месяц
|
||||
// 37: СВ итого за месяц
|
||||
|
||||
НДФЛ = Новый Структура;
|
||||
НДФЛ.Вставить("ФИО", ФИО);
|
||||
НДФЛ.Вставить("МесяцРасчета", ПрочитатьЯчейкуСтрока(ЛистСотрудника, СтрокаДанных, 1));
|
||||
|
||||
// Колонки блока НДФЛ/СВ на листе сотрудника:
|
||||
// col 4: Сумма валового дохода (за месяц)
|
||||
// col 6: Сумма валового дохода с начала года
|
||||
// col 7: Сумма дохода (за месяц)
|
||||
// col 8: Скидка для НДФЛ (за месяц)
|
||||
// col 9: Скидка для НДФЛ (за год)
|
||||
// col 10: Скидка для СВ (за месяц)
|
||||
// col 11: Скидка для СВ (за год)
|
||||
// col 12: Вычет на работника (за месяц)
|
||||
// col 13: Вычет на иждивенцев (за месяц)
|
||||
// col 14: Всего вычетов (за год)
|
||||
// col 15: Облагаемый доход (за год)
|
||||
// col 16: Начисленный НДФЛ (за год)
|
||||
// col 17: Удержанный НДФЛ (за год)
|
||||
// col 18: Итого НДФЛ (за месяц)
|
||||
// col 19: Выплаты по больничному (за год)
|
||||
// col 20: Налоговая база по СВ (за год)
|
||||
// col 23: Налоговая база по СВ (за месяц)
|
||||
// col 24: Страховая часть ПФ
|
||||
// col 25: Накопительная часть ПФ
|
||||
// col 31: ФСС начислено с начала года
|
||||
// col 33: ФСС Итого (за месяц)
|
||||
// col 34: НС и ПЗ начислено с начала года
|
||||
// col 36: НС и ПЗ Итого (за месяц)
|
||||
// col 37: Страховые взносы Итого (за месяц)
|
||||
|
||||
НДФЛ.Вставить("СуммаВаловогоДохода",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 4, ФИО + " Сумма валового дохода"));
|
||||
НДФЛ.Вставить("СуммаВаловогоДоходаСНачалаГода",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 6, ФИО + " Доход с начала года"));
|
||||
НДФЛ.Вставить("СкидкаДляНДФЛЗаМесяц",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 8, ФИО + " Скидка НДФЛ месяц"));
|
||||
НДФЛ.Вставить("СкидкаДляНДФЛЗаГод",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 9, ФИО + " Скидка НДФЛ год"));
|
||||
НДФЛ.Вставить("СкидкаДляСВЗаМесяц",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 10, ФИО + " Скидка СВ месяц"));
|
||||
НДФЛ.Вставить("ВычетНаРаботникаЗаМесяц",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 12, ФИО + " Вычет работника"));
|
||||
НДФЛ.Вставить("ВычетНаРаботникаЗаГод",
|
||||
0); // не отображается отдельно, входит в ВсегоВычетовЗаМесяц
|
||||
НДФЛ.Вставить("ВычетНаИждивенцевЗаМесяц",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 13, ФИО + " Вычет иждивенцев"));
|
||||
НДФЛ.Вставить("ВсегоВычетовЗаМесяц",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 14, ФИО + " Всего вычетов"));
|
||||
НДФЛ.Вставить("ОблагаемыйДоходЗаМесяц",
|
||||
0); // за месяц не выделяется отдельно
|
||||
НДФЛ.Вставить("ОблагаемыйДоходЗаГод",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 15, ФИО + " Облагаемый доход"));
|
||||
НДФЛ.Вставить("НачисленныйНДФЛЗаГод",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 16, ФИО + " НДФЛ начисленный"));
|
||||
НДФЛ.Вставить("ИтогоНДФЛЗаМесяц",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 18, ФИО + " Итого НДФЛ"));
|
||||
НДФЛ.Вставить("НалоговаяБазаПоСВЗаМесяц",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 23, ФИО + " База СВ месяц"));
|
||||
НДФЛ.Вставить("ИтогоФСС",
|
||||
ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 37, ФИО + " Итого СВ"));
|
||||
|
||||
НДФЛ.Вставить("СуммаВаловогоДохода", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 4, ФИО + " Сумма валового дохода"));
|
||||
НДФЛ.Вставить("СуммаВаловогоДоходаСНачалаГода", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 6, ФИО + " Доход с начала года"));
|
||||
НДФЛ.Вставить("СкидкаДляНДФЛЗаМесяц", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 8, ФИО + " Скидка НДФЛ месяц"));
|
||||
НДФЛ.Вставить("СкидкаДляНДФЛЗаГод", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 9, ФИО + " Скидка НДФЛ год"));
|
||||
НДФЛ.Вставить("СкидкаДляСВЗаМесяц", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 10, ФИО + " Скидка СВ месяц"));
|
||||
НДФЛ.Вставить("ВычетНаРаботникаЗаМесяц", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 12, ФИО + " Вычет работника"));
|
||||
НДФЛ.Вставить("ВычетНаРаботникаЗаГод", 0);
|
||||
НДФЛ.Вставить("ВычетНаИждивенцевЗаМесяц", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 13, ФИО + " Вычет иждивенцев"));
|
||||
НДФЛ.Вставить("ВсегоВычетовЗаМесяц", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 14, ФИО + " Всего вычетов"));
|
||||
НДФЛ.Вставить("ОблагаемыйДоходЗаМесяц", 0);
|
||||
НДФЛ.Вставить("ОблагаемыйДоходЗаГод", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 15, ФИО + " Облагаемый доход"));
|
||||
НДФЛ.Вставить("НачисленныйНДФЛЗаГод", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 16, ФИО + " НДФЛ начисленный"));
|
||||
НДФЛ.Вставить("ИтогоНДФЛЗаМесяц", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 18, ФИО + " Итого НДФЛ"));
|
||||
НДФЛ.Вставить("НалоговаяБазаПоСВЗаМесяц", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 23, ФИО + " База СВ месяц"));
|
||||
НДФЛ.Вставить("ИтогоФСС", ПрочитатьЯчейкуЧисло(ЛистСотрудника, СтрокаДанных, 37, ФИО + " Итого СВ"));
|
||||
Возврат НДФЛ;
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Функция ПрочитатьДанныеСотрудника(ЛистСотрудника)
|
||||
Данные = Новый Структура;
|
||||
Данные.Вставить("ФИО", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 2, 3)); // C3: ФИО
|
||||
Данные.Вставить("ИНН", ИзвлечьЗначениеИзТекста(
|
||||
ПрочитатьЯчейкуСтрока(ЛистСотрудника, 0, 10), "ИНН"));
|
||||
Данные.Вставить("СНИЛС", ИзвлечьЗначениеИзТекста(
|
||||
ПрочитатьЯчейкуСтрока(ЛистСотрудника, 1, 10), "СНИЛС"));
|
||||
Данные.Вставить("ЛицевойСчетВБанке", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 3, 4)); // D4: Номер
|
||||
Данные.Вставить("ВидЗанятости", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 5, 1)); // A6
|
||||
Данные.Вставить("АдресРегистрации", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 3, 10)); // K4
|
||||
|
||||
Данные.Вставить("ФИО", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 2, 3));
|
||||
Данные.Вставить("ИНН", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 0, 10));
|
||||
Данные.Вставить("СНИЛС", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 1, 10));
|
||||
Данные.Вставить("ЛицевойСчетВБанке", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 3, 4));
|
||||
Данные.Вставить("ВидЗанятости", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 5, 1));
|
||||
Данные.Вставить("АдресРегистрации", ПрочитатьЯчейкуСтрока(ЛистСотрудника, 3, 10));
|
||||
Возврат Данные;
|
||||
КонецФункции
|
||||
|
||||
@@ -463,83 +307,54 @@
|
||||
|
||||
#Область ОсновнаяПроцедура_Домен
|
||||
|
||||
// ============================================================================
|
||||
// ДОМЕН: Оркестрация загрузки
|
||||
// ============================================================================
|
||||
|
||||
&НаКлиенте
|
||||
Процедура ПрочитатьExcelНаКлиенте()
|
||||
|
||||
СтатусЗагрузки = "Копирование файла...";
|
||||
Состояние("Копирование файла...", 5);
|
||||
|
||||
ВременныйФайл = КаталогВременныхФайлов() + "temp_data.xls";
|
||||
КопироватьФайл(Объект.ПутьКФайлу, ВременныйФайл);
|
||||
|
||||
СтатусЗагрузки = "Открытие Excel...";
|
||||
Состояние("Открытие Excel...", 10);
|
||||
|
||||
КонтекстExcel = ОткрытьФайлExcel(ВременныйФайл);
|
||||
Если КонтекстExcel = Неопределено Тогда
|
||||
УдалитьФайлы(ВременныйФайл);
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
СтатусЗагрузки = "Поиск листа 'Расчет'...";
|
||||
Состояние("Поиск листа 'Расчет'...", 15);
|
||||
|
||||
Если КонтекстExcel = Неопределено Тогда УдалитьФайлы(ВременныйФайл); Возврат; КонецЕсли;
|
||||
СтатусЗагрузки = "Поиск листа Расчет...";
|
||||
ЛистРасчет = НайтиЛист(КонтекстExcel.Книга, "Расчет");
|
||||
Если ЛистРасчет = Неопределено Тогда
|
||||
Сообщить("Лист 'Расчет' не найден!");
|
||||
Сообщить("Лист Расчет не найден!");
|
||||
ЗакрытьExcel(КонтекстExcel, ВременныйФайл);
|
||||
СтатусЗагрузки = "Ошибка: лист не найден";
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
СтатусЗагрузки = "Определение месяца...";
|
||||
Состояние("Определение месяца...", 20);
|
||||
|
||||
МесяцЗначение = ЛистРасчет.Cells(4, 1).Value;
|
||||
Если ЗначениеЗаполнено(МесяцЗначение) Тогда
|
||||
Попытка
|
||||
Объект.МесяцЗагрузки = Число(МесяцЗначение);
|
||||
Исключение
|
||||
Сообщить("Не удалось определить месяц: " + МесяцЗначение);
|
||||
КонецПопытки;
|
||||
Попытка Объект.МесяцЗагрузки = Число(МесяцЗначение); Исключение КонецПопытки;
|
||||
КонецЕсли;
|
||||
Ном = 1;
|
||||
// Определяем строку первого сотрудника
|
||||
Для Ном = 1 По 30 Цикл
|
||||
Значение = ЛистРасчет.Cells(Ном, 1).Value;
|
||||
Если Значение <> Неопределено И Значение <> "" Тогда
|
||||
ФИОТест = СокрЛП("" + Значение);
|
||||
Если Не СтрНачинаетсяС(ВРег(ФИОТест), "ИТОГО")
|
||||
И Не СтрНачинаетсяС(ВРег(ФИОТест), "СОТРУДНИК")
|
||||
И СтрДлина(ФИОТест) > 3 Тогда
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
СтатусЗагрузки = "Анализ заголовков...";
|
||||
Состояние("Анализ заголовков...", 22);
|
||||
|
||||
НомерСтрокиЗаголовков = НайтиСтрокуЗаголовков(ЛистРасчет);
|
||||
ИндексЗаголовков = СоздатьИндексЗаголовков(ЛистРасчет, НомерСтрокиЗаголовков);
|
||||
|
||||
СтатусЗагрузки = "Поиск данных...";
|
||||
Состояние("Поиск данных...", 25);
|
||||
|
||||
Ном = НайтиСтрокуПервогоСотрудника(ЛистРасчет, НомерСтрокиЗаголовков);
|
||||
Если Ном = -1 Тогда
|
||||
Сообщить("Данные сотрудников не найдены!");
|
||||
ЗакрытьExcel(КонтекстExcel, ВременныйФайл);
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
// Основные массивы данных
|
||||
МассивДанных = Новый Массив;
|
||||
МассивВзносов = Новый Массив;
|
||||
МассивНДФЛ = Новый Массив;
|
||||
МассивСотрудников = Новый Массив;
|
||||
СчетчикСотрудников = 0;
|
||||
|
||||
Счетчик = 0;
|
||||
ПустыхПодряд = 0;
|
||||
МаксПустых = 5;
|
||||
КоличествоСтрок = ЛистРасчет.Rows.Count;
|
||||
|
||||
Пока Истина Цикл
|
||||
ФИО = ПрочитатьЯчейкуСтрока(ЛистРасчет, Ном, 1);
|
||||
|
||||
ФИО = "";
|
||||
ЛистСотрудника = Неопределено;
|
||||
// Пробуем прочитать ФИО из РАСЧЕТ
|
||||
ФИО = ПрочитатьЯчейкуСтрока(ЛистРасчет, Ном, 1);
|
||||
Если Не ЗначениеЗаполнено(ФИО) Тогда
|
||||
// xlsm: ФИО в формуле-ссылке
|
||||
Формула = ЛистРасчет.Cells(Ном, 1).Formula;
|
||||
Если ЗначениеЗаполнено(Формула) Тогда
|
||||
ИмяЛиста = ИзвлечьИмяЛистаИзФормулы(Формула);
|
||||
@@ -551,128 +366,90 @@
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЗначениеЗаполнено(ФИО) Тогда
|
||||
ПустыхПодряд = ПустыхПодряд + 1;
|
||||
Если ПустыхПодряд >= МаксПустых Тогда Прервать; КонецЕсли;
|
||||
Ном = Ном + 1;
|
||||
Продолжить;
|
||||
Если ПустыхПодряд >= 5 Тогда Прервать; КонецЕсли;
|
||||
Ном = Ном + 1; Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
ПустыхПодряд = 0;
|
||||
Если СтрНачинаетсяС(ВРег(ФИО), "ИТОГО") Тогда Прервать; КонецЕсли;
|
||||
Если СтрНачинаетсяС(ВРег(СокрЛП(ФИО)), "ИТОГО") Тогда Прервать; КонецЕсли;
|
||||
|
||||
// Уникальный идентификатор сотрудника
|
||||
СчетчикСотрудников = СчетчикСотрудников + 1;
|
||||
ИДСотрудника = СчетчикСотрудников;
|
||||
Счетчик = Счетчик + 1;
|
||||
Состояние("Расчет ЗП: " + ФИО, 25 + 60 * Счетчик / 100);
|
||||
|
||||
ПрогрессЗаписи = 25 + 65 * (Ном - 1) / Макс(КоличествоСтрок, 1);
|
||||
Состояние("Расчет ЗП: " + ФИО, ПрогрессЗаписи);
|
||||
// Чтение данных ЗП (все расчётные колонки из РАСЧЕТ)
|
||||
Строка = ПрочитатьСтрокуРасчета(ЛистРасчет, Ном, ФИО);
|
||||
Строка.Вставить("ИдентификаторСотрудника", Счетчик);
|
||||
|
||||
// Чтение данных ЗП
|
||||
// Если есть лист сотрудника — обогащаем данными карточки
|
||||
Если ЛистСотрудника <> Неопределено Тогда
|
||||
Строка = ПрочитатьДанныеИзЛистаСотрудника(ЛистСотрудника, ФИО);
|
||||
Иначе
|
||||
Строка = ПрочитатьСтрокуРасчета(ЛистРасчет, Ном, ФИО, ИндексЗаголовков);
|
||||
ДанныеКарточки = ПрочитатьДанныеСотрудника(ЛистСотрудника);
|
||||
// ФИО и Должность уже из РАСЧЕТ, перезаписываем только карточные
|
||||
Строка.Вставить("ИНН", ДанныеКарточки.ИНН);
|
||||
Строка.Вставить("СНИЛС", ДанныеКарточки.СНИЛС);
|
||||
Строка.Вставить("Адрес", ДанныеКарточки.АдресРегистрации);
|
||||
КонецЕсли;
|
||||
Строка.Вставить("ИдентификаторСотрудника", ИДСотрудника);
|
||||
|
||||
// Личные данные (ИНН, СНИЛС, адрес)
|
||||
ЛичныеДанные = ПрочитатьЛичныеДанные(КонтекстExcel.Книга, ФИО);
|
||||
Для Каждого КлючЗначение Из ЛичныеДанные Цикл
|
||||
Если Не Строка.Свойство(КлючЗначение.Ключ) Тогда
|
||||
Строка.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
МассивДанных.Добавить(Строка);
|
||||
|
||||
// Данные сотрудников (скрытая таблица для связи)
|
||||
// Таблица сотрудников
|
||||
Если ЛистСотрудника <> Неопределено Тогда
|
||||
ДанныеСотр = ПрочитатьДанныеСотрудника(ЛистСотрудника);
|
||||
Иначе
|
||||
ДанныеСотр = Новый Структура;
|
||||
ДанныеСотр.Вставить("ФИО", ФИО);
|
||||
ДанныеСотр.Вставить("ИНН", ?(ЛичныеДанные <> Неопределено, ЛичныеДанные.ИНН, ""));
|
||||
ДанныеСотр.Вставить("СНИЛС", ?(ЛичныеДанные <> Неопределено, ЛичныеДанные.СНИЛС, ""));
|
||||
ДанныеСотр.Вставить("ЛицевойСчетВБанке", "");
|
||||
ДанныеСотр.Вставить("ВидЗанятости", "");
|
||||
ДанныеСотр.Вставить("АдресРегистрации", "");
|
||||
ДанныеСотр = Новый Структура("ФИО, ИНН, СНИЛС, ЛицевойСчетВБанке, ВидЗанятости, АдресРегистрации",
|
||||
ФИО, "", "", "", "", "");
|
||||
КонецЕсли;
|
||||
ДанныеСотр.Вставить("Идентификатор", ИДСотрудника);
|
||||
ДанныеСотр.Вставить("Идентификатор", Счетчик);
|
||||
МассивСотрудников.Добавить(ДанныеСотр);
|
||||
|
||||
// Данные НДФЛ из блока внизу листа сотрудника
|
||||
// НДФЛ из блока внизу листа сотрудника
|
||||
Если ЛистСотрудника <> Неопределено Тогда
|
||||
ДанныеНДФЛ = ПрочитатьНДФЛСоЛистаСотрудника(ЛистСотрудника, ФИО);
|
||||
Если ДанныеНДФЛ <> Неопределено Тогда
|
||||
ДанныеНДФЛ.Вставить("ИдентификаторСотрудника", ИДСотрудника);
|
||||
ДанныеНДФЛ.Вставить("ИдентификаторСотрудника", Счетчик);
|
||||
МассивНДФЛ.Добавить(ДанныеНДФЛ);
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
// Страховые взносы из листа "Расчет"
|
||||
СтрВзносов = ПрочитатьСтрокуВзносов(ЛистРасчет, Ном, ФИО, ИндексЗаголовков);
|
||||
// Страховые взносы из РАСЧЕТ (cols 58-63)
|
||||
СтрВзносов = ПрочитатьСтрокуВзносовИзРасчета(ЛистРасчет, Ном, ФИО);
|
||||
Если СтрВзносов <> Неопределено Тогда
|
||||
СтрВзносов.Вставить("ИдентификаторСотрудника", ИДСотрудника);
|
||||
СтрВзносов.Вставить("ИдентификаторСотрудника", Счетчик);
|
||||
МассивВзносов.Добавить(СтрВзносов);
|
||||
КонецЕсли;
|
||||
|
||||
Ном = Ном + 1;
|
||||
Если Ном > ЛистРасчет.Rows.Count Тогда Прервать; КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
СтатусЗагрузки = "Закрытие Excel...";
|
||||
Состояние("Закрытие Excel...", 95);
|
||||
ЗакрытьExcel(КонтекстExcel, ВременныйФайл);
|
||||
|
||||
СтатусЗагрузки = "Передача данных на сервер...";
|
||||
Состояние("Передача данных на сервер...", 98);
|
||||
ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов, МассивНДФЛ, МассивСотрудников);
|
||||
|
||||
Прогресс = 100;
|
||||
СтатусЗагрузки = "Готово! Загружено: " + МассивДанных.Количество() + " сотрудников";
|
||||
Сообщить(СтатусЗагрузки);
|
||||
|
||||
ОбновитьОтображениеДанных();
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СерверныеПроцедуры
|
||||
|
||||
// ============================================================================
|
||||
// ДОМЕН: Серверная обработка данных
|
||||
// ============================================================================
|
||||
|
||||
&НаСервере
|
||||
Процедура ИнициализироватьТаблицы()
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Процедура ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов, МассивНДФЛ, МассивСотрудников)
|
||||
// Таблица расчета ЗП
|
||||
Объект.ДанныеРасчетаЗП.Очистить();
|
||||
Для Каждого Эл Из МассивДанных Цикл
|
||||
Строка = Объект.ДанныеРасчетаЗП.Добавить();
|
||||
ЗаполнитьЗначенияСвойств(Строка, Эл);
|
||||
КонецЦикла;
|
||||
|
||||
// Таблица страховых взносов
|
||||
Объект.ДанныеСтраховыхВзносов.Очистить();
|
||||
Для Каждого Эл Из МассивВзносов Цикл
|
||||
Строка = Объект.ДанныеСтраховыхВзносов.Добавить();
|
||||
ЗаполнитьЗначенияСвойств(Строка, Эл);
|
||||
КонецЦикла;
|
||||
|
||||
// Таблица НДФЛ
|
||||
Объект.ДанныеНДФЛ.Очистить();
|
||||
Для Каждого Эл Из МассивНДФЛ Цикл
|
||||
Строка = Объект.ДанныеНДФЛ.Добавить();
|
||||
ЗаполнитьЗначенияСвойств(Строка, Эл);
|
||||
КонецЦикла;
|
||||
|
||||
// Таблица сотрудников (скрытая, для связи между ТЧ)
|
||||
Объект.Сотрудники.Очистить();
|
||||
Для Каждого Эл Из МассивСотрудников Цикл
|
||||
Строка = Объект.Сотрудники.Добавить();
|
||||
@@ -685,12 +462,6 @@
|
||||
ГодЗагрузки = ТекущаяДата().Год();
|
||||
Период = Дата(ГодЗагрузки, Объект.МесяцЗагрузки, 1);
|
||||
Объект.ЗаписатьДанныеРасчета(Объект.ДанныеРасчетаЗП, Период);
|
||||
Если Объект.ДанныеСтраховыхВзносов.Количество() > 0 Тогда
|
||||
Объект.ЗаписатьДанныеСтраховыхВзносов(Объект.ДанныеСтраховыхВзносов, Период);
|
||||
КонецЕсли;
|
||||
Если Объект.ДанныеНДФЛ.Количество() > 0 Тогда
|
||||
Объект.ЗаписатьДанныеНДФЛ(Объект.ДанныеНДФЛ, Период);
|
||||
КонецЕсли;
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
Reference in New Issue
Block a user