Преобразует документ DOM к каноническому виду.
Синтаксис
КанонизироватьВФайл(<ДокументDOM>, <ИмяФайлаXML>, <ТипКаноническогоXML>, <ФильтрXPath>, <ПрефиксыДляВключения>)Полное описание, параметры и ограничения
ПреобразованиеККаноническомуXML.КанонизироватьВФайл (ConversionToCanonicalXML.CanonicalizeToFile)
ПреобразованиеККаноническомуXML (ConversionToCanonicalXML)
КанонизироватьВФайл (CanonicalizeToFile)
Доступен, начиная с версии 8.3.9.
Синтаксис:
КанонизироватьВФайл(<ДокументDOM>, <ИмяФайлаXML>, <ТипКаноническогоXML>, <ФильтрXPath>, <ПрефиксыДляВключения>)
Параметры:
<ДокументDOM> (обязательный)
Тип: ДокументDOM.
Документ DOM, который нужно записать в каноническом виде.
<ИмяФайлаXML> (обязательный)
Тип: Строка.
Имя файла, в который будет записан текст XML.
<ТипКаноническогоXML> (необязательный)
Тип: ТипКаноническогоXML.
Тип алгоритма приведения к каноническому виду.
Значение по умолчанию: КаноническийXML1_1.
<ФильтрXPath> (необязательный)
Тип: РезультатXPath, Строка.
Если передана Строка, то перед преобразованием к каноническому виду будет выполнен запрос XPath из этой строки, и каноническая форма XML-документа будет содержать только результирующее подмножество документа.
Если передан объект типа РезультатXPath, то к каноническому виду будет преобразовано подмножество узлов из переданного параметра.
Значение по умолчанию: Неопределено.
<ПрефиксыДляВключения> (необязательный)
Тип: Строка.
Содержит список префиксов пространств имен для включения в формате: "Префикс1 Префикс2", и так далее.
Префиксы для включения используются в алгоритме исключающего канонического XML (см. стандарт W3C Exclusive XML Canonicalization - https://www.w3.org/TR/xml-exc-c14n/).
В остальных случаях параметр игнорируется.
Значение по умолчанию: Неопределено.
Возвращаемое значение:
Результат сохраняется в файл.
Описание:
Преобразует документ DOM к каноническому виду.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.9.
Методическая информация
Практические примеры
Записать канонический XML в один свой временный файл и проверить очистку
Отдельный согласуемый опыт в новом стенде: уникальное временное имя, канонизация в файл, чтение реальных байтов, сравнение со строкой и удаление только этого файла. Сам справочник ничего не запускает.
Где и как запускать
Полный модуль отдельной управляемой формы; клиентское согласие и серверный опыт с одним собственным временным XML-файлом.
Подготовка
Создайте собственную новую пустую конфигурацию УчебнаяКанонизацияXML85, управляемое приложение, платформа8.5.1.1343. Не используйте production или базу с чужими обработчиками.
Обработки → ОпытXML85 → управляемая форма Форма, основная форма обработки. Для каждого урока создайте отдельную обработку либо заменяйте целиком модуль формы: три модуля ниже не вставляются друг в друга.
Создайте указанную в уроке команду с одноимённым действием и перетащите её на форму. Код — полный модуль формы; вспомогательную серверную функцию оставьте на уровне модуля.
Нажмите F7 и обновите только новый стенд. runtimeVerifiedScenarios=0: справочник проверялся статически; данный код в 1С здесь не выполнялся.
Откройте обработку через функции для технического специалиста. Клиент показывает только итоговую строку; ДокументDOM, фильтр, поток и итератор остаются на сервере.
Исходные данные заданы прямо в коде. Нет внешнего XML, DTD, сети, подписания документов или записи прикладных объектов.
Команда ПроверитьКаноническийФайл85. Добавьте реквизит РазрешитьУчебныйФайл типа Булево, исходно Ложь; покажите его флажком на форме. Без согласия кнопка не вызывает серверный опыт.
Администратор должен разрешить только учебный временный каталог учётной записи сервера стенда, исключив постороннюю запись и гонки за именем файла. Не запускайте на общей файловой площадке или в рабочем сеансе.
После собственного ручного подтверждения опыт создаст один временный XML-файл на сервере, не на компьютере тонкого клиента. Это тестовый результат, не резервная копия. В ходе подготовки справочника этот файл не создавался.
&НаКлиенте
Процедура ПроверитьКаноническийФайл85(Команда)
Если Не РазрешитьУчебныйФайл Тогда
ВызватьИсключение "Подтвердите один временный учебный файл на сервере стенда";
КонецЕсли;
Сообщить(ПроверитьСвойФайлНаСервере());
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПроверитьСвойФайлНаСервере()
Документ = Новый ДокументDOM("", "demo");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьАтрибут("b", "2");
Корень.УстановитьАтрибут("a", "1");
Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("A & B"));
Преобразователь = Новый ПреобразованиеККаноническомуXML;
Алгоритм = ТипКаноническогоXML.КаноническийXML1_1;
ОжидаемаяСтрока = Преобразователь.КанонизироватьВСтроку(Документ, Алгоритм);
ПутьСвоегоФайла = ПолучитьИмяВременногоФайла("xml");
СвойФайл = Новый Файл(ПутьСвоегоФайла);
Если СвойФайл.Существует() Тогда
ВызватьИсключение "Отказ: даже уникальное имя не должно указывать на существующий файл";
КонецЕсли;
ОшибкаОпыта = "";
Попытка
Преобразователь.КанонизироватьВФайл(Документ, ПутьСвоегоФайла, Алгоритм);
ДанныеФайла = Новый ДвоичныеДанные(ПутьСвоегоФайла);
СтрокаФайла = ПолучитьСтрокуИзДвоичныхДанных(ДанныеФайла, КодировкаТекста.UTF8);
Если СтрокаФайла <> ОжидаемаяСтрока Тогда
ВызватьИсключение "Содержимое своего файла отличается от канонической строки";
КонецЕсли;
Исключение
ОшибкаОпыта = ОписаниеОшибки();
КонецПопытки;
Попытка
Если СвойФайл.Существует() Тогда
УдалитьФайлы(ПутьСвоегоФайла);
КонецЕсли;
Если СвойФайл.Существует() Тогда
ВызватьИсключение "Свой временный файл ещё существует";
КонецЕсли;
Исключение
ОшибкаОпыта = ОшибкаОпыта + " Не подтверждено удаление своего временного файла: " + ОписаниеОшибки();
КонецПопытки;
Если ОшибкаОпыта <> "" Тогда
ВызватьИсключение ОшибкаОпыта;
КонецЕсли;
Возврат "Свой канонический файл совпал со строкой и удалён. Резервные копии не создавались.";
КонецФункцииРазбор по шагам
Собственный demo создаётся в памяти; строковая канонизация служит ожидаемым результатом для файлового варианта с тем же алгоритмом.
ПолучитьИмяВременногоФайла даёт уникальное имя, но не создаёт файл. Если по этому имени уже что-то существует, опыт отказывается до записи и не удаляет найденный объект.
КанонизироватьВФайл получает только сгенерированное имя, не пользовательский путь, каталог или маску. Новый ДвоичныеДанные читает фактически записанные байты.
Байты декодируются UTF-8 и полностью сравниваются с ожидаемой строкой. Ошибка записи, чтения или сравнения сохраняется, но не пропускает попытку очистки.
УдалитьФайлы получает только полное имя своего единственного файла. Отдельно проверяется отсутствие файла после очистки; ошибки очистки добавляются к исходной ошибке.
Успех возвращается лишь после совпадения результата и подтверждённой очистки. Учебная база и каталог не удаляются.
Как проверить результат
Без установленного флажка серверная функция не вызывается.
Содержимое созданного файла равно результату КанонизироватьВСтроку для того же DOM и алгоритма.
После успеха своего временного файла нет. При отказе файловой системы выводится исключение, а не ложное сообщение об очистке.
Отказ при уже существующем имени находится перед записью и удалением; чужой файл код не принимает как свой.
Ожидаемый результат
Свой канонический файл совпал со строкой и удалён. Резервные копии не создавались.
На что обратить внимание
УдалитьФайлы без маски может удалить каталог, если передать каталог. В этом уроке допускается только полное сгенерированное имя XML-файла; не заменяйте его путём к каталогу.
Проверка Существует не является атомарным резервированием имени. Обязателен закрытый учебный временный каталог без чужой записи; этот код не предназначен для враждебной общей файловой среды.
На сервере пути и права относятся к серверной учётной записи. Клиентский путь C: не переносится на сервер автоматически.
Ошибка очистки требует осмотра именно показанного учебного окружения. Не пытайтесь очищать все временные каталоги по маске.
Никакой реальный файл при подготовке этого урока не создавался и не удалялся. Ручной запуск допускается только после F7 и согласия в собственном стенде.
Этот вариант нужен для знакомства с файловым API. Для обычного сравнения используйте предыдущий урок в памяти, без файловых прав.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.