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

```1c
    &НаКлиенте
    Процедура Загрузить(Команда)
    если объект.ПутьКФайлу = " тогда
    сообщ = Новый СообщениеПользователю;
    сообщ.Текст = "Выберите файл!";
    сообщ.Сообщить();
    иначе
    Эксель = Новый 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 = СтруктураДанных.Почта;
    ДобавлениеФИО.Записать();
    конецесли;
    КонецПроцедуры
```
---
```1c
    &НаКлиенте
    Асинх Процедура Загрузить(Команда)

    ОписаниеПомещенногоФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, Объект.ПутьКФайлу, УникальныйИдентификатор);

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

    КонецПроцедуры

    &НаСервере
    Процедура ЗагрузитьНаСервере(Адрес)

    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");

    ДвоичныеДанные.Записать(ИмяВременногоФайла);

    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.Прочитать(ИмяВременногоФайла);

    ПостроительЗапроса = Новый ПостроительЗапроса;
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область(1, 1, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы));
    ПостроительЗапроса.Выполнить();

    ТаблицаЗначений = ПостроительЗапроса.Результат.Выгрузить();

    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    | ВЫРАЗИТЬ(Таблица.ФИО КАК СТРОКА(150)) КАК ФИО,
    | Таблица.ДатаРождения КАК ДатаРождения,
    | ВЫРАЗИТЬ(Таблица.Должность КАК СТРОКА(150)) КАК Должность,
    | Таблица.Адрес КАК Адрес,
    | Таблица.Телефон КАК Телефон,
    | Таблица.Почта КАК Почта
    |ПОМЕСТИТЬ Таблица
    |ИЗ
    | &Таблица КАК Таблица
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    | Таблица.Должность КАК Должность,
    | Должности.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ Должности
    |ИЗ
    | Таблица КАК Таблица
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Должности
    | ПО Таблица.Должность = Должности.Наименование
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    | Должности.Должность КАК Должность
    |ИЗ
    | Должности КАК Должности
    |ГДЕ
    | Должности.Ссылка ЕСТЬ NULL
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Таблица.ФИО КАК ФИО,
    | Таблица.ДатаРождения КАК ДатаРождения,
    | Таблица.Должность КАК ДолжностьСтрока,
    | Таблица.Адрес КАК Адрес,
    | Таблица.Телефон КАК Телефон,
    | Таблица.Почта КАК Почта,
    | МАКСИМУМ(ЕСТЬNULL(Должности.Ссылка, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка))) КАК Должность
    |ИЗ
    | Таблица КАК Таблица
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
    | ПО Таблица.ФИО = Сотрудники.Наименование
    | ЛЕВОЕ СОЕДИНЕНИЕ Должности КАК Должности
    | ПО Таблица.Должность = Должности.Должность
    |ГДЕ
    | Сотрудники.Ссылка ЕСТЬ NULL
    |
    |СГРУППИРОВАТЬ ПО
    | Таблица.ФИО,
    | Таблица.ДатаРождения,
    | Таблица.Должность,
    | Таблица.Адрес,
    | Таблица.Телефон,
    | Таблица.Почта");
    Запрос.УстановитьПараметр("Таблица", ТаблицаЗначений);

    РезультатПакет = Запрос.ВыполнитьПакет();

    ВыборкаДолжности = РезультатПакет[2].Выбрать();
    ВыборкаСотрудники = РезультатПакет[3].Выбрать();

    СозданныеДолжности = Новый Соответствие;

    Пока ВыборкаДолжности.Следующий() Цикл

    ДолжностьОбъект = Справочники.Должности.СоздатьЭлемент();
    ДолжностьОбъект.Наименование = СокрЛП(ВыборкаДолжности.Должность);
    ДолжностьОбъект.Записать();

    СозданныеДолжности.Вставить(ДолжностьОбъект.Наименование, ДолжностьОбъект.Ссылка);

    КонецЦикла;

    Пока ВыборкаСотрудники.Следующий() Цикл

    СотрудникОбъект = Справочники.Сотрудники.СоздатьЭлемент();

    СотрудникОбъект.Наименование = СокрЛП(ВыборкаСотрудники.ФИО);
    СотрудникОбъект.ДатаРождения = СокрЛП(ВыборкаСотрудники.ДатаРождения);
    СотрудникОбъект.Адрес = СокрЛП(ВыборкаСотрудники.Адрес);
    СотрудникОбъект.Телефон = СокрЛП(ВыборкаСотрудники.Телефон);
    СотрудникОбъект.Email = СокрЛП(ВыборкаСотрудники.Почта);

    Если НЕ ЗначениеЗаполнено(ВыборкаСотрудники.Должность) Тогда
    СотрудникОбъект.Должность = СозданныеДолжности.Получить(СокрЛП(ВыборкаСотрудники.ДолжностьСтрока));
    Иначе
    СотрудникОбъект.Должность = ВыборкаСотрудники.Должность;
    КонецЕсли;

    СотрудникОбъект.Записать();

    КонецЦикла;

    КонецПроцедуры
```
---
Это учебная задача?
---
```1c
    &НаКлиенте
    Асинх Процедура Загрузить(Команда)

    ОписаниеПомещенногоФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, Объект.ПутьКФайлу, УникальныйИдентификатор);

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

    КонецПроцедуры

    &НаСервере
    Процедура ЗагрузитьНаСервере(Адрес)

    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");

    ДвоичныеДанные.Записать(ИмяВременногоФайла);

    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.Прочитать(ИмяВременногоФайла);

    ПостроительЗапроса = Новый ПостроительЗапроса;
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область(1, 1, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы));
    ПостроительЗапроса.Выполнить();

    ТаблицаЗначений = ПостроительЗапроса.Результат.Выгрузить();

    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    | ВЫРАЗИТЬ(Таблица.ФИО КАК СТРОКА(150)) КАК ФИО,
    | Таблица.ДатаРождения КАК ДатаРождения,
    | ВЫРАЗИТЬ(Таблица.Должность КАК СТРОКА(150)) КАК Должность,
    | Таблица.Адрес КАК Адрес,
    | Таблица.Телефон КАК Телефон,
    | Таблица.Почта КАК Почта
    |ПОМЕСТИТЬ Таблица
    |ИЗ
    | &Таблица КАК Таблица
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    | Таблица.Должность КАК Должность,
    | Должности.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ Должности
    |ИЗ
    | Таблица КАК Таблица
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Должности
    | ПО Таблица.Должность = Должности.Наименование
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    | Должности.Должность КАК Должность
    |ИЗ
    | Должности КАК Должности
    |ГДЕ
    | Должности.Ссылка ЕСТЬ NULL
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Таблица.ФИО КАК ФИО,
    | Таблица.ДатаРождения КАК ДатаРождения,
    | Таблица.Должность КАК ДолжностьСтрока,
    | Таблица.Адрес КАК Адрес,
    | Таблица.Телефон КАК Телефон,
    | Таблица.Почта КАК Почта,
    | МАКСИМУМ(ЕСТЬNULL(Должности.Ссылка, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка))) КАК Должность
    |ИЗ
    | Таблица КАК Таблица
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
    | ПО Таблица.ФИО = Сотрудники.Наименование
    | ЛЕВОЕ СОЕДИНЕНИЕ Должности КАК Должности
    | ПО Таблица.Должность = Должности.Должность
    |ГДЕ
    | Сотрудники.Ссылка ЕСТЬ NULL
    |
    |СГРУППИРОВАТЬ ПО
    | Таблица.ФИО,
    | Таблица.ДатаРождения,
    | Таблица.Должность,
    | Таблица.Адрес,
    | Таблица.Телефон,
    | Таблица.Почта");
    Запрос.УстановитьПараметр("Таблица", ТаблицаЗначений);

    РезультатПакет = Запрос.ВыполнитьПакет();

    ВыборкаДолжности = РезультатПакет[2].Выбрать();
    ВыборкаСотрудники = РезультатПакет[3].Выбрать();

    СозданныеДолжности = Новый Соответствие;

    Пока ВыборкаДолжности.Следующий() Цикл

    ДолжностьОбъект = Справочники.Должности.СоздатьЭлемент();
    ДолжностьОбъект.Наименование = СокрЛП(ВыборкаДолжности.Должность);
    ДолжностьОбъект.Записать();

    СозданныеДолжности.Вставить(ДолжностьОбъект.Наименование, ДолжностьОбъект.Ссылка);

    КонецЦикла;

    Пока ВыборкаСотрудники.Следующий() Цикл

    СотрудникОбъект = Справочники.Сотрудники.СоздатьЭлемент();

    СотрудникОбъект.Наименование = СокрЛП(ВыборкаСотрудники.ФИО);
    СотрудникОбъект.ДатаРождения = СокрЛП(ВыборкаСотрудники.ДатаРождения);
    СотрудникОбъект.Адрес = СокрЛП(ВыборкаСотрудники.Адрес);
    СотрудникОбъект.Телефон = СокрЛП(ВыборкаСотрудники.Телефон);
    СотрудникОбъект.Email = СокрЛП(ВыборкаСотрудники.Почта);

    Если НЕ ЗначениеЗаполнено(ВыборкаСотрудники.Должность) Тогда
    СотрудникОбъект.Должность = СозданныеДолжности.Получить(СокрЛП(ВыборкаСотрудники.ДолжностьСтрока));
    Иначе
    СотрудникОбъект.Должность = ВыборкаСотрудники.Должность;
    КонецЕсли;

    СотрудникОбъект.Записать();

    КонецЦикла;

    КонецПроцедуры
```
---
Но условие, что сверху в табличном документе должны быть наименования колонок ФИО ДатаРождения Должность Адрес Телефон Почта
---
А, не увидел в тегах 8.3.14, тогда процедуру с Асинх нужно переписать на оповещения
---
С должностью работа плохая:
1. Не нужно выполнять поиск по наименованию дважды;
2. Если сотрудник существует, а должность у него не заполнена, при этом вы ее создали?
---
А почему не нужно выполнять поиск по наименованию дважды?
---
Второй поиск это еще один запрос к базе данных, любой лишний запрос к базе данных - это плохо.
Поискали, результат поиска присвоили переменной, если нашли - используете ее дальше, если не нашли - создали новый элемент, после проверки на пустую ссылку и также используете дальше.