v3.0.0.1: Initial release - загрузка данных из Excel

This commit is contained in:
Профи-Софт
2026-07-06 19:45:41 +00:00
commit d0ed6625e2
12 changed files with 1105 additions and 0 deletions
@@ -0,0 +1,292 @@
<?xml version="1.0" encoding="UTF-8"?>
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.21">
<WindowOpeningMode>DontBlock</WindowOpeningMode>
<Group>Vertical</Group>
<VerticalScroll>useIfNecessary</VerticalScroll>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<Autofill>false</Autofill>
<ChildItems>
<Button name="ВыбратьФайл" id="1">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.ВыбратьФайл</CommandName>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Выбрать файл</v8:content>
</v8:item>
</Title>
</Button>
<Button name="ЗагрузитьДанные" id="2">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.ЗагрузитьДанные</CommandName>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Загрузить данные</v8:content>
</v8:item>
</Title>
</Button>
<Button name="ЗаписатьДанные" id="3">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.ЗаписатьДанные</CommandName>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Записать данные</v8:content>
</v8:item>
</Title>
</Button>
</ChildItems>
</AutoCommandBar>
<Events>
<Event name="OnCreateAtServer">ПриСозданииНаСервере</Event>
</Events>
<ChildItems>
<UsualGroup name="ОсновнаяГруппа" id="10">
<Group>Vertical</Group>
<ChildItems>
<UsualGroup name="ГруппаПараметры" id="20">
<Group>Horizontal</Group>
<ChildItems>
<LabelField name="ЗаголовокПутьКФайлу" id="21">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Путь к файлу:</v8:content>
</v8:item>
</Title>
</LabelField>
<InputField name="ПутьКФайлу" id="22">
<DataPath>Объект.ПутьКФайлу</DataPath>
<Width>80</Width>
</InputField>
<InputField name="МесяцЗагрузки" id="23">
<DataPath>Объект.МесяцЗагрузки</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Месяц:</v8:content>
</v8:item>
</Title>
<Width>10</Width>
</InputField>
</ChildItems>
</UsualGroup>
<Pages name="ГруппаДанные" id="30">
<ChildItems>
<Page name="СтраницаРасчетЗП" id="31">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Расчет ЗП</v8:content>
</v8:item>
</Title>
<ChildItems>
<TableBox name="ТаблицаРасчетЗП" id="32">
<DataPath>Объект.ДанныеРасчетаЗП</DataPath>
<ColumnInitializationOnInput>DoNotUse</ColumnInitializationOnInput>
<ChildItems>
<Column name="ФИО" id="33">
<DataPath>ФИО</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ФИО</v8:content>
</v8:item>
</Title>
<Width>30</Width>
</Column>
<Column name="Должность" id="34">
<DataPath>Должность</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Должность</v8:content>
</v8:item>
</Title>
<Width>25</Width>
</Column>
<Column name="Оклад" id="35">
<DataPath>Оклад</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Оклад</v8:content>
</v8:item>
</Title>
<Width>12</Width>
</Column>
<Column name="ИтогоНачислено" id="36">
<DataPath>ИтогоНачислено</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Итого начислено</v8:content>
</v8:item>
</Title>
<Width>15</Width>
</Column>
<Column name="НДФЛ" id="37">
<DataPath>НДФЛ</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>НДФЛ</v8:content>
</v8:item>
</Title>
<Width>12</Width>
</Column>
<Column name="ВсегоНаРуки" id="38">
<DataPath>ВсегоНаРуки</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Всего на руки</v8:content>
</v8:item>
</Title>
<Width>15</Width>
</Column>
</ChildItems>
</TableBox>
</ChildItems>
</Page>
<Page name="СтраницаСтраховыеВзносы" id="39">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Страховые взносы</v8:content>
</v8:item>
</Title>
<ChildItems>
<TableBox name="ТаблицаСтраховыеВзносы" id="40">
<DataPath>Объект.ДанныеСтраховыхВзносов</DataPath>
<ColumnInitializationOnInput>DoNotUse</ColumnInitializationOnInput>
<ChildItems>
<Column name="ФИО" id="41">
<DataPath>ФИО</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ФИО</v8:content>
</v8:item>
</Title>
<Width>30</Width>
</Column>
<Column name="ДТ6Процент" id="42">
<DataPath>ДТ6Процент</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ДТ 6%</v8:content>
</v8:item>
</Title>
<Width>12</Width>
</Column>
<Column name="ДТ4Процент" id="43">
<DataPath>ДТ4Процент</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ДТ 4%</v8:content>
</v8:item>
</Title>
<Width>12</Width>
</Column>
<Column name="ПФСтраховая" id="44">
<DataPath>ПФСтраховая</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ПФ страховая</v8:content>
</v8:item>
</Title>
<Width>12</Width>
</Column>
<Column name="ФССФОМС" id="45">
<DataPath>ФССФОМС</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ФСС/ФОМС</v8:content>
</v8:item>
</Title>
<Width>12</Width>
</Column>
<Column name="Итого" id="46">
<DataPath>Итого</DataPath>
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Итого</v8:content>
</v8:item>
</Title>
<Width>12</Width>
</Column>
</ChildItems>
</TableBox>
</ChildItems>
</Page>
</ChildItems>
</Pages>
</ChildItems>
</UsualGroup>
</ChildItems>
<Attributes>
<Attribute name="Объект" id="1">
<Type>
<v8:Type>cfg:DataProcessorObject.ЗагрузкаДанныхИзExcel</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
</Attributes>
<Commands>
<Command name="ВыбратьФайл" id="1">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Выбрать файл</v8:content>
</v8:item>
</Title>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Выбрать Excel файл для загрузки</v8:content>
</v8:item>
</ToolTip>
<Action>ВыбратьФайл</Action>
<CurrentRowUse>DontUse</CurrentRowUse>
</Command>
<Command name="ЗагрузитьДанные" id="2">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Загрузить данные</v8:content>
</v8:item>
</Title>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Загрузить данные из выбранного файла</v8:content>
</v8:item>
</ToolTip>
<Action>ЗагрузитьДанные</Action>
<CurrentRowUse>DontUse</CurrentRowUse>
</Command>
<Command name="ЗаписатьДанные" id="3">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Записать данные</v8:content>
</v8:item>
</Title>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Записать загруженные данные в 1С</v8:content>
</v8:item>
</ToolTip>
<Action>ЗаписатьДанные</Action>
<CurrentRowUse>DontUse</CurrentRowUse>
</Command>
</Commands>
</Form>
@@ -0,0 +1,213 @@
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ИнициализироватьТаблицы();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКоманд
&НаКлиенте
Процедура ВыбратьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.МножественныйВыбор = Ложь;
Диалог.Фильтр = "Excel файлы (*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm";
Если Диалог.Выбрать() Тогда
Объект.ПутьКФайлу = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьДанные(Команда)
Если Не ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
Сообщить("Выберите файл!");
Возврат;
КонецЕсли;
ПрочитатьExcelНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьДанные(Команда)
Если Объект.ДанныеРасчетаЗП.Количество() = 0 Тогда
Сообщить("Нет данных для записи!");
Возврат;
КонецЕсли;
ЗаписатьДанныеНаСервере();
Сообщить("Данные записаны!");
КонецПроцедуры
#КонецОбласти
#Область РаботаСExcel
&НаКлиенте
Функция ПрочитатьЯчейку(Лист, Строка, Колонка, ФИО, ВидДанных)
Попытка
Значение = Лист.Cells(Строка, Колонка).Value;
Если Значение = Неопределено ИЛИ Значение = "" Тогда
Возврат 0;
КонецЕсли;
Возврат Число(Значение);
Исключение
Сообщить("Ошибка чтения ячейки: " + ФИО + " | " + ВидДанных
+ " | строка " + Строка + " колонка " + Колонка
+ " | значение: """ + Значение + """ | " + ОписаниеОшибки());
Возврат 0;
КонецПопытки;
КонецФункции
&НаКлиенте
Функция ПрочитатьСтроку(Лист, Строка, Колонка)
Попытка
Значение = Лист.Cells(Строка, Колонка).Value;
Если Значение = Неопределено Тогда
Возврат "";
КонецЕсли;
Возврат СокрЛП("" + Значение);
Исключение
Возврат "";
КонецПопытки;
КонецФункции
&НаКлиенте
Процедура ПрочитатьExcelНаКлиенте()
Попытка
ВременныйФайл = КаталогВременныхФайлов() + "temp_data.xls";
КопироватьФайл(Объект.ПутьКФайлу, ВременныйФайл);
Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open(ВременныйФайл);
ЛистРасчет = Неопределено;
Для Каждого Лист Из Книга.Sheets Цикл
Если ВРег(Лист.Name) = "РАСЧЕТ" Тогда
ЛистРасчет = Лист;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЛистРасчет = Неопределено Тогда
Сообщить("Лист 'Расчет' не найден!");
Книга.Close(Ложь);
Excel.Quit();
УдалитьФайлы(ВременныйФайл);
Возврат;
КонецЕсли;
МесяцЗначение = ЛистРасчет.Cells(4, 1).Value;
Если ЗначениеЗаполнено(МесяцЗначение) Тогда
Попытка
Объект.МесяцЗагрузки = Число(МесяцЗначение);
Исключение
Сообщить("Не удалось определить месяц из ячейки A4: " + МесяцЗначение);
КонецПопытки;
КонецЕсли;
ПоследняяСтрока = ЛистРасчет.Cells(1000, 1).End(-4121).Row;
МассивДанных = Новый Массив;
МассивВзносов = Новый Массив;
Для Ном = 16 По ПоследняяСтрока Цикл
ФИО = ПрочитатьСтроку(ЛистРасчет, Ном, 1);
Если Не ЗначениеЗаполнено(ФИО) Тогда Продолжить; КонецЕсли;
Если СтрНачинаетсяС(ВРег(ФИО), "ИТОГО") Тогда Продолжить; КонецЕсли;
Строка = Новый Структура;
Строка.Вставить("ФИО", ФИО);
Строка.Вставить("Должность", ПрочитатьСтроку(ЛистРасчет, Ном, 2));
Строка.Вставить("СчетБК", ПрочитатьСтроку(ЛистРасчет, Ном, 3));
Строка.Вставить("ВидЗанятости", ПрочитатьСтроку(ЛистРасчет, Ном, 4));
Строка.Вставить("Оклад", ПрочитатьЯчейку(ЛистРасчет, Ном, 8, ФИО, "Оклад"));
Строка.Вставить("КоличествоСтавок", ПрочитатьЯчейку(ЛистРасчет, Ном, 7, ФИО, "Кол-во ставок"));
Строка.Вставить("ОтработаноДней", ПрочитатьЯчейку(ЛистРасчет, Ном, 6, ФИО, "Отработано дней"));
Строка.Вставить("ИтогоНачислено", ПрочитатьЯчейку(ЛистРасчет, Ном, 39, ФИО, "Итого начислено"));
Строка.Вставить("НДФЛ", ПрочитатьЯчейку(ЛистРасчет, Ном, 40, ФИО, "НДФЛ"));
Строка.Вставить("ИтогоУдержано", ПрочитатьЯчейку(ЛистРасчет, Ном, 53, ФИО, "Итого удержано"));
Строка.Вставить("ВсегоНаРуки", ПрочитатьЯчейку(ЛистРасчет, Ном, 55, ФИО, "Всего на руки"));
МассивДанных.Добавить(Строка);
СВ = ПрочитатьЯчейку(ЛистРасчет, Ном, 63, ФИО, "Страховые взносы итого");
Если СВ > 0 Тогда
СтрВзносов = Новый Структура;
СтрВзносов.Вставить("ФИО", ФИО);
СтрВзносов.Вставить("ДТ6Процент", ПрочитатьЯчейку(ЛистРасчет, Ном, 58, ФИО, "ДТ 6%"));
СтрВзносов.Вставить("ДТ4Процент", ПрочитатьЯчейку(ЛистРасчет, Ном, 59, ФИО, "ДТ 4%"));
СтрВзносов.Вставить("ПФСтраховая", ПрочитатьЯчейку(ЛистРасчет, Ном, 60, ФИО, "ПФ страховая"));
СтрВзносов.Вставить("ФССФОМС", ПрочитатьЯчейку(ЛистРасчет, Ном, 61, ФИО, "ФСС/ФОМС"));
СтрВзносов.Вставить("НСПЗ", ПрочитатьЯчейку(ЛистРасчет, Ном, 62, ФИО, "НС и ПЗ"));
СтрВзносов.Вставить("Итого", СВ);
МассивВзносов.Добавить(СтрВзносов);
КонецЕсли;
КонецЦикла;
Книга.Close(Ложь);
Excel.Quit();
УдалитьФайлы(ВременныйФайл);
ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов);
Сообщить("Загружено сотрудников: " + МассивДанных.Количество());
Исключение
Сообщить("Ошибка чтения Excel: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
#КонецОбласти
#Область СерверныеПроцедуры
&НаСервере
Процедура ИнициализироватьТаблицы()
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТаблицыНаСервере(МассивДанных, МассивВзносов)
ТЗРасчет = РеквизитФормыВЗначение("Объект.ДанныеРасчетаЗП");
ТЗРасчет.Очистить();
Для Каждого Эл Из МассивДанных Цикл
Строка = ТЗРасчет.Добавить();
ЗаполнитьЗначенияСвойств(Строка, Эл);
КонецЦикла;
ЗначениеВРеквизитФормы(ТЗРасчет, "Объект.ДанныеРасчетаЗП");
ТЗВзносы = РеквизитФормыВЗначение("Объект.ДанныеСтраховыхВзносов");
ТЗВзносы.Очистить();
Для Каждого Эл Из МассивВзносов Цикл
Строка = ТЗВзносы.Добавить();
ЗаполнитьЗначенияСвойств(Строка, Эл);
КонецЦикла;
ЗначениеВРеквизитФормы(ТЗВзносы, "Объект.ДанныеСтраховыхВзносов");
КонецПроцедуры
&НаСервере
Процедура ЗаписатьДанныеНаСервере()
ГодЗагрузки = ТекущаяДата().Год();
Период = Дата(ГодЗагрузки, Объект.МесяцЗагрузки, 1);
ТЗРасчет = РеквизитФормыВЗначение("Объект.ДанныеРасчетаЗП");
Объект.ЗаписатьДанныеРасчета(ТЗРасчет, Период);
ТЗВзносы = РеквизитФормыВЗначение("Объект.ДанныеСтраховыхВзносов");
Если ТЗВзносы.Количество() > 0 Тогда
Объект.ЗаписатьДанныеСтраховыхВзносов(ТЗВзносы, Период);
КонецЕсли;
КонецПроцедуры
#КонецОбласти