Записать канонический XML в один свой временный файл и проверить очистку

Учебные задачи

Отдельный согласуемый опыт в новом стенде: уникальное временное имя, канонизация в файл, чтение реальных байтов, сравнение со строкой и удаление только этого файла. Сам справочник ничего не запускает.

Где и как запускать

Полный модуль отдельной управляемой формы; клиентское согласие и серверный опыт с одним собственным временным XML-файлом.

Подготовка

  1. Создайте собственную новую пустую конфигурацию УчебнаяКанонизацияXML85, управляемое приложение, платформа8.5.1.1343. Не используйте production или базу с чужими обработчиками.

  2. Обработки → ОпытXML85 → управляемая форма Форма, основная форма обработки. Для каждого урока создайте отдельную обработку либо заменяйте целиком модуль формы: три модуля ниже не вставляются друг в друга.

  3. Создайте указанную в уроке команду с одноимённым действием и перетащите её на форму. Код — полный модуль формы; вспомогательную серверную функцию оставьте на уровне модуля.

  4. Нажмите F7 и обновите только новый стенд. runtimeVerifiedScenarios=0: справочник проверялся статически; данный код в 1С здесь не выполнялся.

  5. Откройте обработку через функции для технического специалиста. Клиент показывает только итоговую строку; ДокументDOM, фильтр, поток и итератор остаются на сервере.

  6. Исходные данные заданы прямо в коде. Нет внешнего XML, DTD, сети, подписания документов или записи прикладных объектов.

  7. Команда ПроверитьКаноническийФайл85. Добавьте реквизит РазрешитьУчебныйФайл типа Булево, исходно Ложь; покажите его флажком на форме. Без согласия кнопка не вызывает серверный опыт.

  8. Администратор должен разрешить только учебный временный каталог учётной записи сервера стенда, исключив постороннюю запись и гонки за именем файла. Не запускайте на общей файловой площадке или в рабочем сеансе.

  9. После собственного ручного подтверждения опыт создаст один временный XML-файл на сервере, не на компьютере тонкого клиента. Это тестовый результат, не резервная копия. В ходе подготовки справочника этот файл не создавался.

&НаКлиенте
Процедура ПроверитьКаноническийФайл85(Команда)
    Если Не РазрешитьУчебныйФайл Тогда
        ВызватьИсключение "Подтвердите один временный учебный файл на сервере стенда";
    КонецЕсли;
    Сообщить(ПроверитьСвойФайлНаСервере());
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроверитьСвойФайлНаСервере()
    Документ = Новый ДокументDOM("", "demo");
    Корень = Документ.ЭлементДокумента;
    Корень.УстановитьАтрибут("b", "2");
    Корень.УстановитьАтрибут("a", "1");
    Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("A & B"));
    Преобразователь = Новый ПреобразованиеККаноническомуXML;
    Алгоритм = ТипКаноническогоXML.КаноническийXML1_1;
    ОжидаемаяСтрока = Преобразователь.КанонизироватьВСтроку(Документ, Алгоритм);
    ПутьСвоегоФайла = ПолучитьИмяВременногоФайла("xml");
    СвойФайл = Новый Файл(ПутьСвоегоФайла);
    Если СвойФайл.Существует() Тогда
        ВызватьИсключение "Отказ: даже уникальное имя не должно указывать на существующий файл";
    КонецЕсли;
    ОшибкаОпыта = "";
    Попытка
        Преобразователь.КанонизироватьВФайл(Документ, ПутьСвоегоФайла, Алгоритм);
        ДанныеФайла = Новый ДвоичныеДанные(ПутьСвоегоФайла);
        СтрокаФайла = ПолучитьСтрокуИзДвоичныхДанных(ДанныеФайла, КодировкаТекста.UTF8);
        Если СтрокаФайла <> ОжидаемаяСтрока Тогда
            ВызватьИсключение "Содержимое своего файла отличается от канонической строки";
        КонецЕсли;
    Исключение
        ОшибкаОпыта = ОписаниеОшибки();
    КонецПопытки;
    Попытка
        Если СвойФайл.Существует() Тогда
            УдалитьФайлы(ПутьСвоегоФайла);
        КонецЕсли;
        Если СвойФайл.Существует() Тогда
            ВызватьИсключение "Свой временный файл ещё существует";
        КонецЕсли;
    Исключение
        ОшибкаОпыта = ОшибкаОпыта + " Не подтверждено удаление своего временного файла: " + ОписаниеОшибки();
    КонецПопытки;
    Если ОшибкаОпыта <> "" Тогда
        ВызватьИсключение ОшибкаОпыта;
    КонецЕсли;
    Возврат "Свой канонический файл совпал со строкой и удалён. Резервные копии не создавались.";
КонецФункции

Разбор по шагам

  1. Собственный demo создаётся в памяти; строковая канонизация служит ожидаемым результатом для файлового варианта с тем же алгоритмом.

  2. ПолучитьИмяВременногоФайла даёт уникальное имя, но не создаёт файл. Если по этому имени уже что-то существует, опыт отказывается до записи и не удаляет найденный объект.

  3. КанонизироватьВФайл получает только сгенерированное имя, не пользовательский путь, каталог или маску. Новый ДвоичныеДанные читает фактически записанные байты.

  4. Байты декодируются UTF-8 и полностью сравниваются с ожидаемой строкой. Ошибка записи, чтения или сравнения сохраняется, но не пропускает попытку очистки.

  5. УдалитьФайлы получает только полное имя своего единственного файла. Отдельно проверяется отсутствие файла после очистки; ошибки очистки добавляются к исходной ошибке.

  6. Успех возвращается лишь после совпадения результата и подтверждённой очистки. Учебная база и каталог не удаляются.

Как проверить результат

  1. Без установленного флажка серверная функция не вызывается.

  2. Содержимое созданного файла равно результату КанонизироватьВСтроку для того же DOM и алгоритма.

  3. После успеха своего временного файла нет. При отказе файловой системы выводится исключение, а не ложное сообщение об очистке.

  4. Отказ при уже существующем имени находится перед записью и удалением; чужой файл код не принимает как свой.

Ожидаемый результат

Свой канонический файл совпал со строкой и удалён. Резервные копии не создавались.

На что обратить внимание

  1. УдалитьФайлы без маски может удалить каталог, если передать каталог. В этом уроке допускается только полное сгенерированное имя XML-файла; не заменяйте его путём к каталогу.

  2. Проверка Существует не является атомарным резервированием имени. Обязателен закрытый учебный временный каталог без чужой записи; этот код не предназначен для враждебной общей файловой среды.

  3. На сервере пути и права относятся к серверной учётной записи. Клиентский путь C: не переносится на сервер автоматически.

  4. Ошибка очистки требует осмотра именно показанного учебного окружения. Не пытайтесь очищать все временные каталоги по маске.

  5. Никакой реальный файл при подготовке этого урока не создавался и не удалялся. Ручной запуск допускается только после F7 и согласия в собственном стенде.

  6. Этот вариант нужен для знакомства с файловым API. Для обычного сравнения используйте предыдущий урок в памяти, без файловых прав.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.