ТекстовыйДокумент.По умолчанию

Конструкторы

Синтаксис и применение ТекстовыйДокумент.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.

Синтаксис

Новый ТекстовыйДокумент
Полное описание, параметры и ограничения

ТекстовыйДокумент.По умолчанию

ТекстовыйДокумент (TextDocument)

По умолчанию

Синтаксис:
Новый ТекстовыйДокумент
Методическая информация

Практические примеры

Сформировать архив как ДвоичныеДанные и прочитать его из потока

Упаковываем свой временный текст в двоичные данные, открываем поток архива и проверяем список файлов без распаковки.

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Современные объекты доступны с 8.3.26; пример предназначен для вашей платформы 8.5.1.1343.

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

  3. Для ПолучитьДвоичныеДанные создавайте запись без параметров и не вызывайте перед этим Открыть.


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

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

  1. Сохраняем исходный текст в один собственный временный файл.

  2. Неинициализированная запись собирает пакет; ПолучитьДвоичныеДанные возвращает готовый архив и завершает запись.

  3. Открываем новый поток чтения двоичных данных и передаём его конструктору чтения архива.

  4. После проверки количества закрываем чтение и поток; повторяем проверку через Новый без параметров и Открыть. Удаляем источник.

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

  1. Размер пакета больше нуля; в коллекции ровно один элемент с расширением txt.

  2. Оба открытия возвращают количество 1. Исходный временный файл удалён.

  3. Не вызывайте ПолучитьДвоичныеДанные после конструктора записи по имени файла: это другой способ работы, запрещённый описанием данного метода.

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

Готовый архив хранится в ДвоичныеДанные; файловый архив не создаётся.

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

  1. Современные объекты доступны с 8.3.26; пример предназначен для вашей платформы 8.5.1.1343.

  2. Не закрывайте поток раньше объекта чтения архива. После завершения не используйте закрытые объекты.

  3. Для больших пакетов память ограничена; потоковый или файловый вариант выбирается исходя из объёма данных.

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

Создать ZIP, проверить его состав и извлечь свой файл

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

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Современные объекты доступны с 8.3.26; пример предназначен для вашей платформы 8.5.1.1343.

  2. Запускайте только в учебной базе на Windows. Папка создаётся во временном каталоге с новым UUID; реальные архивы не используются.

  3. В архив добавляется ровно sample.txt. Метод Добавить по умолчанию не сохраняет путь источника.

  4. Не подменяйте учебный архив файлом из Интернета: для недоверенного архива нужна отдельная проверка путей и лимитов распаковки.


Корень = КаталогВременныхФайлов() + "1c-guide-" + Строка(Новый УникальныйИдентификатор) + "\";
КаталогРезультата = Корень + "out\";
ИсходныйФайл = Корень + "sample.txt";
ИмяАрхива = Корень + "sample.zip";
ИзвлеченныйФайл = КаталогРезультата + "sample.txt";
ЗаписьАрхива = Неопределено;
ЧтениеАрхива = Неопределено;
СоздатьКаталог(КаталогРезультата);
Попытка
    Документ = Новый ТекстовыйДокумент;
    Документ.УстановитьТекст("Книга: 3");
    Документ.Записать(ИсходныйФайл, КодировкаТекста.UTF8);
    ЗаписьАрхива = Новый ЗаписьФайлаАрхива(ИмяАрхива);
    ЗаписьАрхива.Добавить(ИсходныйФайл);
    ЗаписьАрхива.Записать();
    ЗаписьАрхива = Неопределено;
    ЧтениеАрхива = Новый ЧтениеФайлаАрхива(ИмяАрхива);
    Сообщить(ЧтениеАрхива.Комментарий);
    Элементы = ЧтениеАрхива.Элементы;
    Если Элементы.Количество() <> 1 Тогда
        ВызватьИсключение "В учебном архиве ожидался один файл";
    КонецЕсли;
    Элемент = Элементы[0];
    Сообщить("Имя: " + Элемент.Имя);
    Сообщить("Без расширения: " + Элемент.ИмяБезРасширения);
    Сообщить("Расширение: " + Элемент.Расширение);
    Сообщить("Путь в архиве: " + Элемент.Путь);
    Сообщить("Полное имя: " + Элемент.ПолноеИмя);
    Сообщить("Исходное имя: " + Элемент.ИсходноеИмя);
    Сообщить("Исходное имя без расширения: " + Элемент.ИсходноеИмяБезРасширения);
    Сообщить("Исходное расширение: " + Элемент.ИсходноеРасширение);
    Сообщить("Исходный путь: " + Элемент.ИсходныйПуть);
    Сообщить("Исходное полное имя: " + Элемент.ИсходноеПолноеИмя);
    Сообщить(СтрШаблон("До сжатия: %1; в архиве: %2", Элемент.РазмерНесжатого, Элемент.РазмерСжатого));
    Сообщить(Формат(Элемент.ВремяИзменения, "ДФ=yyyy-MM-dd HH:mm:ss"));
    Сообщить(СтрШаблон("Шифрование: %1; скрытый: %2; только чтение: %3", Элемент.Зашифрован, Элемент.Невидимый, Элемент.ТолькоЧтение));
    Если Элемент.Имя <> "sample.txt" Или Элемент.Зашифрован Тогда
        ВызватьИсключение "Неожиданный учебный элемент";
    КонецЕсли;
    ЧтениеАрхива.Извлечь(Элемент, КаталогРезультата);
    ЧтениеАрхива.Закрыть();
    ЧтениеАрхива = Неопределено;
    Проверка = Новый ТекстовыйДокумент;
    Проверка.Прочитать(ИзвлеченныйФайл, КодировкаТекста.UTF8);
    Если Проверка.ПолучитьТекст() <> "Книга: 3" Тогда
        ВызватьИсключение "Извлечённый текст отличается от исходного";
    КонецЕсли;
    Сообщить("Содержимое проверено");
Исключение
    ТекстОшибки = ОписаниеОшибки();
    Если ЧтениеАрхива <> Неопределено Тогда
        ЧтениеАрхива.Закрыть();
    КонецЕсли;
    Если ЗаписьАрхива <> Неопределено Тогда
        Попытка
            ЗаписьАрхива.Записать();
        Исключение
            Сообщить("Не удалось завершить учебный архив; проверьте папку: " + Корень);
        КонецПопытки;
    КонецЕсли;
    ВызватьИсключение ТекстОшибки;
КонецПопытки;
УдалитьФайлы(ИзвлеченныйФайл);
УдалитьФайлы(ИмяАрхива);
УдалитьФайлы(ИсходныйФайл);
Если НайтиФайлы(КаталогРезультата, "*", Истина).Количество() = 0 Тогда
    УдалитьФайлы(КаталогРезультата);
КонецЕсли;
Если НайтиФайлы(Корень, "*", Истина).Количество() = 0 Тогда
    УдалитьФайлы(Корень);
КонецЕсли;

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

  1. Создаём папку с уникальным именем и сохраняем собственный sample.txt с известным содержимым.

  2. Конструктор записи открывает новый архив; Добавить формирует состав, Записать завершает и закрывает архив.

  3. Чтение возвращает коллекцию: после проверки количества берём индекс 0 и составляем инвентаризацию свойств элемента.

  4. Извлекаем только проверенный sample.txt в отдельную подпапку, читаем UTF-8 и сравниваем с исходником.

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

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

  1. Один элемент: sample.txt, имя без расширения sample, расширение txt; Зашифрован — Ложь.

  2. После извлечения сообщение Содержимое проверено; содержимое ровно Книга: 3.

  3. РазмерСжатого не обязан быть меньше РазмерНесжатого у такого короткого текста; это не ошибка.

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

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

Собственный ZIP прошёл проверку состава и содержимого; рабочие файлы не затрагивались.

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

  1. Современные объекты доступны с 8.3.26; пример предназначен для вашей платформы 8.5.1.1343.

  2. Исходные имена — имена, записанные в архиве, а не обязательно абсолютный путь исходного файла на диске.

  3. Не извлекайте недоверенные архивы в рабочий каталог: ограничения по суммарному размеру, количеству элементов и путям нужны до распаковки.

  4. Запись архива может полностью заменить существующий файл. Здесь путь уникален. Простой повторный ВызватьИсключение сохраняет текст ошибки, но не первоначальный стек.

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

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

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

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

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