Приходится работать с текстами XML. Обменами сейчас только ленивый не занимается. Вроде бы инструментария, применительно к XML-обмену, хватает. Есть ДокументDOM, поиск языком XPath, и конечно ФабрикаXDTO вкупе с ПакетамиXDTO. Знаем, пользуемся - все понятно, отлажено и предсказуемо.
Возникло обстоятельство со следующими вводными: работа с обменом XML-содержимым, но во внешней обработке, без всякой возможности куда-либо вмонтировать ПакетыXDTO. Фабрика без Пакетов считается банкротом) Да, я знаю, что можно загнать файл шаблона (XSD) в макет внешней обработки и доставать его оттуда для создания схемы. Но вопрос-то оставался нерешенным, есть объект языка, который не работает, ведь - должен! В моем случае шаблоны XML-обмена были не самыми простыми. Почти все элементы снабжались фасетами проверок, структура шаблона тоже была не фиксированной. Файлы XML, в зависимости от результатов обмена, могли приходить с разным составом элементов. Было еще много чего, что делало применение ФабрикиXDTO очень желательным.
Как бы, метод создания ФабрикиXDTO по НаборуСхемXML есть, Берешь СхемыXML, наполняешь ими соответствующий НаборСхемXML, по которому и должна создаваться так необходимая ФабрикаXDTO.
Так и поступил.... Не работает! Без оговорок - не работает, от слова - совсем!
Известный метод - кинулся на форумы. При попытке набрать "СхемаXML" в поисковике выдавалось несколько строк на разных форумах, где вопросы были, а ответов под ними было достаточно мало. Наполнять СхемуXML содержимым получилось достаточно быстро. Очень рекомендую, при заполнении данного объекта содержимым, представлять в воображении именно ПакетXDTO. Мне так оказалось нагляднее. Я наполнил свою схему простыми и составными типами, корневыми элементами. Завожу получившуюся СхемуXML в НаборСхемXML. Запускаю метод создания ФабрикиXDTO, на выходе - ошибка.
Бился, до обидного, долго и безрезультатно. Вроде бы и разбираться было не в чем, методы простые как арифметика!
Уже и не помню, каким образом дошел до решения. Простой объект СхемаXML оказался с "двойным дном". Есть у этого объекта такое свойство <ДокументDOM>. И вот какую процедуру мне пришлось выполнить. Прежде всего выполняем метод объекта:
СхемаXML.ОбновитьЭлементDOM();
В этот момент все, что было занесено в СхемуXML фиксируется в объект вида ДокументDOM и заносится в одноименное свойство схемы. Именно в ДокументеDOM оказывается необходимое нам содержимое.
Имея заполненный ДокументDOM, заново создаем СхемуXML на его основе.
ПостроительСхемы = Новый ПостроительСхемXML;
НоваяСхемаXML = ПостроительСхемы.СоздатьСхемуXML(ДокументDOM);
И вот эта вновь пересозданная схема вносится в набор схем, на базе которого успешно создаётся полноценная фабрика, с которой комфортно и удобно работать.
Вот такая многоходовка. Не знаю, как это задумывалось разработчиками и как должно было бы работать в проекте, но по факту у меня заработало только так! этот механизм я успешно использую уже какое-то время, достаточное чтобы убедиться в полной работоспособности выстраданной мною технологии. Вполне допускаю, что до подобного решения кто-то уже додумывался (был Бойл, но был и Мариотт!), но за месяц безуспешного лазанья по интернету я не нашел ничего, хоть как-то оказавшегося мне полезным. У меня осталось ощущение, что СхемаXML один из самых мало раскрытых объектов. Я очень мало нашел ссылок на работу с данным объектом. Буду рад, если мой опыт окажется коллегам полезным.
Пример кода:
Функция СоздатьПустуюСхемуXML()
ДокументDOM = Новый ДокументDOM("http://www.w3.org/2001/XMLSchema", "xs:schema");
ДокументDOM.ЭлементДокумента.УстановитьСоответствиеПространстваИмен("tns", "http://schemas.xmlsoap.org/soap/envelope/");
ДокументDOM.ЭлементДокумента.УстановитьАтрибут("targetNamespace", "http://schemas.xmlsoap.org/soap/envelope/");
ДокументDOM.ЭлементДокумента.УстановитьАтрибут("attributeFormDefault", "unqualified");
ДокументDOM.ЭлементДокумента.УстановитьАтрибут("elementFormDefault", "qualified");
Построитель = Новый ПостроительСхемXML;
СхемаXML = Построитель.СоздатьСхемуXML(ДокументDOM);
Возврат СхемаXML;
КонецФункции
// Для получения заполненной схемы я обращаюсь к функции, её (схему) создающей
// Если коллеги заметят знакомые имена элементов, то таки - да!
// это описывается шаблон XSD который предлагается ФНС для работы с API сервиса прослеживаемости (РНПТ)
// Исходный шаблон я немного доработал, я - художник, я так вижу!))
Функция СоздатьСхемуXMLЗапросыОтветыHTTP()
// Прежде всего, создается пустая СхемаxML
// я создаю её через ДокументDOM, т.к. мне нужен не просто текст XML
// а законченный документ
СхемаXML = СоздатьПустуюСхемуXML();
// Если я предполагаю использование простых типов с заранее настроенными свойствами, я эти типы создаю и заношу в схему
// чтобы обращаться к простым типам из составных типов и элементов уже по именам
#Область СозданиеПростыхТиповСхемы
// простой тип DATE
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое, "DATE", "http://www.w3.org/2001/XMLSchema", "date");
// простой тип OKPD2
СтруктураФасет = Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS, ФасетОбразцаXS"
, 3, 12, "\d{2}((\.\d{2}\.\d{2}(\.\d{3})?)|(\.\d{2}(\.\d)?)|((\.\d{1})?))");
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "OKPD2"
, "http://www.w3.org/2001/XMLSchema"
, "string"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип t1000
СтруктураФасет = Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 0, 1000);
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "t1000"
, "http://www.w3.org/2001/XMLSchema"
, "string"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип UNIT_CODE
СтруктураФасет = Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 3, 4);
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "UNIT_CODE"
, "http://www.w3.org/2001/XMLSchema"
, "string"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип TNVED
СтруктураФасет = Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS, ФасетОбразцаXS"
, 4, 10, "\d{4,10}");
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "TNVED"
, "http://www.w3.org/2001/XMLSchema"
, "string"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип STATUS
СтруктураФасет = Новый Структура("ФасетМинимальногоВключающегоЗначенияXS, ФасетМаксимальногоВключающегоЗначенияXS, ФасетОбщегоКоличестваРазрядовXS"
, 1, 2, 1);
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "STATUS"
, "http://www.w3.org/2001/XMLSchema"
, "integer"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип tINN
СтруктураФасет = Новый Структура("ФасетОбразцаXS", "\d{10}|\d{12}");
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "tINN"
, "http://www.w3.org/2001/XMLSchema"
, "string"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип ТипРНПТ
СтруктураФасет = Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS, ФасетОбразцаXS"
, 25, 29, "(\d{8})/(\d{6})/(([A-ZА-Я0-9]){7,9})/(\d{1,3})");
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "ТипРНПТ"
, "http://www.w3.org/2001/XMLSchema"
, "string"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип ТипКоличество
СтруктураФасет = Новый Структура("ФасетОбщегоКоличестваРазрядовXS, ФасетКоличестваРазрядовДробнойЧастиXS", 26, 11);
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "ТипКоличество"
, "http://www.w3.org/2001/XMLSchema"
, "decimal"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип Строка50
СтруктураФасет = Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 0, 50);
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "Строка50"
, "http://www.w3.org/2001/XMLSchema"
, "string"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип Строка100
СтруктураФасет = Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 0, 100);
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "Строка100"
, "http://www.w3.org/2001/XMLSchema"
, "string"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
// простой тип tDT_NUMBER
СтруктураФасет = Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 23, 25);
ЗанестиПростойТипXSвСхемуXML(СхемаXML.Содержимое
, "tDT_NUMBER"
, "http://www.w3.org/2001/XMLSchema"
, "string"
, СтруктураФасет
, ВариантПростогоТипаXS.Атомарная);
#КонецОбласти
#Область СозданиеСоставныхТиповСхемы
// Составной тип tFAULT
СоставнойТипXS = СоздатьСоставнойТипСхемыXML("tFAULT");
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент ERR_CODE
ЭлементXS = СоздатьЭлементСхемыXML("ERR_CODE", "integer", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетОбразцаXS", "\d{1,3}"));
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент ERR_NAME
ЭлементXS = СоздатьЭлементСхемыXML("ERR_NAME", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(СоставнойТипXS);
////////////////////////////////////////////////////
// Составной тип tOKPD2
СоставнойТипXS = СоздатьСоставнойТипСхемыXML("tOKPD2");
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент CODE_OKPD2
ЭлементXS = СоздатьЭлементСхемыXML("CODE_OKPD2", "tOKPD2");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NAME_OKPD2
ЭлементXS = СоздатьЭлементСхемыXML("NAME_OKPD2", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(СоставнойТипXS);
///////////////////////////////////////////////////////
// Составной тип tTNVED
СоставнойТипXS = СоздатьСоставнойТипСхемыXML("tTNVED");
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент CODE_TNVED
ЭлементXS = СоздатьЭлементСхемыXML("CODE_TNVED", "tTNVED");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NAME_TNVED
ЭлементXS = СоздатьЭлементСхемыXML("NAME_TNVED", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(СоставнойТипXS);
////////////////////////////////////////////////////////
// Составной тип tTNVEDDict
СоставнойТипXS = СоздатьСоставнойТипСхемыXML("tTNVEDDict");
СоставнойТипXS.ИмяБазовогоТипа = Новый РасширенноеИмяXML("urn://x-artefacts-gnivc-ru/ais3/TRC/ServicesTraceability/types/1.0", "tTNVED");
СоставнойТипXS.МодельСодержимого = МодельСодержимогоXS.Составная;
СоставнойТипXS.МетодНаследования = МетодНаследованияXS.Расширение;
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// // Элемент UNIT_CODE
ЭлементXS = СоздатьЭлементСхемыXML("UNIT_CODE", "UNIT_CODE");
РабочиеФрагменты.Добавить(ЭлементXS);
// // Элемент MARK_CODE
ЭлементXS = СоздатьЭлементСхемыXML("MARK_CODE", "Строка50");
РабочиеФрагменты.Добавить(ЭлементXS);
// // Элемент NAME_UNIT_CODE
ЭлементXS = СоздатьЭлементСхемыXML("NAME_UNIT_CODE", "Строка100");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент STATUS_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("STATUS_GOODS", "boolean", "http://www.w3.org/2001/XMLSchema");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент CODE_CO
ЭлементXS = СоздатьЭлементСхемыXML("CODE_CO", "string", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетДлиныXS", 3));
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NAME_CODE_CO
ЭлементXS = СоздатьЭлементСхемыXML("NAME_CODE_CO", "Строка100");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент FOUND_ADD
ЭлементXS = СоздатьЭлементСхемыXML("FOUND_ADD", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент DATE_ADD
ЭлементXS = СоздатьЭлементСхемыXML("DATE_ADD", "DATE");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(СоставнойТипXS);
////////////////////////////////////////////////////////////////////
// Составной тип tResultTNVED
СоставнойТипXS = СоздатьСоставнойТипСхемыXML("tResultTNVED");
СоставнойТипXS.ИмяБазовогоТипа = Новый РасширенноеИмяXML("urn://x-artefacts-gnivc-ru/ais3/TRC/ServicesTraceability/types/1.0", "tTNVEDDict");
СоставнойТипXS.МодельСодержимого = МодельСодержимогоXS.Составная;
СоставнойТипXS.МетодНаследования = МетодНаследованияXS.Расширение;
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент TNVED
ЭлементXS = СоздатьЭлементСхемыXML("TNVED", "tTNVEDDict");
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, РабочиеФрагменты, , -1);
СхемаXML.Содержимое.Добавить(СоставнойТипXS);
////////////////////////////////////////////////////////////////////
// Составной тип tResultOKPD2
СоставнойТипXS = СоздатьСоставнойТипСхемыXML("tResultOKPD2");
СоставнойТипXS.ИмяБазовогоТипа = Новый РасширенноеИмяXML("urn://x-artefacts-gnivc-ru/ais3/TRC/ServicesTraceability/types/1.0", "OKPD2");
СоставнойТипXS.МодельСодержимого = МодельСодержимогоXS.Составная;
СоставнойТипXS.МетодНаследования = МетодНаследованияXS.Расширение;
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент OKPD2
ЭлементXS = СоздатьЭлементСхемыXML("OKPD2", "tOKPD2");
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, РабочиеФрагменты, , -1);
СхемаXML.Содержимое.Добавить(СоставнойТипXS);
////////////////////////////////////////////////////////////////////
// Составной тип tResultProduct
СоставнойТипXS = СоздатьСоставнойТипСхемыXML("tResultProduct");
СоставнойТипXS.ИмяБазовогоТипа = Новый РасширенноеИмяXML("urn://x-artefacts-gnivc-ru/ais3/TRC/ServicesTraceability/types/1.0", "tResultTNVED");
СоставнойТипXS.МодельСодержимого = МодельСодержимогоXS.Составная;
СоставнойТипXS.МетодНаследования = МетодНаследованияXS.Расширение;
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент NAME_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("NAME_GOODS", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(СоставнойТипXS);
#КонецОбласти
#Область СозданиеКорневыхЭлементовСхемы
// Корневой элемент CheckSTATUSNOTICE_Request
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckSTATUSNOTICE_Request");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент INN
ЭлементXS = СоздатьЭлементСхемыXML("INN", "tINN");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NOTICE_NO
ЭлементXS = СоздатьЭлементСхемыXML("NOTICE_NO", "string", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 1, 255));
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NOTICE_DATE
ЭлементXS = СоздатьЭлементСхемыXML("NOTICE_DATE", "DATE");
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, РабочиеФрагменты, 1);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckSTATUSNOTICE_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckSTATUSNOTICE_Response");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элементы STATUS_CODE + FAULT + RESULT
РабочиеФрагменты = ВнестиЭлементXSдляSTATUS_CODE(КорневыеФрагменты, , 1);
// Элемент PROC_DATE
ЭлементXS = СоздатьЭлементСхемыXML("PROC_DATE", "DATE");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент PROC_STATUS
ЭлементXS = СоздатьЭлементСхемыXML("PROC_STATUS", "Строка50");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NOTICE
ЭлементXS = СоздатьЭлементСхемыXML("NOTICE");
ЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = ЭлементXS.ОпределениеТипа();
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, РабочиеФрагменты, , -1);
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент NAME_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("NAME_GOODS", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент RNPT
ЭлементXS = СоздатьЭлементСхемыXML("RNPT", "RNPT");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент CODE_TNVED
ЭлементXS = СоздатьЭлементСхемыXML("CODE_TNVED", "TNVED");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент QUANT_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("QUANT_GOODS", "ТипКоличество");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент UNIT_CODE
ЭлементXS = СоздатьЭлементСхемыXML("UNIT_CODE", "UNIT_CODE");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NAME_UNIT_CODE
ЭлементXS = СоздатьЭлементСхемыXML("NAME_UNIT_CODE", "Строка100");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент STATUS_DESC
ЭлементXS = СоздатьЭлементСхемыXML("STATUS_DESC", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCRNPT_Request
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCRNPT_Request");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент RNPT
ЭлементXS = СоздатьЭлементСхемыXML("RNPT", "RNPT");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCRNPT_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCRNPT_Response");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент STATUS_CODE + FAULT + RESULT
РабочиеФрагменты = ВнестиЭлементXSдляSTATUS_CODE(КорневыеФрагменты, , 1);
// Элемент CODE_TNVED
ЭлементXS = СоздатьЭлементСхемыXML("CODE_TNVED", "TNVED");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NAME_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("NAME_GOODS", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент CODE_CO_PROD
ЭлементXS = СоздатьЭлементСхемыXML("CODE_CO_PROD", "string", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетДлиныXS", 3));
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, РабочиеФрагменты, 0);
// Элемент NAME_CO_PROD
ЭлементXS = СоздатьЭлементСхемыXML("NAME_CO_PROD", "string", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 1, 500));
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, РабочиеФрагменты, 0);
// Элемент DATE_PROD
ЭлементXS = СоздатьЭлементСхемыXML("DATE_PROD", "DATE");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент UNIT_CODE
ЭлементXS = СоздатьЭлементСхемыXML("UNIT_CODE", "UNIT_CODE");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NAME_UNIT_CODE
ЭлементXS = СоздатьЭлементСхемыXML("NAME_UNIT_CODE", "Строка100");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент QUANT_INPUT_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("QUANT_INPUT_GOODS", "ТипКоличество");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент QUANT_OUTPUT_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("QUANT_OUTPUT_GOODS", "ТипКоличество");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент QUANT_CIRCUL_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("QUANT_CIRCUL_GOODS", "ТипКоличество");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент DATE_UPDATED
ЭлементXS = СоздатьЭлементСхемыXML("DATE_UPDATED", "DATE");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCRNPT_List_Request
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCRNPT_List_Request");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент RNPT
ЭлементXS = СоздатьЭлементСхемыXML("RNPT", "RNPT");
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, КорневыеФрагменты, , 100);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCRNPT_List_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCRNPT_List_Response");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент STATUS_CODE + FAULT + RESULT
РабочиеФрагменты = ВнестиЭлементXSдляSTATUS_CODE(КорневыеФрагменты, , 100);
// Элемент RNPT
ЭлементXS = СоздатьЭлементСхемыXML("RNPT", "RNPT");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент CODE_TNVED
ЭлементXS = СоздатьЭлементСхемыXML("CODE_TNVED", "TNVED");
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, РабочиеФрагменты, 0);
// Элемент TRACEABLE
ЭлементXS = СоздатьЭлементСхемыXML("TRACEABLE", "string", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 1, 2));
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCTNVED_Request
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCTNVED_Request");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент CODE_TNVED
ЭлементXS = СоздатьЭлементСхемыXML("CODE_TNVED", "TNVED");
КорневыеФрагменты.Добавить(ЭлементXS);
// Элемент CURR_DATE
ЭлементXS = СоздатьЭлементСхемыXML("CURR_DATE", "DATE");
КорневыеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCTNVED_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCTNVED_Response");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент STATUS_CODE + FAULT + RESULT
РабочиеФрагменты = ВнестиЭлементXSдляSTATUS_CODE(КорневыеФрагменты, , 1, "tResultTNVED");
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCOKPD2_Request
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCOKPD2_Request");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент CODE_OKPD2
ЭлементXS = СоздатьЭлементСхемыXML("CODE_OKPD2", "OKPD2");
КорневыеФрагменты.Добавить(ЭлементXS);
// Элемент CURR_DATE
ЭлементXS = СоздатьЭлементСхемыXML("CURR_DATE", "DATE");
КорневыеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCOKPD2_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCOKPD2_Response");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент STATUS_CODE + FAULT + RESULT
РабочиеФрагменты = ВнестиЭлементXSдляSTATUS_CODE(КорневыеФрагменты, , 1, "tResultOKPD2");
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCProduct_Request
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCProduct_Request");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// // Элемент NAME_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("NAME_GOODS", "t1000");
КорневыеФрагменты.Добавить(ЭлементXS);
// Элемент CURR_DATE
ЭлементXS = СоздатьЭлементСхемыXML("CURR_DATE", "DATE");
КорневыеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCProduct_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCProduct_Response");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент STATUS_CODE + FAULT + RESULT
РабочиеФрагменты = ВнестиЭлементXSдляSTATUS_CODE(КорневыеФрагменты, , 1, "tResultProduct");
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCProduct_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCDT_Request");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент DT_NUMBER
ЭлементXS = СоздатьЭлементСхемыXML("DT_NUMBER", "tDT_NUMBER");
КорневыеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCDT_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCDT_Response");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент STATUS_CODE + FAULT + RESULT
РабочиеФрагменты = ВнестиЭлементXSдляSTATUS_CODE(КорневыеФрагменты, , 1);
// Элемент CODE_TNVED
ЭлементXS = СоздатьЭлементСхемыXML("CODE_TNVED", "tTNVED");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NAME_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("NAME_GOODS", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент POSIT_NUM
ЭлементXS = СоздатьЭлементСхемыXML("POSIT_NUM", "string", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 0, 3));
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент STATUS_GOODS
ЭлементXS = СоздатьЭлементСхемыXML("STATUS_GOODS", "boolean", "http://www.w3.org/2001/XMLSchema");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент CODE_CO
ЭлементXS = СоздатьЭлементСхемыXML("CODE_CO", "string", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетДлиныXS", 3));
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент NAME_CODE_CO
ЭлементXS = СоздатьЭлементСхемыXML("NAME_CODE_CO", "Строка100");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент FOUND_ADD
ЭлементXS = СоздатьЭлементСхемыXML("FOUND_ADD", "t1000");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент DATE_ADD
ЭлементXS = СоздатьЭлементСхемыXML("DATE_ADD", "DATE");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCDT_List_Request
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCDT_List_Request");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент DT_NUMBER
ЭлементXS = СоздатьЭлементСхемыXML("DT_NUMBER", "tDT_NUMBER");
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, КорневыеФрагменты, , 50);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент CheckTRCDT_List_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("CheckTRCDT_List_Response");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент STATUS_CODE + FAULT + RESULT
РабочиеФрагменты = ВнестиЭлементXSдляSTATUS_CODE(КорневыеФрагменты, , 50);
// Элемент DT_NUMBER
ЭлементXS = СоздатьЭлементСхемыXML("DT_NUMBER", "tDT_NUMBER");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент TRACEABLE
ЭлементXS = СоздатьЭлементСхемыXML("TRACEABLE", "string", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 1, 2));
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент ROW
ЭлементXS = СоздатьЭлементСхемыXML("ROW");
ЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML(, , 1);
СоставнойТипXS = ЭлементXS.ОпределениеТипа();
ВнестиЭлементXSчерезФрагментXS(ЭлементXS, РабочиеФрагменты, 0, -1);
РабочиеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент POSIT_NUM
ЭлементXS = СоздатьЭлементСхемыXML("POSIT_NUM", "string", "http://www.w3.org/2001/XMLSchema", Новый Структура("ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS", 0, 3));
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент CODE_TNVED
ЭлементXS = СоздатьЭлементСхемыXML("CODE_TNVED", "TNVED");
РабочиеФрагменты.Добавить(ЭлементXS);
// Элемент DATE_ADD
ЭлементXS = СоздатьЭлементСхемыXML("DATE_ADD", "DATE");
РабочиеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////////////////////////
// Корневой элемент GetTRCList_Request
КорневойЭлементXS = СоздатьЭлементСхемыXML("GetTRCList_Request");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент CURR_DATE
ЭлементXS = СоздатьЭлементСхемыXML("CURR_DATE", "DATE");
КорневыеФрагменты.Добавить(ЭлементXS);
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
// Корневой элемент GetTRCList_Response
КорневойЭлементXS = СоздатьЭлементСхемыXML("GetTRCList_Response");
КорневойЭлементXS.АнонимноеОпределениеТипа = СоздатьСоставнойТипСхемыXML();
СоставнойТипXS = КорневойЭлементXS.ОпределениеТипа();
КорневыеФрагменты = СоставнойТипXS.Содержимое.Часть.Фрагменты;
// Элемент STATUS_CODE + FAULT + RESULT
РабочиеФрагменты = ВнестиЭлементXSдляSTATUS_CODE(КорневыеФрагменты, , -1, "tResultTNVED");
СхемаXML.Содержимое.Добавить(КорневойЭлементXS);
////////////////////////////////////////////////
#КонецОбласти
// По итогу заполнения схемы обязательно выполняется вот этот метод!
// в результате исполнения которого в реквизит объекта ДокументDOM СхемаXML
// как раз и будут занесены все те типы и элементы, которые накануне внесли в содержимое схему!
СхемаXML.ОбновитьЭлементDOM();
СхемаXML = ПересоздатьСхемуXML(СхемаXML.ДокументDOM);
Возврат СхемаXML;
КонецФункции
// Итоговым процессом становится вот эта функция, об алгоритме которой я и написал в статье
// это пересоздание схемы на основе её свойства ДокументDOM
Функция ПересоздатьСхемуXML(ДокументDOM)
ПостроительСхемы = Новый ПостроительСхемXML;
НоваяСхемаXML = ПостроительСхемы.СоздатьСхемуXML(ДокументDOM);
//И вот эту новую схему мы возвращаем для занесения в набор и создания Фабрики.
// на этом - всё
Возврат НоваяСхемаXML;
КонецФункции