Доработать. Конфигурация 1С: Предприятие. Версия: 8.3. Найти и объяснить баги в коде. Причина ошибки импорта файла &НаКлиенте Процедура Импорт(Команда) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Фильтр = “Файлы Excel (*.xlsx;*.xls)|*.xlsx;*.xls“; Диалог.Заголовок = “Выберите файл для импорта“; Диалог.ПолноеИмяФайла = ““; Диалог.Показать(Новый ОписаниеОповещения(“ПослеВыбораФайла“, ЭтотОбъект)); КонецПроцедуры &НаКлиенте Процедура ПослеВыбораФайла(РезультатВыбора, ДополнительныеПараметры) Экспорт Если Не РезультатВыбора = Неопределено Тогда ИмпортНаСервере(РезультатВыбора); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПоказатьСообщениеНаКлиенте(ТекстСообщения) Сообщить(ТекстСообщения); КонецПроцедуры &НаКлиенте Процедура ИзометрииПриОтображенииСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Если ДанныеСтроки.Готовность = 100 Тогда ОформлениеСтроки.ЦветФона = WebЦвета.LightGreen; ОформлениеСтроки.ЦветТекста = WebЦвета.DarkGreen; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОбновитьФорму() Элементы.Изометрии.Обновить(); КонецПроцедуры &НаСервере Процедура ИмпортНаСервере(ПутьКФайлу) Попытка // Чтение данных из Excel Данные = ПрочитатьФайлExcel(ПутьКФайлу); Исключение Сообщить(“Ошибка чтения файла: “ + ОписаниеОшибки()); Возврат; КонецПопытки; // Группировка данных по изометриям ДанныеИзометрий = Новый Соответствие; Для Каждого СтрокаДанных Из Данные Цикл Ключ = СтрокаДанных.Изометрия + “_“ + СтрокаДанных.Ревизия; Если Не ДанныеИзометрий.Содержит(Ключ) Тогда ДанныеИзометрий[Ключ] = Новый Структура(“Изометрия,Блок,Линия,Ревизия,Стыки“); ДанныеИзометрий[Ключ].Изометрия = СтрокаДанных.Изометрия; ДанныеИзометрий[Ключ].Блок = СтрокаДанных.Блок; ДанныеИзометрий[Ключ].Линия = СтрокаДанных.Линия; ДанныеИзометрий[Ключ].Ревизия = СтрокаДанных.Ревизия; ДанныеИзометрий[Ключ].Стыки = Новый ТаблицаЗначений; ДанныеИзометрий[Ключ].Стыки.Колонки.Добавить(“НомерСтыка“); ДанныеИзометрий[Ключ].Стыки.Колонки.Добавить(“ДатаСварки“); ДанныеИзометрий[Ключ].Стыки.Колонки.Добавить(“Сварщик“); КонецЕсли; НоваяСтрока = ДанныеИзометрий[Ключ].Стыки.Добавить(); НоваяСтрока.НомерСтыка = СтрокаДанных.НомерСтыка; НоваяСтрока.ДатаСварки = СтрокаДанных.ДатаСварки; НоваяСтрока.Сварщик = СтрокаДанных.Сварщик; КонецЦикла; // Обработка и сохранение данных НачатьТранзакцию(); Попытка Для Каждого ЭлементДанных Из ДанныеИзометрий Цикл ОбработатьИзометрию(ЭлементДанных); КонецЦикла; ЗафиксироватьТранзакцию(); ////ОбновитьФорму(); ////ПоказатьСообщениеНаКлиенте(“Импорт завершен успешно!“); Исключение ОтменитьТранзакцию(); ////ПоказатьСообщениеНаКлиенте(“Ошибка при импорте: “ + ОписаниеОшибки()); КонецПопытки; КонецПроцедуры &НаСервере Функция ПрочитатьФайлExcel(ПутьКФайлу) Данные = Новый Массив; Excel = Новый COMОбъект(“Excel.Application“); Попытка Excel.Visible = Ложь; Excel.DisplayAlerts = Ложь; Книга = Excel.Workbooks.Open(ПутьКФайлу); Лист = Книга.WorkSheets(1); ТекущаяСтрока = 2; Пока Истина Цикл Изометрия = Лист.Cells(ТекущаяСтрока, 1).Text; Если ПустаяСтрока(Изометрия) Тогда Прервать; КонецЕсли; СтрокаДанных = Новый Структура; СтрокаДанных.Вставить(“Изометрия“, СокрЛП(Изометрия)); СтрокаДанных.Вставить(“Блок“, СокрЛП(Лист.Cells(ТекущаяСтрока, 2).Text)); СтрокаДанных.Вставить(“Линия“, СокрЛП(Лист.Cells(ТекущаяСтрока, 3).Text)); СтрокаДанных.Вставить(“Ревизия“, Число(СокрЛП(Лист.Cells(ТекущаяСтрока, 4).Text))); СтрокаДанных.Вставить(“НомерСтыка“, Число(СокрЛП(Лист.Cells(ТекущаяСтрока, 5).Text))); ТекстДаты = СокрЛП(Лист.Cells(ТекущаяСтрока, 6).Text); Если ПустаяСтрока(ТекстДаты) Тогда СтрокаДанных.Вставить(“ДатаСварки“, Неопределено); Иначе Попытка СтрокаДанных.Вставить(“ДатаСварки“, Дата(ТекстДаты)); Исключение СтрокаДанных.Вставить(“ДатаСварки“, Неопределено); КонецПопытки; КонецЕсли; СтрокаДанных.Вставить(“Сварщик“, СокрЛП(Лист.Cells(ТекущаяСтрока, 7).Text)); Данные.Добавить(СтрокаДанных); ТекущаяСтрока = ТекущаяСтрока + 1; КонецЦикла; Книга.Close(Ложь); Исключение ВызватьИсключение “Не удалось прочитать файл Excel: “ + ОписаниеОшибки(); КонецПопытки; Excel.Quit(); Возврат Данные; КонецФункции &НаСервере Процедура ОбработатьИзометрию(ДанныеИзометрии) // Поиск или создание элементов справочников Блок = НайтиИлиСоздатьБлок(ДанныеИзометрии.Блок); Линия = НайтиИлиСоздатьЛинию(ДанныеИзометрии.Линия); // Поиск существующей изометрии СущИзометрия = Справочники.Изометрии.НайтиПоНаименованию(ДанныеИзометрии.Изометрия); Если Не ЗначениеЗаполнено(СущИзометрия) Тогда СущИзометрия = Справочники.Изометрии.СоздатьЭлемент(); СущИзометрия.Наименование = ДанныеИзометрии.Изометрия; КонецЕсли; // Заполнение реквизитов СущИзометрия.Блок = Блок; СущИзометрия.Линия = Линия; СущИзометрия.Ревизия = ДанныеИзометрии.Ревизия; // Очистка и заполнение табличной части СущИзометрия.Стыки.Очистить(); ВсегоСтыков = ДанныеИзометрии.Стыки.Количество(); ГотовыеСтыки = 0; Для Каждого СтрокаСтыка Из ДанныеИзометрии.Стыки Цикл Сварщик = НайтиИлиСоздатьСварщика(СтрокаСтыка.Сварщик); НоваяСтрока = СущИзометрия.Стыки.Добавить(); НоваяСтрока.НомерСтыка = СтрокаСтыка.НомерСтыка; НоваяСтрока.ДатаСварки = СтрокаСтыка.ДатаСварки; НоваяСтрока.Сварщик = Сварщик; // Подсчет готовых стыков Если ЗначениеЗаполнено(СтрокаСтыка.ДатаСварки) Тогда ГотовыеСтыки = ГотовыеСтыки + 1; КонецЕсли; КонецЦикла; // Расчет готовности СущИзометрия.Готовность = ?(ВсегоСтыков > 0, Окр(ГотовыеСтыки / ВсегоСтыков * 100, 0), 0); СущИзометрия.Записать(); КонецПроцедуры &НаСервере Функция НайтиИлиСоздатьБлок(КодБлока) Если ПустаяСтрока(КодБлока) Тогда Возврат Неопределено; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | Блоки.Ссылка |ИЗ | Справочник.Блоки КАК Блоки |ГДЕ | Блоки.Код = &КодБлока“; Запрос.УстановитьПараметр(“КодБлока“, Число(КодБлока)); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда НовыйБлок = Справочники.Блоки.СоздатьЭлемент(); НовыйБлок.Код = Число(КодБлока); НовыйБлок.Наименование = Строка(КодБлока); НовыйБлок.Записать(); Возврат НовыйБлок; Иначе Возврат Результат[0].Ссылка; КонецЕсли; КонецФункции &НаСервере Функция НайтиИлиСоздатьЛинию(НаименованиеЛинии) Если ПустаяСтрока(НаименованиеЛинии) Тогда Возврат Неопределено; КонецЕсли; СущЛиния = Справочники.Линии.НайтиПоНаименованию(НаименованиеЛинии); Если Не ЗначениеЗаполнено(СущЛиния) Тогда СущЛиния = Справочники.Линии.СоздатьЭлемент(); СущЛиния.Наименование = НаименованиеЛинии; СущЛиния.Записать(); КонецЕсли; Возврат СущЛиния; КонецФункции &НаСервере Функция НайтиИлиСоздатьСварщика(ИмяСварщика) Если ПустаяСтрока(ИмяСварщика) Тогда Возврат Неопределено; КонецЕсли; СущСварщик = Справочники.Сварщики.НайтиПоНаименованию(ИмяСварщика); Если Не ЗначениеЗаполнено(СущСварщик) Тогда СущСварщик = Справочники.Сварщики.СоздатьЭлемент(); СущСварщик.Наименование = ИмяСварщика; СущСварщик.Записать(); КонецЕсли; Возврат СущСварщик; КонецФункции.