Добрый день!
Делаю управление некой задачей из планировщика винды...
Но, лазить в нем интерактивно - вломммм....
Поэтому решил из 1С из настроек создавать, запускать и вообще "рулить" этой задачей.
Для этого, есть утилита коммандной строки "SCHTASKS". В принципе, это не само по себе, а просто интерфейс коммандной строки, который рулит планировщиком. Сам планировщик - он один.
Сделал. Все работает идеально.
Но, есть некоторые параметры, которые не доступны через "SCHTASKS", и можно их настроить только интерактивно.
Ну, или применить "импорт" задания из XML через ту-же утилиту "SCHTASKS".
Саму XML можно экспортировать из планировщика.
Это все хорошо, но, решил, что буду создавать ее на ходу, прямо в 1С, через XML_DOM.
Но, созданная XML не грузится - ошибка структуры.
Стал разбираться, оказывается, при создании XML из 1С добавляется лишний атрибут, он-же пространство имен, к узлам первого уровня, хотя, в экспортированной, пространство имен есть только у корневого элемента, узлы первого уровня, идут совсем без атрибутов.
Попытка разобраться с МС парсером и DOM ни к чему не привела - упорно пишет этот атрибут, хоть что делай.
Везде советуют просто удалять лишнее из готового файла.
Прекрасно, но кодировка XML - utf-16.
Средствами работы с текстом 1С она корректно не читается.
В общем, через поток (АдобСтрим) и прочие извращения, победил это, частично... Правда только в utf-8 удалось сохранить... Но, планировщик ее глотает, единственное а начале файла нало указать, что это utf-16.
При попытке открыть ее на просмотр - кракозябры, вообще на китайские иероглифы похожие.
Как можно это побороть? Как-то не верно это, хоть и работает...
Да, кстати, никакой кирилицы в XML нет, все символы латиница и цифры... Какая ему разница до кодировки в таком случае?
Пояснение к картинкам.
Первая - экспортировано из планировщика. Подчеркнуты узлы, которые без атрибутов должны быть.
Вторая - как формирует 1С. Подчеркнуты лишние атрибуты.
Третья - после открытия в 1С и сохранения в utf-8, но с заголовком, что это, якобы utf-16. Такую "красоту", рисует конечно просмотрщик, так, как не понимает кодировку - в заголовке 16, внутри 8. Но, такую XML нормально переваривает планировщик :-) Если в блокноте поменять в заголовке 16 на 8 - то просмотрщик начинает открывать нормально, но планировщик говорит, что файл не верный.
У тебя не получилось первую "картинку" получить средствами XML_DOM?
Да. Именно так. Получается вторая, хоть убей...
У подчиненных корневому узлу узлов, упорно образуется лишний атрибут, как-бы унаследованный от корня. В таком виде планировщик ХМЛ не принимает, структура не нравится. Если убрать атрибуты вручную, в любом редакторе, то глотает нормально.
Делаю так, фрагмент кода:
XML_DOM = CreateObject("MSXML2.DOMDocument.6.0");
XML_HELPER = CreateObject("Msxml2.MXNamespaceManager.6.0");
Header = XML_DOM.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-16""" );
XML_DOM.appendChild(Header);
XML_TASK = XML_DOM.createNode(1,"Task",);
XML_DOM.appendChild(XML_TASK);
ДобавитьАттрибут(XML_DOM, XML_TASK, "version", "1.2");
ДобавитьАттрибут(XML_DOM, XML_TASK, "xmlns", "http://schemas.microsoft.com/windows/2004/02/mit/task");
XML_REGISTR = XML_DOM.createNode(1,"RegistrationInfo",);
XML_TASK.appendChild(XML_REGISTR);
XML_TASK- корень документа, у него атрибутом идет это пространство имен, добавляю его и версию.
XML_REGISTR - подчиненный ему узел. Никакие атрибуты ему не добавляю, он сам их "притягивает" (наследует) от родителя.
Дальше, узлы следующего уровня, подчиненные например XML_REGISTR - уже нормально, никаких атрибутов не подтягивают.
Если удалось-бы победить это, то и дальнейшая обработка и "выпиливание" лишнего из готовой ХМЛ была бы не нужна.
//*******************************************
Функция ДатаВXML(пДата, пВремя = "") Экспорт
лДатаСтрокой = Формат(пДата, "ДГГГГММДД");
лРезультат = Сред(лДатаСтрокой, 1, 4) + "-" + Сред(лДатаСтрокой, 5, 2) + "-" + Сред(лДатаСтрокой, 7, 2);
Если пВремя <> "" Тогда
лРезультат = лРезультат + "T" + пВремя;
КонецЕсли;
Возврат лРезультат;
КонецФункции
//*******************************************
Функция ДобавитьЭлемент(ДокXML, Родитель, ИмяЭлемента, Значение="") Экспорт
Узел = ДокXML.createElement(ИмяЭлемента);
Если Значение <> "" Тогда
Узел.text = Строка(Значение);
КонецЕсли;
Возврат Родитель.appendChild(Узел);
КонецФункции
//*******************************************
Процедура Сформировать()
ДокXML = СоздатьОбъект("Msxml2.DOMDocument");
ДокXML.appendChild(ДокXML.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-16"""));
Task = ДобавитьЭлемент(ДокXML, ДокXML, "Task");
Task.setAttribute("version", "1.2");
Task.setAttribute("xmlns", "http://schemas.microsoft.com/windows/2004/02/mit/task");
RegistrationInfo = ДобавитьЭлемент(ДокXML, Task, "RegistrationInfo");
ДобавитьЭлемент(ДокXML, RegistrationInfo, "Date", ДатаВXML(ТекущаяДата(), ТекущееВремя()));
ДобавитьЭлемент(ДокXML, RegistrationInfo, "Author", "trad");
Triggers = ДобавитьЭлемент(ДокXML, Task, "Triggers");
TimeTrigger = ДобавитьЭлемент(ДокXML, Triggers, "TimeTrigger");
Repetition = ДобавитьЭлемент(ДокXML, TimeTrigger, "Repetition");
ДобавитьЭлемент(ДокXML, Repetition, "Interval", "PT1M");
ДобавитьЭлемент(ДокXML, Repetition, "StopAtDurationEnd", "false");
ДокXML.save(мПуть);
КонецПроцедуры
Ага, так работает, спасибо!
То, "что доктор прописал" :-)
Сейчас буду разбираться, где накосячил :-)
СоздатьОбъект("Msxml2.DOMDocument") -> OLE.IXMLDOMDocument2
СоздатьОбъект("MSXML2.DOMDocument.6.0") -> OLE.IXMLDOMDocument3
DOMDocument3 чувствителен к пространствам имен. Поэтому тут нужно их указывать.
Вот ты указал NS для Task, а далее не указываешь. Парсер считает что RegistrationInfo и все вложенные уже в другом, пустом NS, поэтому и добавляет xmlns=""
Сделай так
ns = "http://schemas.microsoft.com/windows/2004/02/mit/task";
XML_DOM.createNode(1,"RegistrationInfo", ns);
// и для всех вложенных тоже
Понятно, спасибо. Можно и так, это пришло в голову когда первое свое сообщение за сегодня сегодня перечитывал, переосмыслил написанное, но попробовать не успел.
Но, можно и по твоему - я у корневого узла добавлял атрибуты методом createAttribute, а надо методом setAttribute.
Переделал, это сразу помогло, лишние атрибуты у подчиненных узлов исчезли, у всех до конца файла.
Хм... Еще и объект влияет, версия парсера:
Так - подставляет атрибуты лишние: XML_DOM = CreateObject("MSXML2.DOMDocument.6.0");
А так: XML_DOM = CreateObject("MSXML2.DOMDocument"); нет, все нормально.
Это как равз то, что в сообщениях #5 и #6, "проверил на практике", все так и есть :-)