Загрузка из XML в справочник Номенклатура
Здравствуйте, Уважаемое сообщество.
Так вышло, что через много лет приходится вновь погружаться в программирование 1С.
У меня есть задача загрузить из XML файла определённой структуры
данные в Справочники.Номенклатура
Есть следующая ВнешняяОбработка с таким кодом
Но единственно, что она делает это читает файл и выводит его в Служебные сообщения.
Brand, Model, Width и пр. заведены как справочники и добавлены соответствующие поля в ФормаЭлемента Справочника Номенклатуры.
Спасибо за внимание и ещё больше спасибо за помощь)
Так вышло, что через много лет приходится вновь погружаться в программирование 1С.
У меня есть задача загрузить из XML файла определённой структуры
XML файл |
---|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--13714 8/7/2017 12:16:33 PM--> <data> <tires> <cae>PXR0033103</cae> <price_sk3>11029</price_sk3> <price_sk3_rozn>12350</price_sk3_rozn> <name>245/40R17 91S Blizzak VRX</name> <tiretype>Легковая</tiretype> Bridgestone</brand> <model>Blizzak VRX</model> <width>245</width> <height>40</height> <diameter>R17</diameter> <diametr_out>0</diametr_out> <design>R</design> <speed_index>S</speed_index> <load_index>91</load_index> <season>Зимняя</season> </tires> <tires> <cae>NW00102</cae> <price_sk3>6569</price_sk3> <price_sk3_rozn>7355</price_sk3_rozn> <name>265/60R18 114T Therma Spike TL (шип.)</name> <tiretype>Легковая</tiretype> Nitto</brand> <model>Therma Spike</model> <width>265</width> <height>60</height> <diameter>R18</diameter> <diametr_out>0</diametr_out> <design>R</design> <speed_index>T</speed_index> <load_index>114</load_index> <thorn>Да</thorn> <season>Зимняя</season> </tires> <tires> <cae>100A1574</cae> <price_sk3>4510</price_sk3> <price_sk3_rozn>5002</price_sk3_rozn> <name>225/50R16 96W Champiro UHP1</name> <tiretype>Легковая</tiretype> GT Radial</brand> <model>Champiro UHP1</model> <width>225</width> <height>50</height> <diameter>R16</diameter> <diametr_out>0</diametr_out> <design>R</design> <speed_index>W</speed_index> <load_index>96</load_index> <season>Летняя</season> </tires> <camera> <cae>125603</cae> <price_mkrs>271</price_mkrs> Michelin</brand> <name>Michelin Chambre Scooter</name> </camera> <camera> <cae>733003</cae> <price_mkrs>244</price_mkrs> Michelin</brand> <name>Michelin Chambre Scooter</name> </camera> <camera> <cae>788345</cae> <price_mkrs>261</price_mkrs> Michelin</brand> <name>Michelin Chambre Road</name> </camera> <rims> <cae>WHS140401</cae> <price_sk3>6678</price_sk3> <price_sk3_rozn>7528</price_sk3_rozn> <name>8x19/5x120 ET30 D72,6 MODEL-58 B+R</name> Yokatta</brand> <model>MODEL-58</model> <color>B+R</color> <width>8</width> <diameter>19</diameter> <bolts_count>5</bolts_count> <bolts_spacing>120</bolts_spacing> <bolts_spacing2>0</bolts_spacing2> <et>30</et> <dia>72.6</dia> <img_small> </rims> <rims> <cae>WHS141450</cae> <price_sk3>4474</price_sk3> <price_sk3_rozn>5255</price_sk3_rozn> <name>6,5x17/5x114,3 ET48 D67,1 Прайм (КС721) Алмаз черный</name> K&K</brand> <model>Прайм (КС721)</model> <color>Алмаз черный</color> <width>6.5</width> <diameter>17</diameter> <bolts_count>5</bolts_count> <bolts_spacing>114.3</bolts_spacing> <bolts_spacing2>0</bolts_spacing2> <et>48</et> <dia>67.1</dia> <img_small> </rims> <rims> <cae>WHS140629</cae> <price_sk3>29332</price_sk3> <price_sk3_rozn>33630</price_sk3_rozn> <name>8,5x20/5x120 ET30 D72,5 STC-MS Matt Black Milled</name> Fondmetal</brand> <model>STC-MS</model> <color>Matt Black Milled</color> <width>8.5</width> <diameter>20</diameter> <bolts_count>5</bolts_count> <bolts_spacing>120</bolts_spacing> <bolts_spacing2>0</bolts_spacing2> <et>30</et> <dia>72.5</dia> <img_small> </rims> <rims> <cae>WHS149402</cae> <price_sk4>11025</price_sk4> <price_sk4_rozn>12789</price_sk4_rozn> <name>8,5x20/5x150 ET58 D110,1 TY242 SF (пш)</name> Replay</brand> <model>TY242</model> <color>SF</color> <width>8.5</width> <diameter>20</diameter> <bolts_count>5</bolts_count> <bolts_spacing>150</bolts_spacing> <bolts_spacing2>0</bolts_spacing2> <et>58</et> <dia>110.1</dia> <mount>пш</mount> <mount_note>прессшайба</mount_note> <img_small> </rims> <fastener> <cae>OGS083174</cae> <price_mkrs>80</price_mkrs> <price>100</price> Replay</brand> <name>Вставка унифицированная C570 метал.сф.стикер</name> <sub_type>Вставки/стикеры</sub_type> </fastener> <fastener> <cae>OGS129366</cae> <price_mkrs>30</price_mkrs> <price>34</price> LS</brand> <name>Болт M14x1,25 (55/ 28) hex17 конус CH (КИТАЙ) 966-08</name> <sub_type>Болты</sub_type> </fastener> <fastener> <cae>OGS129368</cae> <price_mkrs>35</price_mkrs> <price>40</price> LS</brand> <name>Болт M14x1,5 (62/ 35) hex17 конус CH (КИТАЙ) 984</name> <sub_type>Болты</sub_type> </fastener> <spare_parts> <cae>OGS145879</cae> <price_mkrs>1973</price_mkrs> -</brand> <name>AM 7Jx16H2 5x112 ET-35</name> </spare_parts> <spare_parts> <cae>OGS146216</cae> <price_mkrs>1653</price_mkrs> -</brand> <name>C 7,25Jx15H2 5x112 ET-35</name> </spare_parts> <spare_parts> <cae>OGS146227</cae> <price_mkrs>1336</price_mkrs> -</brand> <name>RC-04 7Jx15H2 5x112 ET-38</name> </spare_parts> </data> |
данные в Справочники.Номенклатура
Есть следующая ВнешняяОбработка с таким кодом
Процедура КнопкаВыполнитьНажатие(Кнопка)
Чтение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
По теме из базы знаний
- Загрузка и обновление данных номенклатуры, дополнительных реквизитов и сведений, характеристик и наборов упаковок номенклатуры из файлов формата MS Excel, OpenOfficeCalc (ODS), CSV, TXT, DBF, MXL для 1С: УТ, КА, ЕРП, Розница, БП
- Заполнение справочника "Автоработы" и справочника "Номенклатура" в Альфа-Авто
- Быстрое создание справочника номенклатуры из файла выгрузки Честный знак для 1С: Розница 2.2 и выше
- Загрузка товаров, остатков и цен в 1С: Розница 3, УНФ 3 с сайта на Joomla! 3.x, VirtueMart 3.x, Яндексмаркет
- XDTO выгрузка и загрузка справочника с иерархией
Найденные решения
В общем обработка полностью переписана, но сам поиск по дублям сделан так
Работает хорошо, создаёт быстро.
Процедура ДобавитьЭлементRims(МассивRims)
Для Каждого СтрокаДанных Из МассивRims Цикл
артикул = СтрокаДанных.cae;
Если Не ЗначениеЗаполнено(артикул) Тогда
Продолжить;
Иначе
Если Справочники.Номенклатура.НайтиПоРеквизиту("артикул",артикул) = Справочники.Номенклатура.ПустаяСсылка() тогда
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
Работает хорошо, создаёт быстро.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4)Да, этот момент прохлопал (структура xml файла поменялась, а я не исправил). Не могу понять почему создаётся только последний элемент из файла? И конечно же не правильно обращаюсь к справочникам при заполнении Элемента, записываются только Строковые значения. Должно быть поиск по реквизиту (например наименование) в соответствующем справочнике, если нет то создать, а потом записать Элемент. Не хватает знаний для осуществления. Уже молчу про УникальныйИдентификатор, что бы не задваивались позиции. В общем пропасть))
Width как справочник? Кажется, вы что-то не до конца понимаете. Но вообще, если вам нужно разово загрузить из хмл - посмотрите в сторону инструментов разработчика. Откываете хмл-файл в экселе, сохраняете как xls, потом грузите инструментами разработчика, с постобработкой, если требуется.
(2)Да Width и пр. создано как Справочники, потому что это реквизиты Шин и Дисков, они установленного размера. Ваш вариант очень даже работоспособен и его я уже использовал для загрузки данных, но в том то и дело, что это неразово, а регулярно. Хочется со временем перевести это в регламентные задачи.
Т.к. у разных элементов XML файла разный набор реквизитов то имею код
но не могу понять почему он создаёт ЭлементыСправочника по Массивtires, но не хочет создавать элементы по Массивrims.
Процедура КнопкаВыполнитьНажатие(Кнопка)
Чтение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.
Посидев над всем этим безобразием решил вопрос создания и определение в группы (через костыли, но всё же пока можно и так), но не как не могу понять какой должен быть код для предварительной проверки наличия Элемента в Справочнике Номенклатура, в общем что бы не создавало дубли.
В общем обработка полностью переписана, но сам поиск по дублям сделан так
Работает хорошо, создаёт быстро.
Процедура ДобавитьЭлементRims(МассивRims)
Для Каждого СтрокаДанных Из МассивRims Цикл
артикул = СтрокаДанных.cae;
Если Не ЗначениеЗаполнено(артикул) Тогда
Продолжить;
Иначе
Если Справочники.Номенклатура.НайтиПоРеквизиту("артикул",артикул) = Справочники.Номенклатура.ПустаяСсылка() тогда
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
Работает хорошо, создаёт быстро.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот