В модуле создаётся настоящий собственный непустой TXT с BOM. Проверяется имя выбранного файла и наличие английского маркера и кириллической строки после IFilter.
Где и как запускать
Полный серверный общий модуль своей пустой учебной конфигурации на 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==");
ИмяИсходного = СоздатьСвойФайл(Состояние, Данные, ".txt");
Извлекатель = Новый ИзвлечениеТекста(ИмяИсходного);
Сообщить(Извлекатель.ИмяФайла = ИмяИсходного);
Текст = Извлекатель.ПолучитьТекст();
ПроверитьИзвлечённыйТекст(Текст, "syntax-guide-owned-extraction-one", "Книга: 3 штуки.");
Сообщить(Текст);
Исключение
Сообщить("Основной опыт не подтверждён. Проверьте собственную Windows-платформу, IFilter, расширение и кодировку; пустой результат не является успехом.");
КонецПопытки;
Извлекатель = Неопределено;
УбратьТолькоСвоиФайлы(Состояние);
КонецПроцедуры
Процедура ПроверитьУчебнуюПлатформу()
Система = Новый СистемнаяИнформация;
Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86
И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
ВызватьИсключение "Этот пример использует Windows CryptoAPI";
КонецЕсли;
КонецПроцедуры
Функция СоздатьСвойФайл(Состояние, Данные, Расширение)
Если Расширение <> ".txt" И Расширение <> ".tmp" И Расширение <> ".utf8.txt" Тогда
ВызватьИсключение "Разрешены только собственные учебные расширения";
КонецЕсли;
Имя = КаталогВременныхФайлов() + "УчебноеИзвлечение_" + Строка(Новый УникальныйИдентификатор) + Расширение;
Поток = Неопределено;
Попытка
Поток = Новый ФайловыйПоток(Имя, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
Состояние.СвоиФайлы.Добавить(Имя);
Данные.Записать(Поток);
Поток.Закрыть();
Поток = Неопределено;
Исключение
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Возврат Имя;
КонецФункции
Процедура ПроверитьИзвлечённыйТекст(Текст, Маркер, Содержимое)
Если ТипЗнч(Текст) <> Тип("Строка") Тогда
ВызватьИсключение "Ожидался текст";
КонецЕсли;
Если Текст = "" Тогда
ВызватьИсключение "Непустой образец не извлечён: пустая строка не является успехом";
КонецЕсли;
Если СтрНайти(Текст, Маркер) = 0 Или СтрНайти(Текст, Содержимое) = 0 Тогда
ВызватьИсключение "В извлечении не найдены оба собственных учебных маркера";
КонецЕсли;
Сообщить("Оба собственных маркера найдены: " + Маркер);
КонецПроцедуры
Процедура УбратьТолькоСвоиФайлы(Состояние)
Для Каждого Имя Из Состояние.СвоиФайлы Цикл
Если СтрНайти(Имя, КаталогВременныхФайлов() + "УчебноеИзвлечение_") <> 1 Тогда
ВызватьИсключение "Путь не относится к собственным файлам этого учебного опыта";
КонецЕсли;
Попытка
Проверка = Новый Файл(Имя);
Если Проверка.Существует() Тогда
УдалитьФайлы(Имя);
КонецЕсли;
Проверка = Новый Файл(Имя);
Если Проверка.Существует() Тогда
Сообщить("ОЧИСТКА НЕ ПОДТВЕРЖДЕНА: собственный файл остался: " + Имя);
Иначе
Сообщить("Собственный файл больше не существует");
КонецЕсли;
Исключение
Сообщить("ОЧИСТКА НЕ ПОДТВЕРЖДЕНА: проверьте только собственный файл: " + Имя);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Разбор по шагам
Проверить собственную конфигурацию, Windows перед созданием файла.
Создать только собственные UTF-16LE-байты с BOM; открыть уникальный файл строго через СоздатьНовый.
Закрыть поток до чтения IFilter; список очистки уже содержит только созданный этим запуском путь.
Передать реальное имя только что созданного TXT конструктору ИзвлечениеТекста, не C:/log.txt из чужой машины.
Проверить ИмяФайла у собственного экземпляра перед чтением.
Получить строку; пустой результат для непустого исходника не считать успехом.
Проверить оба маркера, вывести реальный текст и освободить ссылку до точечной очистки.
Как проверить результат
Имя файла совпало: Истина. При доступном TXT IFilter найдено два маркера и виден учебный текст.
Переводы строк могут отличаться от исходных; точное равенство всей строке не требуется.
При отсутствии фильтра/ошибке основной опыт не подтверждён; очистка всё равно проверена отдельно.
Ожидаемый результат
Получен проверяемый текст из реально созданного своего UTF-16 TXT без чтения чужих документов.
На что обратить внимание
Расширение .tmp не становится TXT из-за текстового содержимого. Платформа определяет тип по расширению, а не по намерению автора файла.
Не переносите Windows IFilter в Linux, веб-клиент или мобильную платформу. Установленная справка отдельно перечисляет доступность и старые Windows-версии; наличие подходящего фильтра на своей машине нужно проверить.
Пустая строка от ПолучитьТекст не доказывает, что исходный документ пуст. Для нашего непустого образца это неподтверждённое извлечение.
IFilter может менять разделители и представление текста. Поэтому проверяем два осмысленных маркера, не обещаем побайтовое равенство строке исходного файла.
Исходный TXT — UTF-16 с BOM, результат Записать — UTF-8. Нельзя читать оба одним произвольным значением кодировки.
Нет общего безопасного «удалить всё временное»: список очистки формируется только после успешного СоздатьНовый, а удаление получает точный собственный путь.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.