Отрицательный опыт использует те же непустые UTF-16-байты, но собственное расширение .tmp. Пустое извлечение не выдаётся за пустой исходный документ.
Где и как запускать
Полный серверный общий модуль своей пустой учебной конфигурации на Windows 8.5.1.1343. Только собственные уникальные временные файлы с публичным учебным текстом; здесь IFilter и BSL не запускались.
Подготовка
Создайте свою отдельную пустую конфигурацию УчебнаяКонфигурацияСинтаксиса на Windows и платформе ровно 8.5.1.1343. Не вставляйте эти модули в УТ/КА2/УНФ/БП или рабочую базу.
Создайте общий модуль УчебноеИзвлечение: Сервер=Истина, Глобальный=Ложь, Привилегированный=Ложь. Клиентские флаги и внешнее соединение выключены. Вставьте полный текст одного урока.
В своей учебной обработке создайте команду Выполнить. Её клиентский обработчик вызывает вашу процедуру с &НаСервереБезКонтекста, в которой выполняется УчебноеИзвлечение.ВыполнитьПример(). Все вспомогательные функции остаются в общем модуле рядом с экспортной процедурой.
В файловой базе Windows серверный код работает на этой машине; в клиент-серверной базе проверьте Windows именно на сервере исполнения. КаталогВременныхФайлов относится к этому серверному контексту, не к произвольному диску клиентского ПК.
ИзвлечениеТекста использует Windows IFilter. TXT в установленной справке ожидается в ANSI или Unicode UTF-16. Образцы встроены как собственные UTF-16LE-байты с BOM FF FE; исходные файлы не UTF-8.
Фильтр выбирается по расширению. TXT и TMP в отрицательном опыте содержат одинаковые настоящие байты, но разные расширения. Установленные дополнительные IFilter могут влиять на поддерживаемые форматы; мы ничего не устанавливаем.
Каждый файл имеет префикс УчебноеИзвлечение_, новый UUID и заданное расширение. ФайловыйПоток с СоздатьНовый запрещает перезапись существующего файла. Путь не принимается от постороннего пользователя.
Список Состояние.СвоиФайлы содержит только пути успешно созданных этим запуском файлов. Очистка удаляет эти точные пути без масок и без удаления каталогов.
Исходный поток закрывается до обращения к IFilter. Объект ИзвлечениеТекста не имеет выдуманного метода Закрыть; перед удалением файлов ссылка на него сбрасывается.
ПолучитьТекст может вернуть пустую строку при ошибке. Поскольку собственный образец непустой, такой результат не объявляется успешным извлечением.
Записать извлекает порциями и записывает выход в UTF-8. Это процедура, не Булево. Её результат проверяем чтением собственного выходного файла с явно указанной кодировкой.
Перед аварийным закрытием процесса очистка может не успеть выполниться. При ошибке удаления выводится точный путь собственного файла для ручной проверки; чужие файлы и временный каталог целиком не удаляются.
Здесь в 1С эти примеры не запускались и IFilter не вызывался. Проверены исходники, собственные байты и установленная справка. Файлы на вашем ПК этим заполнением справочника не создавались/удалялись.
Процедура ВыполнитьПример() Экспорт
ПроверитьУчебнуюПлатформу();
Состояние = Новый Структура("СвоиФайлы", Новый Массив);
Извлекатель = Неопределено;
Попытка
Данные = Base64Значение("//5zAHkAbgB0AGEAeAAtAGcAdQBpAGQAZQAtAG8AdwBuAGUAZAAtAGUAeAB0AHIAYQBjAHQAaQBvAG4ALQBvAG4AZQANAAoAGgQ9BDgEMwQwBDoAIAAzACAASARCBEMEOgQ4BC4ADQAKAA==");
ИмяИсходного = СоздатьСвойФайл(Состояние, Данные, ".tmp");
Сообщить(Данные.Размер() > 0);
Извлекатель = Новый ИзвлечениеТекста(ИмяИсходного);
Текст = Извлекатель.ПолучитьТекст();
Если Текст = "" Тогда
Сообщить("Отрицательный опыт: непустой текст в .tmp не извлечён. Это ограничение/ошибка извлечения, не доказательство пустого исходника.");
Иначе
Сообщить("Фактическое поведение фильтра отличается от стандартного описания .tmp. Проверьте установленные дополнительные IFilter; успех универсального чтения не обещается.");
КонецЕсли;
Исключение
Сообщить("Основной опыт не подтверждён. Проверьте собственную Windows-платформу, IFilter, расширение и кодировку; пустой результат не является успехом.");
КонецПопытки;
Извлекатель = Неопределено;
УбратьТолькоСвоиФайлы(Состояние);
КонецПроцедуры
Процедура ПроверитьУчебнуюПлатформу()
Система = Новый СистемнаяИнформация;
Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86
И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
ВызватьИсключение "Этот пример использует Windows CryptoAPI";
КонецЕсли;
КонецПроцедуры
Функция СоздатьСвойФайл(Состояние, Данные, Расширение)
Если Расширение <> ".txt" И Расширение <> ".tmp" И Расширение <> ".utf8.txt" Тогда
ВызватьИсключение "Разрешены только собственные учебные расширения";
КонецЕсли;
Имя = КаталогВременныхФайлов() + "УчебноеИзвлечение_" + Строка(Новый УникальныйИдентификатор) + Расширение;
Поток = Неопределено;
Попытка
Поток = Новый ФайловыйПоток(Имя, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
Состояние.СвоиФайлы.Добавить(Имя);
Данные.Записать(Поток);
Поток.Закрыть();
Поток = Неопределено;
Исключение
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Возврат Имя;
КонецФункции
Процедура УбратьТолькоСвоиФайлы(Состояние)
Для Каждого Имя Из Состояние.СвоиФайлы Цикл
Если СтрНайти(Имя, КаталогВременныхФайлов() + "УчебноеИзвлечение_") <> 1 Тогда
ВызватьИсключение "Путь не относится к собственным файлам этого учебного опыта";
КонецЕсли;
Попытка
Проверка = Новый Файл(Имя);
Если Проверка.Существует() Тогда
УдалитьФайлы(Имя);
КонецЕсли;
Проверка = Новый Файл(Имя);
Если Проверка.Существует() Тогда
Сообщить("ОЧИСТКА НЕ ПОДТВЕРЖДЕНА: собственный файл остался: " + Имя);
Иначе
Сообщить("Собственный файл больше не существует");
КонецЕсли;
Исключение
Сообщить("ОЧИСТКА НЕ ПОДТВЕРЖДЕНА: проверьте только собственный файл: " + Имя);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Разбор по шагам
Проверить собственную конфигурацию, Windows перед созданием файла.
Создать только собственные UTF-16LE-байты с BOM; открыть уникальный файл строго через СоздатьНовый.
Закрыть поток до чтения IFilter; список очистки уже содержит только созданный этим запуском путь.
Создать только собственный TMP с тем же UTF-16 содержимым и показать, что исходные байты непустые.
ПолучитьТекст выбирает фильтр по расширению. Нельзя автоматически считать TMP текстовым TXT.
Пустая строка здесь — отрицательный результат для непустого исходника, а не документ без данных.
Если расширение обслуживает дополнительный фильтр, зафиксировать отличие, не обещать такое поведение на другой машине; убрать только свой TMP.
Как проверить результат
Размер собственных исходных байтов > 0: Истина.
Стандартное описанное поведение .tmp — пустое извлечение с понятным отрицательным сообщением.
Не создаётся легенда о пустом документе и не выполняется установка фильтра; собственный TMP отдельно убран.
Ожидаемый результат
На настоящем собственном непустом файле показана разница между содержимым и поддержкой его расширения.
На что обратить внимание
Расширение .tmp не становится TXT из-за текстового содержимого. Платформа определяет тип по расширению, а не по намерению автора файла.
Не переносите Windows IFilter в Linux, веб-клиент или мобильную платформу. Установленная справка отдельно перечисляет доступность и старые Windows-версии; наличие подходящего фильтра на своей машине нужно проверить.
Пустая строка от ПолучитьТекст не доказывает, что исходный документ пуст. Для нашего непустого образца это неподтверждённое извлечение.
IFilter может менять разделители и представление текста. Поэтому проверяем два осмысленных маркера, не обещаем побайтовое равенство строке исходного файла.
Исходный TXT — UTF-16 с BOM, результат Записать — UTF-8. Нельзя читать оба одним произвольным значением кодировки.
Нет общего безопасного «удалить всё временное»: список очистки формируется только после успешного СоздатьНовый, а удаление получает точный собственный путь.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.