Имя: Пароль:
1C
1C 7.7
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;
       
       ТипТега = гФайл.Спуститься();
       
   КонецЦикла;
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший