v3.0.0.8: formula-based reading for xlsm - follow references to employee sheets
This commit is contained in:
+1
-1
@@ -60,7 +60,7 @@
|
||||
<ScriptVariant>Russian</ScriptVariant>
|
||||
<DefaultLanguage>Language.Русский</DefaultLanguage>
|
||||
<Vendor>ООО "Профи-Софт", код партнера 42575-13, г.Байконур.</Vendor>
|
||||
<Version>3.0.0.6</Version>
|
||||
<Version>3.0.0.7</Version>
|
||||
<DefaultLanguage>Language.Русский</DefaultLanguage>
|
||||
<BriefInformation>
|
||||
<v8:item>
|
||||
|
||||
@@ -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, ФИО, ИндексЗаголовков);
|
||||
Иначе
|
||||
СтрВзносов = ПрочитатьСтрокуВзносов(ЛистРасчет, Ном, ФИО, ИндексЗаголовков);
|
||||
КонецЕсли;
|
||||
Если СтрВзносов <> Неопределено Тогда
|
||||
МассивВзносов.Добавить(СтрВзносов);
|
||||
КонецЕсли;
|
||||
|
||||
Reference in New Issue
Block a user