|
v7: из 1с8 в 1с77 через xml | ☑ | ||
---|---|---|---|---|
0
4esz
24.02.12
✎
16:44
|
есть вот такой xml файлик получаемый при выгрузке из 1С8 УНФ через планОбмена
<?xml version="1.0" encoding="UTF-8"?> <v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages"> <v8msg:Header> <v8msg:ExchangePlan>ПланОбменаП</v8msg:ExchangePlan> <v8msg:To>бух</v8msg:To> <v8msg:From>ЦБ</v8msg:From> <v8msg:MessageNo>3</v8msg:MessageNo> <v8msg:ReceivedNo>0</v8msg:ReceivedNo> </v8msg:Header> <v8msg:Body> <DocumentObject.СчетНаОплату> <Ref>517c393c-5b8d-11e1-9f51-005056c00008</Ref> <DeletionMark>false</DeletionMark> <Date>2012-02-20T10:37:12</Date> <Number>0000-000001</Number> <Posted>true</Posted> <Организация>4643d461-aa49-4b70-9486-a59f80ee6af8</Организация> <Комментарий/> <ДокументОснование xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="DocumentRef.ЗаказПокупателя">a1b7ad58-4ca3-11e1-9f4f-005056c00008</ДокументОснование> <Контрагент>406583b4-012e-11e1-a6b7-1cc1de0f198d</Контрагент> <Договор>406583b5-012e-11e1-a6b7-1cc1de0f198d</Договор> <ТипДенежныхСредств>Безналичные</ТипДенежныхСредств> <БанковскийСчет>406583c1-012e-11e1-a6b7-1cc1de0f198d</БанковскийСчет> <ВалютаДокумента>cf53f667-77a3-4c69-8146-2fd58525bbfc</ВалютаДокумента> <Кратность>1</Кратность> <Курс>1</Курс> <НалогообложениеНДС>ОблагаетсяНДС</НалогообложениеНДС> <СуммаВключаетНДС>true</СуммаВключаетНДС> <ВидЦен>64592673-624e-4a13-849a-95a7336cfdc5</ВидЦен> <ВидСкидкиНаценки>00000000-0000-0000-0000-000000000000</ВидСкидкиНаценки> <Подразделение>6d5affb3-94b3-4377-a8c2-8d07f0450d95</Подразделение> <Касса>ff4c820c-008c-11e1-a6b7-1cc1de0f198d</Касса> <Ответственный>00000000-0000-0000-0000-000000000000</Ответственный> <СуммаДокумента>3200</СуммаДокумента> <Событие>00000000-0000-0000-0000-000000000000</Событие> <ЗапланироватьОплату>false</ЗапланироватьОплату> <Автор>031b37da-4775-11e1-a112-005056c00008</Автор> <Запасы> <Row> <Номенклатура>406583bb-012e-11e1-a6b7-1cc1de0f198d</Номенклатура> <Характеристика>00000000-0000-0000-0000-000000000000</Характеристика> <Партия>00000000-0000-0000-0000-000000000000</Партия> <Количество>2</Количество> <ЕдиницаИзмерения xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogRef.КлассификаторЕдиницИзмерения">a4f770f7-5a4e-435f-a55f-28cb995d36c9</ЕдиницаИзмерения> <Цена>600</Цена> <ПроцентСкидкиНаценки>0</ПроцентСкидкиНаценки> <Сумма>1200</Сумма> <СтавкаНДС>ff4c820b-008c-11e1-a6b7-1cc1de0f198d</СтавкаНДС> <СуммаНДС>183.05</СуммаНДС> <Всего>1200</Всего> <Содержание>4СК 8,0т/6,0м</Содержание> </Row> это документ счет на оплату, хотелось бы его загружать в бухгалтенрию 7.7 в документ счет пробую вот так: Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "v7plus.dll") <> 1 Тогда Предупреждение("Компонента v7plus.dll не найдена!"); КонецЕсли; КонецЕсли; Анализатор = СоздатьОбъект("AddIn.XMLParser"); //создадим объект для доступа к xml-файлу, загрузим в него файл и получим ссылку на корневой элемент xml-документа. Напомню, что у нас он назван "Данные" ФайлДанных=Анализатор.СоздатьДокумент(); ФайлДанных.Загрузить(ФайлЭксп); ВсеУзлы=ФайлДанных.ВыбратьУзлы("DocumentObject.СчетНаОплату"); Для х= 1 По ВсеУзлы.КоличествоПодчиненных() Цикл Узел=ВсеУзлы.ПолучитьПодчиненныйПоНомеру(х); Сообщить(""+Узел); КонецЦикла; вылетает следующая ошибка: ФайлДанных.Загрузить(ФайлЭксп); {D:\PROBA\STS\ЗАГРУЗКАВ77_S.ERT(86)}: : Type 'DocumentRef.ЗаказПокупателя' is not found in Schema. [ <ДокументОснование xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="DocumentRef.ЗаказПокупателя">a1b7ad58-4ca3-11e1-9f4f-005056c00008</ДокументОснование> (error position = 117)] что не так делаю? как правильно? |
|||
1
andrewks
24.02.12
✎
16:52
|
<ДокументОснование xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="DocumentRef.ЗаказПокупателя">
чё-то странновато как-то. откуда бы там взяться такому типу? |
|||
2
4esz
24.02.12
✎
16:54
|
(1)Стандартная УНФ так выгружает
пробовал в xml файле убиапть вот эту строку <ДокументОснование xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="DocumentRef.ЗаказПокупателя">a1b7ad58-4ca3-11e1-9f4f-005056c00008</ДокументОснование> тогда начинает ругаться на строку с ЕдиницейИзмерения <ЕдиницаИзмерения xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CatalogRef.КлассификаторЕдиницИзмерения">a4f770f7-5a4e-435f-a55f-28cb995d36c9</ЕдиницаИзмерения> |
|||
3
andrewks
24.02.12
✎
17:07
|
загружай через msxml 6.0
|
|||
4
andrewks
24.02.12
✎
17:10
|
Функция ВывестиЭлем(ТекЭлем,Знач Смещ);
Рез=1; Попытка Если (ТекЭлем.nodeType=1) Тогда Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":","!"); ИначеЕсли (ТекЭлем.nodeType=3) Тогда Сообщить(Смещ+"Текст элемента: "+ТекЭлем.nodeValue); ИначеЕсли (ТекЭлем.nodeType=4) Тогда Сообщить(Смещ+"CDATA: "+ТекЭлем.nodeValue); ИначеЕсли (ТекЭлем.nodeType=8) Тогда Сообщить(Смещ+"Комментарий: "+ТекЭлем.nodeValue,"I"); Иначе Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":"); Сообщить(Смещ+"Тип: "+ТекЭлем.nodeType); КонецЕсли; Для ном=0 По ТекЭлем.attributes.length-1 Цикл ТекАтр=ТекЭлем.attributes(ном); Сообщить(Смещ+"Атрибут: "+ТекАтр.nodeName+", значение: "+ТекАтр.nodeValue); КонецЦикла; Исключение Рез=0; КонецПопытки; Смещ=Смещ+" "; Для ном=0 По ТекЭлем.childNodes.length-1 Цикл ДочЭлем=ТекЭлем.childNodes(ном); Рез=Рез*ВывестиЭлем(ДочЭлем,Смещ); КонецЦикла; Возврат Рез; КонецФункции //******************************************* Функция Сформировать() ИмяФайла="D:\1.xml"; Попытка ДОМ=СоздатьОбъект("MSXML.DOMDocument.6.0"); Узел=ДОМ.CreateProcessingInstruction("xml","version=""1.0"" encoding=""windows-1251"""); Исключение Сообщить("Не удалось создать объект DOMDocument","!"); Возврат 0; КонецПопытки; ДОМ.insertBefore(Узел,); ТекЭлем=ДОМ.appendChild(ДОМ.createElement("Файл")); Текст=ДОМ.createTextNode("Здесь содержимое Файл"); ТекЭлем.appendChild(Текст); ТекЭлем.setAttribute("Атрибут_Файл_1","Здесь содержимое Атрибут_Файл_1"); Комм=ДОМ.createComment("Далее следует содержимое файла"); ТекЭлем.appendChild(Комм); ТекЭлем=ТекЭлем.appendChild(ДОМ.createElement("СодержимоеФайла")); Текст=ДОМ.createTextNode("Здесь содержимое СодержимоеФайла"); ТекЭлем.appendChild(Текст); ТекЭлем.setAttribute("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1"); Текст=ДОМ.createCDATASection("Это секция CDATA"); ТекЭлем.appendChild(Текст); ДОМ.save(ИмяФайла); Попытка ДОМ=СоздатьОбъект("MSXML.DOMDocument.6.0"); Исключение Сообщить("Не удалось создать объект DOMDocument","!"); Возврат 0; КонецПопытки; ДОМ.async=0; ДОМ.validateOnParse=-1; ДОМ.resolveExternals=-1; ДОМ.load(ИмяФайла); Если (ДОМ.parseError.errorCode<>0) Тогда // ошибки при проверке валидности Сообщить("При проверке валидности файла "+ИмяФайла+" выявлены ошибки!","!"); Возврат 0; КонецЕсли; Рут=ДОМ.documentElement(); Смещ=""; Рез=ВывестиЭлем(Рут,Смещ); Возврат Рез; КонецФункции |
|||
5
andrewks
24.02.12
✎
17:12
|
да, и (1) сторно
|
|||
6
4esz
24.02.12
✎
17:20
|
(5) так ведь название реквизиты документа счета из 8ки не полностью соответствуют реквизитам документа в 7ке или это не важно? не совсем понял где в приведенном примере показывается что например реквизит "Событие" из 8ки в 7ку грузить не надо так ка в последней его просто нет
|
|||
7
andrewks
24.02.12
✎
17:23
|
ась? т.е. ты предлагаешь и обработку за тебя написать?
|
|||
8
4esz
24.02.12
✎
17:25
|
(7) ссылочку бы на то где понятным языком написано что есть документ ДОМ и что с ним дальше делать
|
|||
9
andrewks
24.02.12
✎
17:26
|
(8) я тебе целый пример рабочий дал. мало?
|
|||
10
andrewks
24.02.12
✎
17:28
|
||||
11
4esz
24.02.12
✎
17:30
|
(9) за пример спасибо
буду пробовать |
|||
12
4esz
24.02.12
✎
17:38
|
Не удалось создать объект DOMDocument
вот на этой строке вылетаетДОМ=СоздатьОбъект("MSXML.DOMDocument.6.0"); может нужна какая то дллка ? |
|||
13
andrewks
24.02.12
✎
17:39
|
||||
14
andrewks
24.02.12
✎
17:42
|
сорьки, копипаст подвёл
в двух местах замени на: ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0"); |
|||
15
4esz
24.02.12
✎
17:44
|
(14)
а пакет все же нужно ставить? |
|||
16
andrewks
24.02.12
✎
17:45
|
(15) ось какая? если виста и выше, и так должон быть. если ниже - надо проставить.в любом случае, сначала попробуй создать объект, если ругнётся на (14), значит, надо ставить
|
|||
17
4esz
24.02.12
✎
17:46
|
ось ХР
пакет поставил вроде теперь не ругается выдает следующее Элемент Файл: Атрибут: Атрибут_Файл_1, значение: Здесь содержимое Атрибут_Файл_1 Текст элемента: Здесь содержимое Файл Комментарий: Далее следует содержимое файла Элемент СодержимоеФайла: Атрибут: Атрибут_СодержимоеФайла_1, значение: Здесь содержимое Атрибут_СодержимоеФайла_1 Текст элемента: Здесь содержимое СодержимоеФайла CDATA: Это секция CDATA |
|||
18
andrewks
24.02.12
✎
17:48
|
(17) отлично! пример работает :)
теперь читай свой хмл, разбирай, и записывай в базу |
|||
19
4esz
24.02.12
✎
17:51
|
подожди так я подставил имя своего xml в процедуре свормировать
в результате он мне в него закатал то что я коприровал выше т.е. это получается процедура создания хмла а мне то как раз нужно чтение из него создавать у меня получалось вот так Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "v7plus.dll") <> 1 Тогда Предупреждение("Компонента v7plus.dll не найдена!"); КонецЕсли; КонецЕсли; Анализатор = СоздатьОбъект("AddIn.XMLParser"); //Теперь начнем строить дерево документа. Заодно занесем служебную информацию о файле выгрузки в атрибуты корневого элемента Корень=Анализатор.СоздатьДокумент(); Данные =Корень.СоздатьПодчиненныйЭлемент("Данные"); Данные.УстановитьАтрибут("ИБ",КаталогИБ()); Данные.УстановитьАтрибут("Дата",Строка(РабочаяДата())); Данные.УстановитьАтрибут("Оператор",ИмяПользователя()); //Примечание: Пусть Вас не смущает, что открыв XML-документ, Вы увидите, что визуально корневым элементом будет элемент Данные. Просто в процессе разбирательства с работой с XML я задал такие имена переменным и стал использовать их в последующих разработках. Просто мне так привычнее. //И создади две основные ветви Справочники и Документы Справочники=Данные.СоздатьПодчиненныйЭлемент("Справочники"); //документы нам пока не нужны //Документы=Данные.СоздатьПодчиненныйЭлемент("Документы"); // в общей ветке Справочники создадим ветку для справочника Контрагентов Контрагенты=Справочники.СоздатьПодчиненныйЭлемент("Контрагенты"); ///////////////// ТЗк.ВыбратьСтроки(); Для н = 1 По ТЗк.КоличествоСтрок() Цикл ТЗк.ПолучитьСтрокуПоНомеру(н); //А вот так заполняются элементы для справочников. Каждый реквизит справочника выносится в отдельный элемент дерева. Т.к. в данном задании выбрана схема синхронизации справочника Контрагентов по ИНН, то в значение элемента записываем ИНН, а для наглядности в атрибут элемента заносим наименование клиента Состояние(""+н+" выгружаются сведения по: " +ТЗк.Наименование); Контрагент=Контрагенты.СоздатьПодчиненныйЭлемент("Контрагент"); //выгружаем все нужные реквизиты контрагента в атрибуты Узла ИмяКолонки=""; Для к = 1 По ТЗк.КоличествоКолонок() Цикл ТЗк.ПолучитьПараметрыКолонки(к,,,,ИмяКолонки); Контрагент.УстановитьАтрибут(ИмяКолонки,ТЗк.ПолучитьЗначение(н,к)); КонецЦикла; .... |
|||
20
4esz
24.02.12
✎
17:56
|
опишу задачу в целом
может я вообще не то делаю есть бух 77 из нее я в УНФ 8 переношу справочники Контрагентов и номенклатуры далее в бух 77 завожу у этих справочников реквизит Ref в котором будет храниться Уникальный идентификатор из УНФ. УНФ изначально пустая. Делаю выгрузку обратно в 77 из УНФ этих ID. теперь на начальном этапе хотелось бы создавать документы счет на оплату в УНФ и выгружать их в бух в минимальном варианте т.е. контрагент номенклатура, количество,цена |
|||
21
4esz
24.02.12
✎
17:58
|
в унф завел планОбмена файлик который указывал в (0) как раз он и дает
теперь вроде как осталось подгрузить этот файл в 77 и отправить уведомление о том что загрузка сделана. Загрузка всегда будет идти только в одну сторону доки в 77 не меняются |
|||
22
4esz
27.02.12
✎
11:21
|
так я все же про (20) и (21) мыслю хотя бы в том направлении или нет?
|
|||
23
4esz
28.02.12
✎
08:08
|
решил вопрос
вдруг кому то пригодится Процедура РасшифровкаХМЛ(ФайлЭксп) СписокДляДок = СоздатьОбъект("СписокЗначений"); ТЧДляДок = СоздатьОбъект("ТаблицаЗначений"); ТЧДляДок.НоваяКолонка("Номенклатура",,,,"Номенклатура"); ТЧДляДок.НоваяКолонка("Количество","Число",14,3,"Количество"); ТЧДляДок.НоваяКолонка("Цена","Число",15,2,"Цена"); ТЧДляДок.НоваяКолонка("Сумма","Число",15,2,"Сумма"); ТЧДляДок.НоваяКолонка("СуммаНДС","Число",15,2,"СуммаНДС"); ТЧДляДок.НоваяКолонка("Всего","Число",15,2,"Всего"); //Сначала проинициализируем компоненту v7plus, предоставляющую объекты для работы с XML: Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "v7plus.dll") <> 1 Тогда Предупреждение("Компонента v7plus.dll не найдена!"); КонецЕсли; КонецЕсли; ФормИмяФайлаДанных = ФайлЭксп; гXMLАнализатор = СоздатьОбъект("AddIn.XMLParser"); гФайл = гXMLАнализатор.СоздатьПоследовательноСчитываемыйДокумент(); гФайл.СвязатьСФайлом(ФормИмяФайлаДанных); ТипТега = гФайл.Спуститься(); н = 0; НачалиЗаписьДока = 0; СчиталиДок = 0; ЗаписалиДок = 0; Пока ТипТега <> 4 Цикл // пока не достигнут конец файла //ТипТега = гФайл.Спуститься(); Если ТипТега <> 1 Тогда ТипТега = гФайл.Следующий(); Продолжить; КонецЕсли; // пропускаем концы уровней и инструкции ИмяТега = гФайл.СвойстваТекущегоУзла.Имя; УровеньТега = гФайл.СвойстваТекущегоУзла.Уровень; //Сообщить(""+УровеньТега+" - "+ИмяТега ); Если УровеньТега < 3 Тогда ТипТега = гФайл.Спуститься(); Продолжить; КонецЕсли; //нам нужно обработать уровень 3 на нем находятся и документы и справочники //определимся что обрабатываем по имени тега Если (УровеньТега = 3) И (Найти(ИмяТега,"DocumentObject") <> 0) Тогда //загрузка документа Если ЗаписалиДок <> СчиталиДок Тогда //здесь непосредствено запись документа в БД ЗаписатьДокВБД(ИмяТега,СписокДляДок,ТЧДляДок); ЗаписалиДок = ЗаписалиДок + 1; КонецЕсли; НачалиЗаписьДока = 1; СписокДляДок.УдалитьВсе(); ТЧДляДок.УдалитьСтроки(); СчиталиДок = СчиталиДок + 1; КонецЕсли; //заходим в сам документ (на уровень 4) это реквизиты документа Если (УровеньТега = 4) И (НачалиЗаписьДока = 1) Тогда Если ИмяТега = "Запасы" Тогда //заполняем ТЧ Иначе //заполнили список реквизитами документа ЗначениеТега = УбратьИменаТегов(гФайл.ТекущийЭлементВВидеСтроки(),ИмяТега); СписокДляДок.ДобавитьЗначение(ЗначениеТега,ИмяТега); //Сообщить(""+ИмяТега+" --- "+ЗначениеТега); КонецЕсли; КонецЕсли; // 6 уровень это строки документа Если (УровеньТега = 6) И (НачалиЗаписьДока = 1) Тогда ЗначениеТега = УбратьИменаТегов(гФайл.ТекущийЭлементВВидеСтроки(),ИмяТега); Если ИмяТега = "Номенклатура" Тогда ТЧДляДок.НоваяСтрока(); ТЧДляДок.Номенклатура = ЗначениеТега; ИначеЕсли ИмяТега = "Количество" Тогда ТЧДляДок.Количество = Число(ЗначениеТега); ИначеЕсли ИмяТега = "Цена" Тогда ТЧДляДок.Цена = Число(ЗначениеТега); ИначеЕсли ИмяТега = "Сумма" Тогда ТЧДляДок.Сумма = Число(ЗначениеТега); ИначеЕсли ИмяТега = "СуммаНДС" Тогда ТЧДляДок.СуммаНДС = Число(ЗначениеТега); ИначеЕсли ИмяТега = "Всего" Тогда ТЧДляДок.Всего = Число(ЗначениеТега); КонецЕсли; КонецЕсли; Если н > 500 Тогда Сообщить("стоп"); Прервать; КонецЕсли; н = н + 1; ТипТега = гФайл.Спуститься(); КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |