Всем здраствуйте, написал код на загрузку данных из 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 = СтруктураДанных.Почта;
ДобавлениеФИО.Записать();
конецесли;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Загрузка данных из Excel для 1С: Бухгалтерия предприятия 8
- [ШАБЛОН] Выгрузка / Загрузка данных из Excel
- Обработка загрузка данных из Excel для создания банковской выписки в 1С: Бухгалтерия 3
- [ШАБЛОН] Загрузка данных из Excel
- Универсальный шаблон для загрузки данных из Excel и подбора ссылок в любой конфигурации
Найденные решения
(1)
&НаКлиенте
Асинх Процедура Загрузить(Команда)
ОписаниеПомещенногоФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, Объект.ПутьКФайлу, УникальныйИдентификатор);
ЗагрузитьНаСервере(ОписаниеПомещенногоФайла.Адрес);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяВременногоФайла);
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область(1, 1, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы));
ПостроительЗапроса.Выполнить();
ТаблицаЗначений = ПостроительЗапроса.Результат.Выгрузить();
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ВЫРАЗИТЬ(Таблица.ФИО КАК СТРОКА(150)) КАК ФИО,
| Таблица.ДатаРождения КАК ДатаРождения,
| ВЫРАЗИТЬ(Таблица.Должность КАК СТРОКА(150)) КАК Должность,
| Таблица.Адрес КАК Адрес,
| Таблица.Телефон КАК Телефон,
| Таблица.Почта КАК Почта
|ПОМЕСТИТЬ Таблица
|ИЗ
| &Таблица КАК Таблица
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Таблица.Должность КАК Должность,
| Должности.Ссылка КАК Ссылка
|ПОМЕСТИТЬ Должности
|ИЗ
| Таблица КАК Таблица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Должности
| ПО Таблица.Должность = Должности.Наименование
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Должности.Должность КАК Должность
|ИЗ
| Должности КАК Должности
|ГДЕ
| Должности.Ссылка ЕСТЬ NULL
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Таблица.ФИО КАК ФИО,
| Таблица.ДатаРождения КАК ДатаРождения,
| Таблица.Должность КАК ДолжностьСтрока,
| Таблица.Адрес КАК Адрес,
| Таблица.Телефон КАК Телефон,
| Таблица.Почта КАК Почта,
| МАКСИМУМ(ЕСТЬNULL(Должности.Ссылка, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка))) КАК Должность
|ИЗ
| Таблица КАК Таблица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
| ПО Таблица.ФИО = Сотрудники.Наименование
| ЛЕВОЕ СОЕДИНЕНИЕ Должности КАК Должности
| ПО Таблица.Должность = Должности.Должность
|ГДЕ
| Сотрудники.Ссылка ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
| Таблица.ФИО,
| Таблица.ДатаРождения,
| Таблица.Должность,
| Таблица.Адрес,
| Таблица.Телефон,
| Таблица.Почта");
Запрос.УстановитьПараметр("Таблица", ТаблицаЗначений);
РезультатПакет = Запрос.ВыполнитьПакет();
ВыборкаДолжности = РезультатПакет[2].Выбрать();
ВыборкаСотрудники = РезультатПакет[3].Выбрать();
СозданныеДолжности = Новый Соответствие;
Пока ВыборкаДолжности.Следующий() Цикл
ДолжностьОбъект = Справочники.Должности.СоздатьЭлемент();
ДолжностьОбъект.Наименование = СокрЛП(ВыборкаДолжности.Должность);
ДолжностьОбъект.Записать();
СозданныеДолжности.Вставить(ДолжностьОбъект.Наименование, ДолжностьОбъект.Ссылка);
КонецЦикла;
Пока ВыборкаСотрудники.Следующий() Цикл
СотрудникОбъект = Справочники.Сотрудники.СоздатьЭлемент();
СотрудникОбъект.Наименование = СокрЛП(ВыборкаСотрудники.ФИО);
СотрудникОбъект.ДатаРождения = СокрЛП(ВыборкаСотрудники.ДатаРождения);
СотрудникОбъект.Адрес = СокрЛП(ВыборкаСотрудники.Адрес);
СотрудникОбъект.Телефон = СокрЛП(ВыборкаСотрудники.Телефон);
СотрудникОбъект.Email = СокрЛП(ВыборкаСотрудники.Почта);
Если НЕ ЗначениеЗаполнено(ВыборкаСотрудники.Должность) Тогда
СотрудникОбъект.Должность = СозданныеДолжности.Получить(СокрЛП(ВыборкаСотрудники.ДолжностьСтрока));
Иначе
СотрудникОбъект.Должность = ВыборкаСотрудники.Должность;
КонецЕсли;
СотрудникОбъект.Записать();
КонецЦикла;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
&НаКлиенте
Асинх Процедура Загрузить(Команда)
ОписаниеПомещенногоФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, Объект.ПутьКФайлу, УникальныйИдентификатор);
ЗагрузитьНаСервере(ОписаниеПомещенногоФайла.Адрес);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяВременногоФайла);
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область(1, 1, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы));
ПостроительЗапроса.Выполнить();
ТаблицаЗначений = ПостроительЗапроса.Результат.Выгрузить();
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ВЫРАЗИТЬ(Таблица.ФИО КАК СТРОКА(150)) КАК ФИО,
| Таблица.ДатаРождения КАК ДатаРождения,
| ВЫРАЗИТЬ(Таблица.Должность КАК СТРОКА(150)) КАК Должность,
| Таблица.Адрес КАК Адрес,
| Таблица.Телефон КАК Телефон,
| Таблица.Почта КАК Почта
|ПОМЕСТИТЬ Таблица
|ИЗ
| &Таблица КАК Таблица
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Таблица.Должность КАК Должность,
| Должности.Ссылка КАК Ссылка
|ПОМЕСТИТЬ Должности
|ИЗ
| Таблица КАК Таблица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Должности
| ПО Таблица.Должность = Должности.Наименование
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Должности.Должность КАК Должность
|ИЗ
| Должности КАК Должности
|ГДЕ
| Должности.Ссылка ЕСТЬ NULL
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Таблица.ФИО КАК ФИО,
| Таблица.ДатаРождения КАК ДатаРождения,
| Таблица.Должность КАК ДолжностьСтрока,
| Таблица.Адрес КАК Адрес,
| Таблица.Телефон КАК Телефон,
| Таблица.Почта КАК Почта,
| МАКСИМУМ(ЕСТЬNULL(Должности.Ссылка, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка))) КАК Должность
|ИЗ
| Таблица КАК Таблица
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
| ПО Таблица.ФИО = Сотрудники.Наименование
| ЛЕВОЕ СОЕДИНЕНИЕ Должности КАК Должности
| ПО Таблица.Должность = Должности.Должность
|ГДЕ
| Сотрудники.Ссылка ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
| Таблица.ФИО,
| Таблица.ДатаРождения,
| Таблица.Должность,
| Таблица.Адрес,
| Таблица.Телефон,
| Таблица.Почта");
Запрос.УстановитьПараметр("Таблица", ТаблицаЗначений);
РезультатПакет = Запрос.ВыполнитьПакет();
ВыборкаДолжности = РезультатПакет[2].Выбрать();
ВыборкаСотрудники = РезультатПакет[3].Выбрать();
СозданныеДолжности = Новый Соответствие;
Пока ВыборкаДолжности.Следующий() Цикл
ДолжностьОбъект = Справочники.Должности.СоздатьЭлемент();
ДолжностьОбъект.Наименование = СокрЛП(ВыборкаДолжности.Должность);
ДолжностьОбъект.Записать();
СозданныеДолжности.Вставить(ДолжностьОбъект.Наименование, ДолжностьОбъект.Ссылка);
КонецЦикла;
Пока ВыборкаСотрудники.Следующий() Цикл
СотрудникОбъект = Справочники.Сотрудники.СоздатьЭлемент();
СотрудникОбъект.Наименование = СокрЛП(ВыборкаСотрудники.ФИО);
СотрудникОбъект.ДатаРождения = СокрЛП(ВыборкаСотрудники.ДатаРождения);
СотрудникОбъект.Адрес = СокрЛП(ВыборкаСотрудники.Адрес);
СотрудникОбъект.Телефон = СокрЛП(ВыборкаСотрудники.Телефон);
СотрудникОбъект.Email = СокрЛП(ВыборкаСотрудники.Почта);
Если НЕ ЗначениеЗаполнено(ВыборкаСотрудники.Должность) Тогда
СотрудникОбъект.Должность = СозданныеДолжности.Получить(СокрЛП(ВыборкаСотрудники.ДолжностьСтрока));
Иначе
СотрудникОбъект.Должность = ВыборкаСотрудники.Должность;
КонецЕсли;
СотрудникОбъект.Записать();
КонецЦикла;
КонецПроцедуры
Показать
(7) Второй поиск это еще один запрос к базе данных, любой лишний запрос к базе данных - это плохо.
Поискали, результат поиска присвоили переменной, если нашли - используете ее дальше, если не нашли - создали новый элемент, после проверки на пустую ссылку и также используете дальше.
Поискали, результат поиска присвоили переменной, если нашли - используете ее дальше, если не нашли - создали новый элемент, после проверки на пустую ссылку и также используете дальше.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот