Функция загрузки табеля отделена для безопасной отработки выхода по

ошибке
This commit is contained in:
tsvetkoff
2026-08-13 21:37:27 +05:00
parent 090ae55ddf
commit bcadc737b7
7 changed files with 508 additions and 495 deletions
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="f3b01825-0b99-4164-8e92-f4d0535f9033">
<name>ПС_Описание</name>
<name>ПС_ЗагрузкаДанныхИзExcel_Описание</name>
<synonym>
<key>ru</key>
<value>Описание</value>
@@ -75,7 +75,7 @@
<commonModules>CommonModule.КадровыйУчетВызовСервера</commonModules>
<commonModules>CommonModule.КадровыйУчетБазовый</commonModules>
<commonModules>CommonModule.УчетРабочегоВремениРасширенный</commonModules>
<commonModules>CommonModule.ПС_Описание</commonModules>
<commonModules>CommonModule.ПС_ЗагрузкаДанныхИзExcel_Описание</commonModules>
<commonModules>CommonModule.ПС_КартаДанных</commonModules>
<catalogs>Catalog.Организации</catalogs>
<catalogs>Catalog.ПодразделенияОрганизаций</catalogs>
@@ -596,6 +596,42 @@
ФайлДанных.Прочитать(ИмяФайла);
ИначеЕсли Прав(ИмяФайла, 3)="xls" ИЛИ (Прав(ИмяФайла, 4)="xlsx") Тогда
Ждать ЗагрузитьДанныеИзФайлаExcel(ИмяФайла);
КонецЕсли;
КонецЕсли;
НайтиРанееЗагруженныйТабель();
ОпределитьВидимостьСтраниц();
Элементы.ГруппаСтраницы.ТекущаяСтраница = СтраницаФормыПоСтатьеФинансирования(ТекущаяСтатьяФинансирования);
ЗаписатьКоличествоСотрудниковПоСтатьеФинансирования(ТекущаяСтатьяФинансирования);
//ОбновитьСписокЗагруженныхТабелей();
ДанныеИзменены = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытьExcel(Excel)
Если Excel = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
Если Excel.ActiveWorkbook <> Неопределено Тогда
Excel.ActiveWorkbook.Close(False);
КонецЕсли;
Исключение
КонецПопытки;
Попытка
Excel.Quit();
Исключение
КонецПопытки;
Excel = Неопределено;
КонецПроцедуры
&НаКлиенте
Асинх Функция ЗагрузитьДанныеИзФайлаExcel(ИмяФайла)
Перем Excel;
Excel = Неопределено;
ИмяФайлаКраткое = Прав(ИмяФайла, СтрДлина(ИмяФайла) - СтрНайти(ИмяФайла, "\", НаправлениеПоиска.СКонца));
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ИмяФайла, 2, True);
@@ -605,23 +641,18 @@
Исключение
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
Возврат;
ЗакрытьExcel(Excel);
Возврат Неопределено;
КонецПопытки;
Попытка
//Открываем необходимый лист
Excel.Sheets(1).Select();
// лист 1, по умолчанию
Исключение //Закрываем Excel
Excel.ActiveWorkbook.Close();
Excel = 0;
Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
Возврат;
Исключение
Сообщить("Файл "+ИмяФайла+" не соответствует необходимому формату! Первый лист не найден!");
ЗакрытьExcel(Excel);
Возврат Неопределено;
КонецПопытки;
// СтрокаОпределенияФормата = Excel.Cells(10, 1).Text;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Определен файл выгрузки данных табеля учета рабочего времени.";
Сообщение.Сообщить();
@@ -854,11 +885,11 @@
ТабличнаяЧасть = ИмяТабличнойЧастиПоСтатьеФинансирования(ТекущаяСтатьяФинансирования);
Объект[ТабличнаяЧасть].Очистить();
Иначе
Возврат
ЗакрытьExcel(Excel);
Возврат Неопределено;
КонецЕсли;
НомерСтрокиТабеля = 1;
//Оценка количества сотрудников
МаксимальноеКоличествоСотрудников = 0;
Если ПродолжитьЦикл Тогда
Состояние("Загрузка файла табеля """ + ИмяФайлаКраткое + """",1,"Оценка размера файла...");
@@ -911,7 +942,6 @@
Объект.Организация,
Объект.КонецПериодаТабеля,
ИФ);
Иначе
КоличествоСовместителей = КоличествоСовместителей + 1;
КонецЕсли;
@@ -938,29 +968,25 @@
ТекущаяСтрокаТабличнойЧасти.Сотрудник = Сотрудник;
ТекущаяСтрокаТабличнойЧасти.Должность = Должность;
ВремяИтог = СокрЛП(Excel.Cells(НомерТекущейСтроки, Колонка_ВремяИтог).Text);
ТекущаяСтрокаТабличнойЧасти.ВремяИтог = ВремяИтог;
Если ВысотаСтроки = 3 Тогда //Есть ночные
Если ВысотаСтроки = 3 Тогда
НоваяСтрокаНочныхЧасовТабличнойЧасти = Объект[ТабличнаяЧасть].Добавить();
Если ЗначениеЗаполнено(ФИО) Тогда
ФИОСотрудника = ФИО;
КонецЕсли;
НоваяСтрокаНочныхЧасовТабличнойЧасти.ФИОСотрудника = ФИОСотрудника;
НоваяСтрокаНочныхЧасовТабличнойЧасти.ТабельныйНомер = ТабельныйНомер;
НоваяСтрокаНочныхЧасовТабличнойЧасти.ДолжностьСотрудника = НаименованиеДолжностиСотрудника;
НоваяСтрокаНочныхЧасовТабличнойЧасти.Сотрудник = Сотрудник;
ВремяИтог = СокрЛП(Excel.Cells(НомерТекущейСтроки + 1, Колонка_ВремяИтог).Text);
НоваяСтрокаНочныхЧасовТабличнойЧасти.ВремяИтог = ВремяИтог;
КонецЕсли;
Для ЧислоДня = 1 По КонецМесяцаТабеля Цикл // число для отладки
Для ЧислоДня = 1 По КонецМесяцаТабеля Цикл
ИмяКолонкиЦифра = "Часов" + ЧислоДня;
ИмяКолонкиБуква = "Время" + ЧислоДня + "Буква";
ИмяКолонкиВидВремени = "ВидВремени" + ЧислоДня;
НомерКолонкиФайла = НК+ЧислоДня;
@@ -970,7 +996,7 @@
КоличествоНочныхЧасов = 0;
КоличествоЧасов = 0;
НайденоРабочееВремя = Ложь;
Если ВысотаСтроки = 3 Тогда //Есть ночные
Если ВысотаСтроки = 3 Тогда
ТекстЯчейки = ВРег(СокрЛП(Excel.Cells(НомерТекущейСтроки+1, НомерКолонкиФайла).Text));
Если (Найти(ТекстЯчейки,"Н") > 0) и (Найти(ТекстЯчейки,"НН") = 0) и
(Найти(ТекстЯчейки,"НБ") = 0) и (Найти(ТекстЯчейки,"НОД") = 0) и
@@ -984,7 +1010,6 @@
Если Найти(ТекстКоличестваНочныхЧасов_2,"Н") = 0 Тогда
ТекстКоличестваНочныхЧасов = ТекстКоличестваНочныхЧасов_2;
КонецЕсли;
Если ТекстКоличестваНочныхЧасов = "" Тогда
КоличествоНочныхЧасов = 0;
Иначе
@@ -1016,7 +1041,6 @@
Попытка
КоличествоЧасов = Число(ТекстКоличестваЧасов);
Исключение
Сообщение = Новый СообщениеПользователю;
СообщениеОбОшибкеВидаВремени = "Ошибка получения часов по табелю. Сотрудник: " + ФИО +
". Номер дня: " + Строка(ЧислоДня);
ИнформационноеСообщение(СообщениеОбОшибкеВидаВремени,СтатусСообщения.ОченьВажное);
@@ -1027,54 +1051,54 @@
Если ТекстЯчейки = "" Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениВыходныеДни();
ИначеЕсли Найти(ТекстЯчейки,"Ф") = 1 Тогда //Явка
ИначеЕсли Найти(ТекстЯчейки,"Ф") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениЯвка();
НайденоРабочееВремя = Истина;
ИначеЕсли Найти(ТекстЯчейки,"С") = 1 Тогда //Сверхурочные
ИначеЕсли Найти(ТекстЯчейки,"С") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениСверхурочные();
НайденоРабочееВремя = Истина;
ИначеЕсли Найти(ТекстЯчейки,"РП") = 1 Тогда //Праздничные и выходные
ИначеЕсли Найти(ТекстЯчейки,"РП") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениПраздники();
НайденоРабочееВремя = Истина;
ИначеЕсли Найти(ТекстЯчейки,"В") = 1 Тогда //Выходные и праздничные дни
ИначеЕсли Найти(ТекстЯчейки,"В") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениВыходныеДни();
ИначеЕсли Найти(ТекстЯчейки,"К") = 1 Тогда //Больничный
ИначеЕсли Найти(ТекстЯчейки,"К") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениКомандировка();
ИначеЕсли Найти(ТекстЯчейки,"Б") = 1 Тогда //Больничный
ИначеЕсли Найти(ТекстЯчейки,"Б") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениБолезнь();
ИначеЕсли Найти(ТекстЯчейки,"Р") = 1 Тогда //Отпуск по беременности и родам
ИначеЕсли Найти(ТекстЯчейки,"Р") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениОтпускПоБеременностиИРодам();
ИначеЕсли Найти(ТекстЯчейки,"ОР") = 1 Тогда //Отпуск по уходу за ребенком
ИначеЕсли Найти(ТекстЯчейки,"ОР") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениОтпускПоУходуЗаРебенком();
ИначеЕсли Найти(ТекстЯчейки,"П") = 1 Тогда //Прогул
ИначеЕсли Найти(ТекстЯчейки,"П") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениПрогулы();
ИначеЕсли Найти(ТекстЯчейки,"А") = 1 Тогда //Прогул
ИначеЕсли Найти(ТекстЯчейки,"А") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениДополнительныеВыходныеДниОплачиваемые();
ИначеЕсли Найти(ТекстЯчейки,"О") = 1 Тогда //Отпуск основной
ИначеЕсли Найти(ТекстЯчейки,"О") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениОсновнойОтпуск();
ИначеЕсли Найти(ТекстЯчейки,"ОД") = 1 Тогда //Отпуск дополнительный
ИначеЕсли Найти(ТекстЯчейки,"ОД") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениДополнительныйОтпуск();
ИначеЕсли Найти(ТекстЯчейки,"ОУ") = 1 Тогда //Отпуск учебный
ИначеЕсли Найти(ТекстЯчейки,"ОУ") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениОтпускНаОбучение();
ИначеЕсли Найти(ТекстЯчейки,"ВУ") = 1 Тогда //Отпуск учебный
ИначеЕсли Найти(ТекстЯчейки,"ВУ") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениДополнительныеВыходныеДниОплачиваемые();
ИначеЕсли Найти(ТекстЯчейки,"НН") = 1 Тогда //Неявки по невыясненным причинам
ИначеЕсли Найти(ТекстЯчейки,"НН") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениНеявкиПоНевыясненнымПричинам();
ИначеЕсли Найти(ТекстЯчейки,"ОЗ") = 1 Тогда //Отпуск учебный
ИначеЕсли Найти(ТекстЯчейки,"ОЗ") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениНеоплачиваемыйОтпускПоРазрешениюРаботодателя();
ИначеЕсли Найти(ТекстЯчейки,"ОВ") = 1 Тогда //Отпуск учебный
ИначеЕсли Найти(ТекстЯчейки,"ОВ") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениДополнительныеВыходныеДниОплачиваемые();
ИначеЕсли Найти(ТекстЯчейки,"НБ") = 1 Тогда //Отпуск учебный
ИначеЕсли Найти(ТекстЯчейки,"НБ") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениОтстранениеОтРаботыБезОплаты();
ИначеЕсли Найти(ТекстЯчейки,"НОД") = 1 Тогда //Отпуск учебный
ИначеЕсли Найти(ТекстЯчейки,"НОД") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениДополнительныеВыходныеДниОплачиваемые();
ИначеЕсли Найти(ТекстЯчейки,"ДВ") = 1 Тогда //Отпуск учебный
ИначеЕсли Найти(ТекстЯчейки,"ДВ") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениДополнительныеВыходныеДниОплачиваемые();
ИначеЕсли Найти(ТекстЯчейки,"Д") = 1 Тогда //Отпуск учебный
ИначеЕсли Найти(ТекстЯчейки,"Д") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениДополнительныеВыходныеДниОплачиваемые();
ИначеЕсли Найти(ТекстЯчейки,"НА") = 1 Тогда //Неявка из-за ареста (Неявки по невыясненным причинам)
ИначеЕсли Найти(ТекстЯчейки,"НА") = 1 Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениНеявкиПоНевыясненнымПричинам();
ИначеЕсли Найти(ТекстЯчейки,"НО") = 1 и (Найти(ТекстЯчейки,"НОД") = 0) Тогда //Отпуск учебный
ИначеЕсли Найти(ТекстЯчейки,"НО") = 1 и (Найти(ТекстЯчейки,"НОД") = 0) Тогда
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиВидВремени] = ВидВремениОтстранениеОтРаботыСОплатой();
КонецЕсли;
ТекущаяСтрокаТабличнойЧасти[ИмяКолонкиЦифра] = КоличествоЧасов;
@@ -1095,26 +1119,15 @@
КонецЕсли;
КонецЦикла;
КонецЕсли;
Объект.Комментарий = "Загружено " + Строка(ТекущаяДата()) +
" по данным файлов: """ + ИмяФайлаСГЗ + """, """ + ИмяФайлаПД + """, """ + ИмяФайлаСГЗ + """";
НомерСтрокиТабеля = 100001;
НомерТекущейСтрокиТабличнойЧасти = 100001;
Excel.WorkBooks.Close();
//ЗаполнитьТабличнуюЧасть();
//ОчисткаЗначенийРекрвизитовФормы()
//ЭтаОбработка = РеквизитФормыВЗначение("Объект");
//Объект.Табель.Очистить();
КонецЕсли;
НайтиРанееЗагруженныйТабель();
ОпределитьВидимостьСтраниц();
Элементы.ГруппаСтраницы.ТекущаяСтраница = СтраницаФормыПоСтатьеФинансирования(ТекущаяСтатьяФинансирования);
ЗаписатьКоличествоСотрудниковПоСтатьеФинансирования(ТекущаяСтатьяФинансирования);
//ОбновитьСписокЗагруженныхТабелей();
ДанныеИзменены = Истина;
КонецПроцедуры
ЗакрытьExcel(Excel);
Возврат ТекущаяСтатьяФинансирования;
КонецФункции
&НаСервере
Процедура НайтиРанееЗагруженныйТабель()
@@ -35,7 +35,7 @@
//
// Общие модули:
// ПС_РаботаСНастройками — программный интерфейс (Сервер)
// ПС_Описание — настоящий модуль документации
// ПС_ПериодическиеНастройки_Описание — настоящий модуль документации
//
// ПРИНЦИП ЗАПИСИ БЕЗ УКАЗАНИЯ ПЕРИОДА
//
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="6d9ceeed-89b2-436f-8698-d7314fff223f">
<name>ПС_Описание</name>
<name>ПС_ПериодическиеНастройки_Описание</name>
<synonym>
<key>ru</key>
<value>Описание</value>
@@ -46,7 +46,7 @@
</languages>
<roles>Role.ПС_ЗаписьНастроек</roles>
<roles>Role.ПС_ЧтениеНастроек</roles>
<commonModules>CommonModule.ПС_Описание</commonModules>
<commonModules>CommonModule.ПС_ПериодическиеНастройки_Описание</commonModules>
<commonModules>CommonModule.ПС_РаботаСНастройками</commonModules>
<definedTypes>DefinedType.ПС_ТипыЗначенийНастроек</definedTypes>
<catalogs>Catalog.Пользователи</catalogs>