From d131d0aad5f632d1d3fc7906b617269b9102b285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=84=D0=B8-=D0=A1=D0=BE=D1=84=D1=82?= Date: Wed, 8 Jul 2026 11:28:18 +0000 Subject: [PATCH] v3.0.0.8: formula-based reading for xlsm - follow references to employee sheets --- Configuration.xml | 2 +- .../Forms/Форма/Ext/Form/Module.bsl | 46 +++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) 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, ФИО, ИндексЗаголовков); + Иначе + СтрВзносов = ПрочитатьСтрокуВзносов(ЛистРасчет, Ном, ФИО, ИндексЗаголовков); + КонецЕсли; Если СтрВзносов <> Неопределено Тогда МассивВзносов.Добавить(СтрВзносов); КонецЕсли;