Проверить, почему настоящий текст в .tmp не означает поддерживаемый TXT

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

Отрицательный опыт использует те же непустые UTF-16-байты, но собственное расширение .tmp. Пустое извлечение не выдаётся за пустой исходный документ.

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

Полный серверный общий модуль своей пустой учебной конфигурации на 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==");
        ИмяИсходного = СоздатьСвойФайл(Состояние, Данные, ".tmp");
        Сообщить(Данные.Размер() > 0);
        Извлекатель = Новый ИзвлечениеТекста(ИмяИсходного);
        Текст = Извлекатель.ПолучитьТекст();
        Если Текст = "" Тогда
            Сообщить("Отрицательный опыт: непустой текст в .tmp не извлечён. Это ограничение/ошибка извлечения, не доказательство пустого исходника.");
        Иначе
            Сообщить("Фактическое поведение фильтра отличается от стандартного описания .tmp. Проверьте установленные дополнительные IFilter; успех универсального чтения не обещается.");
        КонецЕсли;
    Исключение
        Сообщить("Основной опыт не подтверждён. Проверьте собственную Windows-платформу, IFilter, расширение и кодировку; пустой результат не является успехом.");
    КонецПопытки;
    Извлекатель = Неопределено;
    УбратьТолькоСвоиФайлы(Состояние);
КонецПроцедуры
Процедура ПроверитьУчебнуюПлатформу()
    Система = Новый СистемнаяИнформация;
    Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86
        И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
        ВызватьИсключение "Этот пример использует Windows CryptoAPI";
    КонецЕсли;
КонецПроцедуры

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

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

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

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

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

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

  4. Создать только собственный TMP с тем же UTF-16 содержимым и показать, что исходные байты непустые.

  5. ПолучитьТекст выбирает фильтр по расширению. Нельзя автоматически считать TMP текстовым TXT.

  6. Пустая строка здесь — отрицательный результат для непустого исходника, а не документ без данных.

  7. Если расширение обслуживает дополнительный фильтр, зафиксировать отличие, не обещать такое поведение на другой машине; убрать только свой TMP.

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

  1. Размер собственных исходных байтов > 0: Истина.

  2. Стандартное описанное поведение .tmp — пустое извлечение с понятным отрицательным сообщением.

  3. Не создаётся легенда о пустом документе и не выполняется установка фильтра; собственный TMP отдельно убран.

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

На настоящем собственном непустом файле показана разница между содержимым и поддержкой его расширения.

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

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

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

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

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

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

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

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

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

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

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

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