v3.0.0.8: formula-based reading for xlsm - follow references to employee sheets

This commit is contained in:
Профи-Софт
2026-07-08 11:28:18 +00:00
parent fec6b6b2c2
commit d131d0aad5
2 changed files with 44 additions and 4 deletions
+1 -1
View File
@@ -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, ФИО, ИндексЗаголовков);
Иначе
СтрВзносов = ПрочитатьСтрокуВзносов(ЛистРасчет, Ном, ФИО, ИндексЗаголовков);
КонецЕсли;
Если СтрВзносов <> Неопределено Тогда
МассивВзносов.Добавить(СтрВзносов);
КонецЕсли;