Извлечь два осмысленных маркера из собственного UTF-16 TXT

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

В модуле создаётся настоящий собственный непустой TXT с BOM. Проверяется имя выбранного файла и наличие английского маркера и кириллической строки после IFilter.

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

Полный серверный общий модуль своей пустой учебной конфигурации на Windows 8.5.1.1343. Только собственные уникальные временные файлы с публичным учебным текстом; здесь IFilter и BSL не запускались.

Подготовка

  1. Создайте свою отдельную пустую конфигурацию УчебнаяКонфигурацияСинтаксиса на Windows и платформе ровно 8.5.1.1343. Не вставляйте эти модули в УТ/КА2/УНФ/БП или рабочую базу.

  2. Создайте общий модуль УчебноеИзвлечение: Сервер=Истина, Глобальный=Ложь, Привилегированный=Ложь. Клиентские флаги и внешнее соединение выключены. Вставьте полный текст одного урока.

  3. В своей учебной обработке создайте команду Выполнить. Её клиентский обработчик вызывает вашу процедуру с &НаСервереБезКонтекста, в которой выполняется УчебноеИзвлечение.ВыполнитьПример(). Все вспомогательные функции остаются в общем модуле рядом с экспортной процедурой.

  4. В файловой базе Windows серверный код работает на этой машине; в клиент-серверной базе проверьте Windows именно на сервере исполнения. КаталогВременныхФайлов относится к этому серверному контексту, не к произвольному диску клиентского ПК.

  5. ИзвлечениеТекста использует Windows IFilter. TXT в установленной справке ожидается в ANSI или Unicode UTF-16. Образцы встроены как собственные UTF-16LE-байты с BOM FF FE; исходные файлы не UTF-8.

  6. Фильтр выбирается по расширению. TXT и TMP в отрицательном опыте содержат одинаковые настоящие байты, но разные расширения. Установленные дополнительные IFilter могут влиять на поддерживаемые форматы; мы ничего не устанавливаем.

  7. Каждый файл имеет префикс УчебноеИзвлечение_, новый UUID и заданное расширение. ФайловыйПоток с СоздатьНовый запрещает перезапись существующего файла. Путь не принимается от постороннего пользователя.

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

  9. Исходный поток закрывается до обращения к IFilter. Объект ИзвлечениеТекста не имеет выдуманного метода Закрыть; перед удалением файлов ссылка на него сбрасывается.

  10. ПолучитьТекст может вернуть пустую строку при ошибке. Поскольку собственный образец непустой, такой результат не объявляется успешным извлечением.

  11. Записать извлекает порциями и записывает выход в UTF-8. Это процедура, не Булево. Её результат проверяем чтением собственного выходного файла с явно указанной кодировкой.

  12. Перед аварийным закрытием процесса очистка может не успеть выполниться. При ошибке удаления выводится точный путь собственного файла для ручной проверки; чужие файлы и временный каталог целиком не удаляются.

  13. Здесь в 1С эти примеры не запускались и IFilter не вызывался. Проверены исходники, собственные байты и установленная справка. Файлы на вашем ПК этим заполнением справочника не создавались/удалялись.

Процедура ВыполнитьПример() Экспорт
    ПроверитьУчебнуюПлатформу();
    Состояние = Новый Структура("СвоиФайлы", Новый Массив);
    Извлекатель = Неопределено;
    Попытка
        Данные = Base64Значение("//5zAHkAbgB0AGEAeAAtAGcAdQBpAGQAZQAtAG8AdwBuAGUAZAAtAGUAeAB0AHIAYQBjAHQAaQBvAG4ALQBvAG4AZQANAAoAGgQ9BDgEMwQwBDoAIAAzACAASARCBEMEOgQ4BC4ADQAKAA==");
        ИмяИсходного = СоздатьСвойФайл(Состояние, Данные, ".txt");
        Извлекатель = Новый ИзвлечениеТекста(ИмяИсходного);
        Сообщить(Извлекатель.ИмяФайла = ИмяИсходного);
        Текст = Извлекатель.ПолучитьТекст();
        ПроверитьИзвлечённыйТекст(Текст, "syntax-guide-owned-extraction-one", "Книга: 3 штуки.");
        Сообщить(Текст);
    Исключение
        Сообщить("Основной опыт не подтверждён. Проверьте собственную Windows-платформу, IFilter, расширение и кодировку; пустой результат не является успехом.");
    КонецПопытки;
    Извлекатель = Неопределено;
    УбратьТолькоСвоиФайлы(Состояние);
КонецПроцедуры
Процедура ПроверитьУчебнуюПлатформу()
    Система = Новый СистемнаяИнформация;
    Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86
        И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
        ВызватьИсключение "Этот пример использует Windows CryptoAPI";
    КонецЕсли;
КонецПроцедуры

Функция СоздатьСвойФайл(Состояние, Данные, Расширение)
    Если Расширение <> ".txt" И Расширение <> ".tmp" И Расширение <> ".utf8.txt" Тогда
        ВызватьИсключение "Разрешены только собственные учебные расширения";
    КонецЕсли;
    Имя = КаталогВременныхФайлов() + "УчебноеИзвлечение_" + Строка(Новый УникальныйИдентификатор) + Расширение;
    Поток = Неопределено;
    Попытка
        Поток = Новый ФайловыйПоток(Имя, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
        Состояние.СвоиФайлы.Добавить(Имя);
        Данные.Записать(Поток);
        Поток.Закрыть();
        Поток = Неопределено;
    Исключение
        Если Поток <> Неопределено Тогда
            Поток.Закрыть();
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
    Возврат Имя;
КонецФункции

Процедура ПроверитьИзвлечённыйТекст(Текст, Маркер, Содержимое)
    Если ТипЗнч(Текст) <> Тип("Строка") Тогда
        ВызватьИсключение "Ожидался текст";
    КонецЕсли;
    Если Текст = "" Тогда
        ВызватьИсключение "Непустой образец не извлечён: пустая строка не является успехом";
    КонецЕсли;
    Если СтрНайти(Текст, Маркер) = 0 Или СтрНайти(Текст, Содержимое) = 0 Тогда
        ВызватьИсключение "В извлечении не найдены оба собственных учебных маркера";
    КонецЕсли;
    Сообщить("Оба собственных маркера найдены: " + Маркер);
КонецПроцедуры

Процедура УбратьТолькоСвоиФайлы(Состояние)
    Для Каждого Имя Из Состояние.СвоиФайлы Цикл
        Если СтрНайти(Имя, КаталогВременныхФайлов() + "УчебноеИзвлечение_") <> 1 Тогда
            ВызватьИсключение "Путь не относится к собственным файлам этого учебного опыта";
        КонецЕсли;
        Попытка
            Проверка = Новый Файл(Имя);
            Если Проверка.Существует() Тогда
                УдалитьФайлы(Имя);
            КонецЕсли;
            Проверка = Новый Файл(Имя);
            Если Проверка.Существует() Тогда
                Сообщить("ОЧИСТКА НЕ ПОДТВЕРЖДЕНА: собственный файл остался: " + Имя);
            Иначе
                Сообщить("Собственный файл больше не существует");
            КонецЕсли;
        Исключение
            Сообщить("ОЧИСТКА НЕ ПОДТВЕРЖДЕНА: проверьте только собственный файл: " + Имя);
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

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

  1. Проверить собственную конфигурацию, Windows перед созданием файла.

  2. Создать только собственные UTF-16LE-байты с BOM; открыть уникальный файл строго через СоздатьНовый.

  3. Закрыть поток до чтения IFilter; список очистки уже содержит только созданный этим запуском путь.

  4. Передать реальное имя только что созданного TXT конструктору ИзвлечениеТекста, не C:/log.txt из чужой машины.

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

  6. Получить строку; пустой результат для непустого исходника не считать успехом.

  7. Проверить оба маркера, вывести реальный текст и освободить ссылку до точечной очистки.

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

  1. Имя файла совпало: Истина. При доступном TXT IFilter найдено два маркера и виден учебный текст.

  2. Переводы строк могут отличаться от исходных; точное равенство всей строке не требуется.

  3. При отсутствии фильтра/ошибке основной опыт не подтверждён; очистка всё равно проверена отдельно.

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

Получен проверяемый текст из реально созданного своего UTF-16 TXT без чтения чужих документов.

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

  1. Расширение .tmp не становится TXT из-за текстового содержимого. Платформа определяет тип по расширению, а не по намерению автора файла.

  2. Не переносите Windows IFilter в Linux, веб-клиент или мобильную платформу. Установленная справка отдельно перечисляет доступность и старые Windows-версии; наличие подходящего фильтра на своей машине нужно проверить.

  3. Пустая строка от ПолучитьТекст не доказывает, что исходный документ пуст. Для нашего непустого образца это неподтверждённое извлечение.

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

  5. Исходный TXT — UTF-16 с BOM, результат Записать — UTF-8. Нельзя читать оба одним произвольным значением кодировки.

  6. Нет общего безопасного «удалить всё временное»: список очистки формируется только после успешного СоздатьНовый, а удаление получает точный собственный путь.

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

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

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

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

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