Загрузка из XML в справочник Номенклатура

1. nsm 21.08.17 11:33 Сейчас в теме
Здравствуйте, Уважаемое сообщество.
Так вышло, что через много лет приходится вновь погружаться в программирование 1С.
У меня есть задача загрузить из XML файла определённой структуры
XML файл

данные в Справочники.Номенклатура
Есть следующая ВнешняяОбработка с таким кодом
Процедура КнопкаВыполнитьНажатие(Кнопка)
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл("F:\4P\M13714small.xml");
    Имя = ЧтениеXML.Имя;
    Массив = Новый Структура(Имя);                                                     
    Пока ЧтениеXML.Прочитать() Цикл                  
        ПолучитьXMLТип(ЧтениеXML);
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента  Тогда
                        
            Имя = ЧтениеXML.Имя;
            
            Сообщить("Начало " + ЧтениеXML.Имя);
            Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
                Атрибут = ЧтениеXML.Значение;
                Сообщить("атрибут:" + ЧтениеXML.Имя + "=" + ЧтениеXML.Значение);
            КонецЦикла;
        КонецЕсли;
        
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
            Массив.Вставить(Имя,ЧтениеXML.Значение);
            Сообщить(ЧтениеXML.Значение);
        КонецЕсли;
    
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Если ЧтениеXML.Имя = "ЭлементСправочника" Тогда
            ДобавитьЭлемент(Массив);
            КонецЕсли;
            Сообщить("Конец " + ЧтениеXML.Имя);
        КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

Процедура ДобавитьЭлемент(Массив)
    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
        НовыйЭлемент.Артикул = Массив.cae;
        НовыйЭлемент.Наименование = Массив.name;
	НовыйЭлемент.Brand = Массив.brand;
	НовыйЭлемент.Владелец =	Массив.tiretype;
        НовыйЭлемент.Model = Массив.model;
        НовыйЭлемент.Width = Массив.width;
	НовыйЭлемент.Height = Массив.height;
	НовыйЭлемент.Diameter = Массив.diameter;
	НовыйЭлемент.Diameter_out = Массив.diametr_out;
	НовыйЭлемент.Design = Массив.design;
	НовыйЭлемент.SpeedIndex = Массив.speed_index;
	НовыйЭлемент.LoadIndex = Массив.load_index;
	НовыйЭлемент.Season = Массив.season;
	НовыйЭлемент.Color = Массив.color;
	НовыйЭлемент.BoltsCount = Массив.bolts_count;
	НовыйЭлемент.BoltsSpacing = Массив.bolts_spacing;
	НовыйЭлемент.BoltsSpacing2 = Массив.bolts_spacing2;
	НовыйЭлемент.ET = Массив.et;
	НовыйЭлемент.DIA = Массив.dia;
	НовыйЭлемент.Записать();
	
	ОбновитьИнтерфейс();
КонецПроцедуры
Показать

Но единственно, что она делает это читает файл и выводит его в Служебные сообщения.
Brand, Model, Width и пр. заведены как справочники и добавлены соответствующие поля в ФормаЭлемента Справочника Номенклатуры.
Спасибо за внимание и ещё больше спасибо за помощь)
Прикрепленные файлы:
XML4P.epf
M13714small.xml
По теме из базы знаний
Найденные решения
10. nsm 27.08.17 23:31 Сейчас в теме
В общем обработка полностью переписана, но сам поиск по дублям сделан так
Процедура ДобавитьЭлементRims(МассивRims)
	Для Каждого СтрокаДанных Из МассивRims Цикл
		артикул = СтрокаДанных.cae;
		Если Не ЗначениеЗаполнено(артикул) Тогда
			Продолжить;
		Иначе
			Если Справочники.Номенклатура.НайтиПоРеквизиту("артикул",артикул) = Справочники.Номенклатура.ПустаяСсылка() тогда
				НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

Работает хорошо, создаёт быстро.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. andron77777 21.08.17 12:01 Сейчас в теме
(1)
Если ЧтениеXML.Имя = "ЭлементСправочника" Тогда
ДобавитьЭлемент(Массив);
КонецЕсли;


Обратите внимание на этот код. В приложенном XML нет узлов с такими именами. Соответсвтенно код по созданию номенклатуры ниразу не выполняется.
5. nsm 21.08.17 12:36 Сейчас в теме
(4)Спасибо, сейчас по мозгую)
6. nsm 21.08.17 13:23 Сейчас в теме
(4)Да, этот момент прохлопал (структура xml файла поменялась, а я не исправил). Не могу понять почему создаётся только последний элемент из файла? И конечно же не правильно обращаюсь к справочникам при заполнении Элемента, записываются только Строковые значения. Должно быть поиск по реквизиту (например наименование) в соответствующем справочнике, если нет то создать, а потом записать Элемент. Не хватает знаний для осуществления. Уже молчу про УникальныйИдентификатор, что бы не задваивались позиции. В общем пропасть))
2. necropunk 9 21.08.17 11:47 Сейчас в теме
Width как справочник? Кажется, вы что-то не до конца понимаете. Но вообще, если вам нужно разово загрузить из хмл - посмотрите в сторону инструментов разработчика. Откываете хмл-файл в экселе, сохраняете как xls, потом грузите инструментами разработчика, с постобработкой, если требуется.
3. nsm 21.08.17 11:55 Сейчас в теме
(2)Да Width и пр. создано как Справочники, потому что это реквизиты Шин и Дисков, они установленного размера. Ваш вариант очень даже работоспособен и его я уже использовал для загрузки данных, но в том то и дело, что это неразово, а регулярно. Хочется со временем перевести это в регламентные задачи.
7. nsm 21.08.17 17:51 Сейчас в теме
Т.к. у разных элементов XML файла разный набор реквизитов то имею код
Процедура КнопкаВыполнитьНажатие(Кнопка)
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл("F:\4P\M13714small.xml");
    Имя = ЧтениеXML.Имя;
    Массивtires = Новый Структура(Имя);
	Массивrims = Новый Структура(Имя);
    Пока ЧтениеXML.Прочитать() Цикл                  
        ПолучитьXMLТип(ЧтениеXML);
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента  Тогда
                        
            Имя = ЧтениеXML.Имя;
            
            Сообщить("Начало " + ЧтениеXML.Имя);
            Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
                Атрибут = ЧтениеXML.Значение;
                Сообщить("атрибут:" + ЧтениеXML.Имя + "=" + ЧтениеXML.Значение);
            КонецЦикла;
        КонецЕсли;
        
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
            Массивtires.Вставить(Имя,ЧтениеXML.Значение);
            Сообщить(ЧтениеXML.Значение);
		Иначе
			Массивrims.Вставить(Имя,ЧтениеXML.Значение);
            Сообщить(ЧтениеXML.Значение);
        КонецЕсли;
    
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
//			Если ЧтениеXML.Имя = "tires" Или ЧтениеXML.Имя = "camera" Или ЧтениеXML.Имя = "fastener" Или ЧтениеXML.Имя = "spare_parts" Тогда
//            ДобавитьЭлемент(Массивtires); 
			Если ЧтениеXML.Имя = "rims" Тогда
            ДобавитьЭлементRims(Массивrims);
		Иначе
//			Если ЧтениеXML.Имя = "rims" Тогда
//            ДобавитьЭлементRims(Массивrims);
			Если ЧтениеXML.Имя = "tires" Или ЧтениеXML.Имя = "camera" Или ЧтениеXML.Имя = "fastener" Или ЧтениеXML.Имя = "spare_parts" Тогда
            ДобавитьЭлемент(Массивtires);
        	КонецЕсли;
            Сообщить("Конец " + ЧтениеXML.Имя);
		КонецЕсли;
		КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

Процедура ДобавитьЭлемент(Массивtires)
	
    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
    НовыйЭлемент.Артикул = Массивtires.cae;
    НовыйЭлемент.Наименование = Массивtires.name;
	НовыйЭлемент.Brand = Массивtires.brand;
	//НовыйЭлемент.Владелец =	Массив.tiretype;
    НовыйЭлемент.Model = Массивtires.model;
    НовыйЭлемент.Width = Массивtires.width;
	НовыйЭлемент.Height = Массивtires.height;
	НовыйЭлемент.Diameter = Массивtires.diameter;
	НовыйЭлемент.Diameter_out = Массивtires.diametr_out;
	НовыйЭлемент.Design = Массивtires.design;
	НовыйЭлемент.SpeedIndex = Массивtires.speed_index;
	НовыйЭлемент.LoadIndex = Массивtires.load_index;
	НовыйЭлемент.Season = Массивtires.season;
	НовыйЭлемент.Записать();
	
	ОбновитьИнтерфейс();
КонецПроцедуры
Процедура ДобавитьЭлементRims(Массивrims)
	
	НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
	НовыйЭлемент.Артикул = Массивrims.cae;
    НовыйЭлемент.Наименование = Массивrims.name;
    НовыйЭлемент.Brand = Массивrims.brand;
    НовыйЭлемент.Model = Массивrims.model;
    НовыйЭлемент.Color = Массивrims.color;
    НовыйЭлемент.Width = Массивrims.width;
    НовыйЭлемент.Diameter = Массивrims.diameter;
    НовыйЭлемент.BoltsCount = Массивrims.bolts_count;
    НовыйЭлемент.BoltsSpacing = Массивrims.bolts_spacing;
    НовыйЭлемент.BoltsSpacing2 = Массивrims.bolts_spacing2;
	НовыйЭлемент.ET = Массивrims.et;
	НовыйЭлемент.DIA = Массивrims.dia;
//  НовыйЭлемент.Mount = Массивrims.mount;
//	НовыйЭлемент.MountNote = Массивrims.mount_note;
    
	ОбновитьИнтерфейс();
КонецПроцедуры
Показать

но не могу понять почему он создаёт ЭлементыСправочника по Массивtires, но не хочет создавать элементы по Массивrims.
8. nsm 21.08.17 17:55 Сейчас в теме
(7)Глаз замылился не заметил что снёс НовыйЭлемент.Записать(); в массиве Массивrims, правда проблема всё равно имеется, он создаёт пустые элементы.
9. nsm 21.08.17 22:23 Сейчас в теме
Посидев над всем этим безобразием решил вопрос создания и определение в группы (через костыли, но всё же пока можно и так), но не как не могу понять какой должен быть код для предварительной проверки наличия Элемента в Справочнике Номенклатура, в общем что бы не создавало дубли.
10. nsm 27.08.17 23:31 Сейчас в теме
В общем обработка полностью переписана, но сам поиск по дублям сделан так
Процедура ДобавитьЭлементRims(МассивRims)
	Для Каждого СтрокаДанных Из МассивRims Цикл
		артикул = СтрокаДанных.cae;
		Если Не ЗначениеЗаполнено(артикул) Тогда
			Продолжить;
		Иначе
			Если Справочники.Номенклатура.НайтиПоРеквизиту("артикул",артикул) = Справочники.Номенклатура.ПустаяСсылка() тогда
				НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

Работает хорошо, создаёт быстро.
Оставьте свое сообщение

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