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, ФИО, ИндексЗаголовков); + Иначе + СтрВзносов = ПрочитатьСтрокуВзносов(ЛистРасчет, Ном, ФИО, ИндексЗаголовков); + КонецЕсли; Если СтрВзносов <> Неопределено Тогда МассивВзносов.Добавить(СтрВзносов); КонецЕсли;