Обмен между базами через XML (создается ФабрикаXDTO) В процедурах выгрузки/загрузки создается ФабрикаXDTO из схемы, которая хранится в макете как файл. Файл настроек схемы надо использовать один и тот же в обработках Загрузки/Выгрузки
Из Фабрики создается объект, его заполняю выгружаемыми данными
Фабрику сохраняю в XML. В процедуре загрузки из читаю фабрику из XML и пробегаю по объектам
Очень удобно!
Код 1C v 8.х Функция СоздатьФайлСхемы()
ФайлСхемы = Новый Файл( КаталогВременныхФайлов( ) + "schema.xsd" ) ;
Если ФайлСхемы. Существует( ) Тогда
УдалитьФайлы( ФайлСхемы. ПолноеИмя) ;
КонецЕсли ;
Ссылка = ПолучитьМакет( "schema_xsd" ) ;
Ссылка. Записать( ФайлСхемы. ПолноеИмя) ;
Возврат ФайлСхемы. ПолноеИмя;
КонецФункции
Функция ВыгрузитьДокументы()
ФайлыXSD = Новый Массив( ) ;
ФайлыXSD. Добавить( СоздатьФайлСхемы( ) ) ;
Фабрика = СоздатьФабрикуXDTO( ФайлыXSD) ;
ФайлОбмена = Фабрика. Создать( Фабрика. Тип( "http://anton.fly7.ru" , "ФайлОбмена" ) ) ;
Пока Выборка. Следующий( ) Цикл
Документ = Фабрика. Создать( Фабрика. Тип( "http://anton.fly7.ru" , "Документ" ) ) ;
Документ. ID = Строка( Док. УникальныйИдентификатор( ) ) ;
Документ. ВидДокумента = Док. Метаданные( ) . Имя;
Документ. Дата = Док. Дата;
Документ. Номер = Док. Номер;
Документ. Статус = ? ( Док. Проведен, "Проведен" , ? ( Док. ПометкаУдаления, "ПометкаУдаления" , "НеПроведен" ) ) ;
Документ. Комментарий = Док. Комментарий;
КонецЦикла
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML( "UTF-8" , "1.0" , Ложь ) ;
МойXML = Новый ЗаписьXML;
МойXML. ОткрытьФайл( ИмяФайла, ПараметрыЗаписиXML) ;
МойXML. ЗаписатьОбъявлениеXML( ) ;
Фабрика. ЗаписатьXML( МойXML, ФайлОбмена) ;
МойXML. Закрыть( ) ;
ОбщегоНазначенияКлиентСервер. СообщитьПользователю( "Создан файл обмена " + ИмяФайла) ;
КонецФункции
Процедура ЗагрузитьДокументы()
ФайлыXSD = Новый Массив( ) ;
ФайлыXSD. Добавить( СоздатьФайлСхемы( ) ) ;
Фабрика = СоздатьФабрикуXDTO( ФайлыXSD) ;
ФайлОбмена = Фабрика. Создать( Фабрика. Тип( "http://anton.fly7.ru" , "ФайлОбмена" ) ) ;
ОбменXML = Новый ЧтениеXML;
ОбменXML. ОткрытьФайл( ИмяФайла) ;
ФайлОбмена = Фабрика. ПрочитатьXML( ОбменXML, Фабрика. Тип( "http://anton.fly7.ru" , "ФайлОбмена" ) ) ;
Для Каждого Документ Из ФайлОбмена. Документ Цикл
ОбработкаПрерыванияПользователя( ) ;
Если Документ. ВидДокумента = "ПоступлениеТоваров" И
ЗначениеЗаполнено( Поставщик) И
Документ. Контрагент. ИНН Поставщик. ИНН Тогда
КонецЕсли ;
КонецЦикла
ФайлОбмена = "" ;
ОбменXML. Закрыть( ) ;
УдалитьФайлы( ИмяФайла) ;
КонецПроцедуры
Файл схемы примерно такой (разукрашка съела скобки, но смысл должен быть понятен ))
Код xs:schema xmlns:tns="http://anton.fly7.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://anton.fly7.ru" attributeFormDefault="unqualified" elementFormDefault="qualified">
xs:complexType name="ФайлОбмена">
xs:sequence>
xs:element name="Документ" type="tns:Документ" nillable="true" maxOccurs="unbounded"/>
xs:sequence>
xs:complexType>
xs:complexType name="Документ">
xs:sequence>
xs:element name="ID" type="xs:string"/>
xs:element name="ВидДокумента" type="xs:string"/>
xs:element name="Статус" type="xs:string"/>
xs:element name="Дата" type="xs:dateTime"/>
xs:element name="Номер" type="xs:string"/>
xs:element name="Контрагент" type="tns:Контрагент"/>
xs:element name="Свойства" type="tns:ТаблицаСвойства" nillable="true" minOccurs="0"/>
xs:sequence>
xs:complexType>
xs:complexType name="Контрагент">
xs:sequence>
xs:element name="ID" type="xs:string"/>
xs:element name="Наименование" type="xs:string"/>
xs:element name="ИНН" type="xs:string"/>
xs:sequence>
xs:complexType>
xs:complexType name="ТаблицаСвойства">
xs:sequence>
xs:element name="СтрокаСвойства" type="tns:СтрокаСвойство" nillable="true" maxOccurs="unbounded"/>
xs:sequence>
xs:complexType>
xs:complexType name="СтрокаСвойство">
xs:sequence>
xs:element name="Наименование" type="xs:string" nillable="true"/>
xs:element name="Значение" type="xs:string" nillable="true"/>
xs:sequence>
xs:complexType>
xs:schema>
Автор:
Абазин Антон Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Подключение к web-сервису и получение от него описание типа Подключается к 1с82 web-сервису, получает от него описание типа
Создает переменную этого типа, Создает файл (dbf обмена).
Помещает файл в переменную и отдает на web-сервис для обработки, получает от него результат обработки
Код 1C v 8.х Определение = Новый WSОпределения( Server, User, Pass) ;
Прокси = Новый WSПрокси( Определение, "http://www.anton.fly7.ru" , "Obmen" , "ObmenSoap" ) ;
Прокси. Пользователь = User;
Прокси. Пароль = Pass;
Тип = Прокси. ФабрикаXDTO. Тип( "http://www.anton.fly7.ru" , "ФайлОбмена" ) ;
ФайлОбмена = Прокси. ФабрикаXDTO. Создать( Тип) ;
Файл = Новый Файл( КаталогВременныхФайлов( ) + "dat.dbf" ) ; i= 1 ;
Пока Файл. Существует( ) Цикл
Файл = Новый Файл( КаталогВременныхФайлов( ) + "dat" + i + ".dbf" ) ;
i= i+ 1 ;
КонецЦикла ;
ДБ = Новый XBase;
ЗаполнитьПоляДБ( ДБ, ТабСвойств) ;
ДБ. СоздатьФайл( Файл. ПолноеИмя) ;
ДБ. АвтоСохранение = Истина ;
ДБ. Добавить( ) ;
ДБ. Artik = Номенклатура. Артикул;
ДБ. Name = Строка( Номенклатура) ;
ДБ. NomGrup = Строка( Номенклатура. ТипНоменклатуры) ;
ДБ. VidNom = Строка( Номенклатура. ВидНоменклатуры) ;
ДБ. Group = ПолучитьГруппу( Номенклатура) ;
ДБ. Strana = "" ;
ДБ. Pol = "" ;
ДБ. Записать( ) ;
ДБ. ЗакрытьФайл( ) ;
ФайлДвоичныеДанные = Новый ДвоичныеДанные( Файл. ПолноеИмя) ;
ФайлаХранилищеЗначения = Новый ХранилищеЗначения( ФайлДвоичныеДанные, Новый СжатиеДанных( 9 ) ) ;
ФайлОбмена. ТипФайла = 1 ;
ФайлОбмена. ИмяФайла = "data_" + СокрЛП( СсылкаНаОбъект. Номер) + ".dbf" ;
ФайлОбмена. Данные = ФайлаХранилищеЗначения. Получить( ) ;
УдалитьФайлы( Файл. ПолноеИмя) ;
Результат = Прокси. LoadDocs( ФайлОбмена) ;
Если ЗначениеЗаполнено( Результат) Тогда
ОбщегоНазначенияКлиентСервер. СообщитьПользователю( Результат) ;
КонецЕсли ;
Автор:
Абазин Антон Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты