diff --git a/Configuration.xml b/Configuration.xml
index 13d7098..1aac6a4 100755
--- a/Configuration.xml
+++ b/Configuration.xml
@@ -60,7 +60,7 @@
Russian
Language.Русский
ООО "Профи-Софт", код партнера 42575-13, г.Байконур.
- 3.0.0.6
+ 3.0.0.7
Language.Русский
diff --git a/DataProcessors/ЗагрузкаДанныхИзExcel/Forms/Форма/Ext/Form/Module.bsl b/DataProcessors/ЗагрузкаДанныхИзExcel/Forms/Форма/Ext/Form/Module.bsl
index 3fa31b5..c263b58 100644
--- a/DataProcessors/ЗагрузкаДанныхИзExcel/Forms/Форма/Ext/Form/Module.bsl
+++ b/DataProcessors/ЗагрузкаДанныхИзExcel/Forms/Форма/Ext/Form/Module.bsl
@@ -111,6 +111,22 @@
КонецПопытки;
КонецФункции
+// Извлекает имя листа сотрудника из формулы вида ='ИмяЛиста'!C2
+// Возвращает имя листа или пустую строку.
+&НаКлиенте
+Функция ИзвлечьИмяЛистаИзФормулы(Формула)
+ Если Формула = Неопределено Тогда Возврат ""; КонецЕсли;
+ ТекстФормулы = СокрЛП("" + Формула);
+ Если Не СтрНачинаетсяС(ТекстФормулы, "='") Тогда Возврат ""; КонецЕсли;
+
+ // Ищем закрывающую кавычку после ='
+ ПозицияНачала = 3; // после ='
+ ПозицияКонца = СтрНайти(ТекстФормулы, "'!", , , ПозицияНачала);
+ Если ПозицияКонца = 0 Тогда Возврат ""; КонецЕсли;
+
+ Возврат Сред(ТекстФормулы, ПозицияНачала, ПозицияКонца - ПозицияНачала);
+КонецФункции
+
// Ищет лист по имени (регистронезависимо).
&НаКлиенте
Функция НайтиЛист(Книга, ИмяЛиста)
@@ -387,8 +403,24 @@
КоличествоСтрок = ЛистРасчет.Rows.Count;
Пока Истина Цикл
+ // Попытка 1: читаем значение напрямую (xls)
ФИО = ПрочитатьЯчейкуСтрока(ЛистРасчет, Ном, 0);
+ // Попытка 2: если значение пустое — проверяем формулу (xlsm)
+ ЛистСотрудника = Неопределено;
+ Если Не ЗначениеЗаполнено(ФИО) Тогда
+ Формула = ЛистРасчет.Cells(Ном, 1).Formula;
+ Если ЗначениеЗаполнено(Формула) Тогда
+ ИмяЛиста = ИзвлечьИмяЛистаИзФормулы(Формула);
+ Если ЗначениеЗаполнено(ИмяЛиста) Тогда
+ ЛистСотрудника = НайтиЛист(КонтекстExcel.Книга, ИмяЛиста);
+ Если ЛистСотрудника <> Неопределено Тогда
+ ФИО = ПрочитатьЯчейкуСтрока(ЛистСотрудника, 2, 3);
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+
Если Не ЗначениеЗаполнено(ФИО) Тогда
ПустыхПодряд = ПустыхПодряд + 1;
Если ПустыхПодряд >= МаксПустых Тогда Прервать; КонецЕсли;
@@ -403,8 +435,12 @@
ПрогрессЗаписи = 25 + 65 * (Ном - 1) / Макс(КоличествоСтрок, 1);
Состояние("Расчет ЗП: " + ФИО, ПрогрессЗаписи);
- // Чтение расчетных данных
- Строка = ПрочитатьСтрокуРасчета(ЛистРасчет, Ном, ФИО, ИндексЗаголовков);
+ // Если есть лист сотрудника — читаем из него, иначе из РАСЧЕТ
+ Если ЛистСотрудника <> Неопределено Тогда
+ Строка = ПрочитатьСтрокуРасчета(ЛистСотрудника, 2, ФИО, ИндексЗаголовков);
+ Иначе
+ Строка = ПрочитатьСтрокуРасчета(ЛистРасчет, Ном, ФИО, ИндексЗаголовков);
+ КонецЕсли;
// Чтение личных данных
ЛичныеДанные = ПрочитатьЛичныеДанные(КонтекстExcel.Книга, ФИО);
@@ -415,7 +451,11 @@
МассивДанных.Добавить(Строка);
// Чтение страховых взносов
- СтрВзносов = ПрочитатьСтрокуВзносов(ЛистРасчет, Ном, ФИО, ИндексЗаголовков);
+ Если ЛистСотрудника <> Неопределено Тогда
+ СтрВзносов = ПрочитатьСтрокуВзносов(ЛистСотрудника, 2, ФИО, ИндексЗаголовков);
+ Иначе
+ СтрВзносов = ПрочитатьСтрокуВзносов(ЛистРасчет, Ном, ФИО, ИндексЗаголовков);
+ КонецЕсли;
Если СтрВзносов <> Неопределено Тогда
МассивВзносов.Добавить(СтрВзносов);
КонецЕсли;