Загрузка данных из excel в справочники

1. user1869697 11.04.23 11:36 Сейчас в теме
Всем здраствуйте, написал код на загрузку данных из excel. И у меня вопрос, можно ли было его как-нибудь облегчить или сократить?



&НаКлиенте 
Процедура Загрузить(Команда) 
 если объект.ПутьКФайлу = "" тогда 
  сообщ = Новый СообщениеПользователю; 
  сообщ.Текст = "Выберите файл!"; 
  сообщ.Сообщить(); 
 иначе 
  Эксель = Новый COMОбъект("Excel.Application"); 
  КнигаЭксель = Эксель.Workbooks.open(Объект.ПутьКФайлу); 
  Лист1 = КнигаЭксель.WorkSheets(1); 
  п=2; 
  пока п <6 цикл 
   СтруктураДанных = Новый Структура; 
   СтруктураДанных.Вставить("ФИО",СокрЛП(Лист1.Cells(п,1).value)); 
   СтруктураДанных.Вставить("ДатаРождения", СокрЛП(Лист1.Cells(п,2).value)); 
   СтруктураДанных.Вставить("Должность", СокрЛП(Лист1.Cells(п,3).value)); 
   СтруктураДанных.Вставить("Адрес", СокрЛП(Лист1.Cells(п,4).value));  
   СтруктураДанных.Вставить("Телефон", СокрЛП(Лист1.Cells(п,5).value)); 
   СтруктураДанных.Вставить("Почта", СокрЛП(Лист1.Cells(п,6).value)); 
   ЗагрузкаНаСервере(СтруктураДанных); 
   п=п+1; 
  конеццикла; 
  сообщ = новый СообщениеПользователю; 
  сообщ.Текст = "Данные были успешно загружены!"; 
  сообщ.Сообщить(); 
  эксель.Application.Quit(); 
 конецесли; 
КонецПроцедуры 
 
&НаКлиенте 
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) 
 режим = РежимДиалогаВыбораФайла.Открытие; 
 ДиалогОткрытияФайла = новый ДиалогВыбораФайла(режим); 
 ДиалогОткрытияФайла.ПолноеИмяФайла = ""; 
 Фильтр = НСтр("ru = 'Файл XLSX'; en = 'XLSX file'") + "(*.xlsx)|*.xlsx"; 
 ДиалогОткрытияФайла.Фильтр = фильтр; 
 ДиалогОткрытияФайла.МножественныйВыбор = ложь; 
 ДиалогОткрытияФайла.Заголовок = "Выберите файл"; 
 ДиалогОткрытияФайла.Показать(Новый ОписаниеОповещения("ПутьКФайлу", ЭтотОбъект, новый Структура("ДиалогОткрытияФайла",ДиалогОткрытияФайла)));   
  
КонецПроцедуры 
 
&НаКлиенте 
Процедура ПутьКФайлу(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт 
 ДиалогОткрытияФайла = ДополнительныеПараметры.ДиалогОткрытияФайла; 
 Если ВыбранныеФайлы <> Неопределено тогда 
  Объект.ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла; 
 иначе 
  ПоказатьПредупреждение(Неопределено, "Файл не выбран!"); 
 КонецЕсли 
КонецПроцедуры  
 
&НаСервере 
 
Процедура ЗагрузкаНаСервере(СтруктураДанных) 
 если Справочники.Должности.НайтиПоНаименованию(СтруктураДанных.Должность) = Справочники.Должности.ПустаяСсылка() тогда
		ДобавлениеДолжность = Справочники.Должности.СоздатьЭлемент();
		ДобавлениеДолжность.Наименование = СтруктураДанных.Должность;
		ДобавлениеДолжность.Записать();
	конецесли;
	если Справочники.Сотрудники.НайтиПоНаименованию(СтруктураДанных.ФИО) = Справочники.Сотрудники.ПустаяСсылка() тогда
		ДобавлениеФИО = Справочники.Сотрудники.СоздатьЭлемент();
		ДобавлениеФИО.Наименование = СтруктураДанных.ФИО;
		ДобавлениеФИО.ДатаРождения = СтруктураДанных.ДатаРождения;
	    	ДобавлениеФИО.Должность = Справочники.Должности.НайтиПоНаименованию(СтруктураДанных.Должность);
		ДобавлениеФИО.Адрес = СтруктураДанных.Адрес;
		ДобавлениеФИО.Телефон = СтруктураДанных.Телефон;
		ДобавлениеФИО.Email = СтруктураДанных.Почта;
		ДобавлениеФИО.Записать();		
	конецесли;
КонецПроцедуры 
 
Показать
По теме из базы знаний
Найденные решения
3. ONLYTILT 20 11.04.23 12:37 Сейчас в теме
(1)
&НаКлиенте
Асинх Процедура Загрузить(Команда)
	
	ОписаниеПомещенногоФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, Объект.ПутьКФайлу, УникальныйИдентификатор);

	ЗагрузитьНаСервере(ОписаниеПомещенногоФайла.Адрес);
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	
	ДвоичныеДанные.Записать(ИмяВременногоФайла);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.Прочитать(ИмяВременногоФайла);
		
	ПостроительЗапроса = Новый ПостроительЗапроса;
	ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область(1, 1, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы));
	ПостроительЗапроса.Выполнить();
	
	ТаблицаЗначений = ПостроительЗапроса.Результат.Выгрузить();
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ВЫРАЗИТЬ(Таблица.ФИО КАК СТРОКА(150)) КАК ФИО,
	|	Таблица.ДатаРождения КАК ДатаРождения,
	|	ВЫРАЗИТЬ(Таблица.Должность КАК СТРОКА(150)) КАК Должность,
	|	Таблица.Адрес КАК Адрес,
	|	Таблица.Телефон КАК Телефон,
	|	Таблица.Почта КАК Почта
	|ПОМЕСТИТЬ Таблица
	|ИЗ
	|	&Таблица КАК Таблица
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	Таблица.Должность КАК Должность,
	|	Должности.Ссылка КАК Ссылка
	|ПОМЕСТИТЬ Должности
	|ИЗ
	|	Таблица КАК Таблица
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Должности
	|		ПО Таблица.Должность = Должности.Наименование
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	Должности.Должность КАК Должность
	|ИЗ
	|	Должности КАК Должности
	|ГДЕ
	|	Должности.Ссылка ЕСТЬ NULL
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	Таблица.ФИО КАК ФИО,
	|	Таблица.ДатаРождения КАК ДатаРождения,
	|	Таблица.Должность КАК ДолжностьСтрока,
	|	Таблица.Адрес КАК Адрес,
	|	Таблица.Телефон КАК Телефон,
	|	Таблица.Почта КАК Почта,
	|	МАКСИМУМ(ЕСТЬNULL(Должности.Ссылка, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка))) КАК Должность
	|ИЗ
	|	Таблица КАК Таблица
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
	|		ПО Таблица.ФИО = Сотрудники.Наименование
	|		ЛЕВОЕ СОЕДИНЕНИЕ Должности КАК Должности
	|		ПО Таблица.Должность = Должности.Должность
	|ГДЕ
	|	Сотрудники.Ссылка ЕСТЬ NULL
	|
	|СГРУППИРОВАТЬ ПО
	|	Таблица.ФИО,
	|	Таблица.ДатаРождения,
	|	Таблица.Должность,
	|	Таблица.Адрес,
	|	Таблица.Телефон,
	|	Таблица.Почта");
	Запрос.УстановитьПараметр("Таблица", ТаблицаЗначений);
	
	РезультатПакет = Запрос.ВыполнитьПакет();
	
	ВыборкаДолжности 	= РезультатПакет[2].Выбрать();
	ВыборкаСотрудники	= РезультатПакет[3].Выбрать();
	
	СозданныеДолжности = Новый Соответствие;
	
	Пока ВыборкаДолжности.Следующий() Цикл
		
		ДолжностьОбъект = Справочники.Должности.СоздатьЭлемент();
		ДолжностьОбъект.Наименование = СокрЛП(ВыборкаДолжности.Должность);
		ДолжностьОбъект.Записать();
		
		СозданныеДолжности.Вставить(ДолжностьОбъект.Наименование, ДолжностьОбъект.Ссылка);
		
	КонецЦикла;
	
	Пока ВыборкаСотрудники.Следующий() Цикл
		
		СотрудникОбъект = Справочники.Сотрудники.СоздатьЭлемент();
		
		СотрудникОбъект.Наименование	= СокрЛП(ВыборкаСотрудники.ФИО);
		СотрудникОбъект.ДатаРождения 	= СокрЛП(ВыборкаСотрудники.ДатаРождения);
		СотрудникОбъект.Адрес 			= СокрЛП(ВыборкаСотрудники.Адрес);
		СотрудникОбъект.Телефон 		= СокрЛП(ВыборкаСотрудники.Телефон);
		СотрудникОбъект.Email 			= СокрЛП(ВыборкаСотрудники.Почта);
		
		Если НЕ ЗначениеЗаполнено(ВыборкаСотрудники.Должность) Тогда
			СотрудникОбъект.Должность = СозданныеДолжности.Получить(СокрЛП(ВыборкаСотрудники.ДолжностьСтрока));	
		Иначе 
			СотрудникОбъект.Должность = ВыборкаСотрудники.Должность;	
		КонецЕсли;
		
		СотрудникОбъект.Записать();
		
	КонецЦикла;
	
КонецПроцедуры
Показать
user1869697; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DesertPunk 11.04.23 12:03 Сейчас в теме
3. ONLYTILT 20 11.04.23 12:37 Сейчас в теме
(1)
&НаКлиенте
Асинх Процедура Загрузить(Команда)
	
	ОписаниеПомещенногоФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, Объект.ПутьКФайлу, УникальныйИдентификатор);

	ЗагрузитьНаСервере(ОписаниеПомещенногоФайла.Адрес);
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	
	ДвоичныеДанные.Записать(ИмяВременногоФайла);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.Прочитать(ИмяВременногоФайла);
		
	ПостроительЗапроса = Новый ПостроительЗапроса;
	ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область(1, 1, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы));
	ПостроительЗапроса.Выполнить();
	
	ТаблицаЗначений = ПостроительЗапроса.Результат.Выгрузить();
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ВЫРАЗИТЬ(Таблица.ФИО КАК СТРОКА(150)) КАК ФИО,
	|	Таблица.ДатаРождения КАК ДатаРождения,
	|	ВЫРАЗИТЬ(Таблица.Должность КАК СТРОКА(150)) КАК Должность,
	|	Таблица.Адрес КАК Адрес,
	|	Таблица.Телефон КАК Телефон,
	|	Таблица.Почта КАК Почта
	|ПОМЕСТИТЬ Таблица
	|ИЗ
	|	&Таблица КАК Таблица
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	Таблица.Должность КАК Должность,
	|	Должности.Ссылка КАК Ссылка
	|ПОМЕСТИТЬ Должности
	|ИЗ
	|	Таблица КАК Таблица
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Должности
	|		ПО Таблица.Должность = Должности.Наименование
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	Должности.Должность КАК Должность
	|ИЗ
	|	Должности КАК Должности
	|ГДЕ
	|	Должности.Ссылка ЕСТЬ NULL
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	Таблица.ФИО КАК ФИО,
	|	Таблица.ДатаРождения КАК ДатаРождения,
	|	Таблица.Должность КАК ДолжностьСтрока,
	|	Таблица.Адрес КАК Адрес,
	|	Таблица.Телефон КАК Телефон,
	|	Таблица.Почта КАК Почта,
	|	МАКСИМУМ(ЕСТЬNULL(Должности.Ссылка, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка))) КАК Должность
	|ИЗ
	|	Таблица КАК Таблица
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
	|		ПО Таблица.ФИО = Сотрудники.Наименование
	|		ЛЕВОЕ СОЕДИНЕНИЕ Должности КАК Должности
	|		ПО Таблица.Должность = Должности.Должность
	|ГДЕ
	|	Сотрудники.Ссылка ЕСТЬ NULL
	|
	|СГРУППИРОВАТЬ ПО
	|	Таблица.ФИО,
	|	Таблица.ДатаРождения,
	|	Таблица.Должность,
	|	Таблица.Адрес,
	|	Таблица.Телефон,
	|	Таблица.Почта");
	Запрос.УстановитьПараметр("Таблица", ТаблицаЗначений);
	
	РезультатПакет = Запрос.ВыполнитьПакет();
	
	ВыборкаДолжности 	= РезультатПакет[2].Выбрать();
	ВыборкаСотрудники	= РезультатПакет[3].Выбрать();
	
	СозданныеДолжности = Новый Соответствие;
	
	Пока ВыборкаДолжности.Следующий() Цикл
		
		ДолжностьОбъект = Справочники.Должности.СоздатьЭлемент();
		ДолжностьОбъект.Наименование = СокрЛП(ВыборкаДолжности.Должность);
		ДолжностьОбъект.Записать();
		
		СозданныеДолжности.Вставить(ДолжностьОбъект.Наименование, ДолжностьОбъект.Ссылка);
		
	КонецЦикла;
	
	Пока ВыборкаСотрудники.Следующий() Цикл
		
		СотрудникОбъект = Справочники.Сотрудники.СоздатьЭлемент();
		
		СотрудникОбъект.Наименование	= СокрЛП(ВыборкаСотрудники.ФИО);
		СотрудникОбъект.ДатаРождения 	= СокрЛП(ВыборкаСотрудники.ДатаРождения);
		СотрудникОбъект.Адрес 			= СокрЛП(ВыборкаСотрудники.Адрес);
		СотрудникОбъект.Телефон 		= СокрЛП(ВыборкаСотрудники.Телефон);
		СотрудникОбъект.Email 			= СокрЛП(ВыборкаСотрудники.Почта);
		
		Если НЕ ЗначениеЗаполнено(ВыборкаСотрудники.Должность) Тогда
			СотрудникОбъект.Должность = СозданныеДолжности.Получить(СокрЛП(ВыборкаСотрудники.ДолжностьСтрока));	
		Иначе 
			СотрудникОбъект.Должность = ВыборкаСотрудники.Должность;	
		КонецЕсли;
		
		СотрудникОбъект.Записать();
		
	КонецЦикла;
	
КонецПроцедуры
Показать
user1869697; +1 Ответить
5. ONLYTILT 20 11.04.23 12:39 Сейчас в теме
(3)Но условие, что сверху в табличном документе должны быть наименования колонок ФИО ДатаРождения Должность Адрес Телефон Почта
6. ONLYTILT 20 11.04.23 12:46 Сейчас в теме
(3)А, не увидел в тегах 8.3.14, тогда процедуру с Асинх нужно переписать на оповещения
4. Zevzm 11.04.23 12:37 Сейчас в теме
(1)С должностью работа плохая:
1. Не нужно выполнять поиск по наименованию дважды;
2. Если сотрудник существует, а должность у него не заполнена, при этом вы ее создали?
7. user1869697 11.04.23 12:54 Сейчас в теме
(4)А почему не нужно выполнять поиск по наименованию дважды?
8. Zevzm 11.04.23 13:54 Сейчас в теме
(7) Второй поиск это еще один запрос к базе данных, любой лишний запрос к базе данных - это плохо.
Поискали, результат поиска присвоили переменной, если нашли - используете ее дальше, если не нашли - создали новый элемент, после проверки на пустую ссылку и также используете дальше.
user1869697; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот