Top.Mail.Ru

Создание, запись и чтение текстовых файлов в 1С 8.3

Работа с текстовыми файлами — одна из базовых задач, с которой сталкивается почти каждый разработчик 1С. Это может понадобиться для обмена данными с внешними системами, логирования, выгрузки отчётов или импорта информации из сторонних источников. В платформе 1С:Предприятие 8.3 для этих целей предусмотрены удобные и надёжные объекты.
В этой статье разберем ключевые объекты платформы «1С:Предприятие 8.3» для работы с файлами, рассмотрим примеры редактирования строк в памяти, разберем асинхронные вызовы и покажем, как правильно организовать клиент-серверное взаимодействие.

1. Выбор инструмента: ТекстовыйДокумент vs ЧтениеТекста/ЗаписьТекста

Для работы с текстовыми файлами чаще всего используют:

  • ТекстовыйДокумент — простой и наглядный объект для небольших файлов.
  • ЗаписьТекста и ЧтениеТекста — более гибкие классы, позволяющие работать с большими объёмами данных и точно управлять кодировкой.

Оба подхода поддерживают кодировки UTF-8, Windows-1251 и другие.

Выбор объекта зависит от объема данных: для файлов в несколько мегабайт и больше рекомендуется использовать потоковые объекты ЧтениеТекста и ЗаписьТекста, так как они не загружают весь файл в память целиком, а работают построчно.

Создание и запись текстового файла

Способ 1: через объект ТекстовыйДокумент

Это самый простой способ для небольших объемов данных.

Синхронная запись Метод Записать() подходит для серверных процедур, где нет ограничений на синхронные вызовы.

Документ = Новый ТекстовыйДокумент;
Документ.ДобавитьСтроку("Первая строка файла");
Документ.ДобавитьСтроку("Вторая строка файла");
Документ.ДобавитьСтроку("Третья строка файла");

Документ.Записать("C:\Temp\МойФайл.txt", КодировкаТекста.UTF8);

Метод ДобавитьСтроку добавляет строку в конец документа, а Записать сохраняет содержимое на диск с указанием кодировки.

Асинхронная запись (на стороне клиента, платформа 8.3.18+)

В современном управляемом приложении вызовы синхронных методов работы с файловой системой на клиенте запрещены или не рекомендуются. Чтобы интерфейс пользователя не зависал во время записи на диск, применяется метод ЗаписатьАсинх() совместно с оператором Ждать.

&НаКлиенте
Асинх Процедура ЗаписатьФайлНаКлиентеАсинх(ПутьКФайлу)
    Документ = Новый ТекстовыйДокумент;
    Документ.ДобавитьСтроку("Данные, сформированные на клиенте");
    
    Попытка
        // Ждать приостанавливает выполнение метода до завершения операции записи
        Ждать Документ.ЗаписатьАсинх(ПутьКФайлу, КодировкаТекста.UTF8);
    Исключение
        ПоказатьПредупреждение(, "Не удалось сохранить файл: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Управление строками в памяти через ТекстовыйДокумент

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

Документ = Новый ТекстовыйДокумент;

// 1. Установка всего текста сразу (предыдущее содержимое очищается)
Документ.УстановитьТекст("Первая строка файла" + Символы.ПС + "Третья строка файла");

// 2. Получение общего количества строк в документе
Количество = Документ.КоличествоСтрок(); // Результат: 2

// 3. Получение строки по её индексу (нумерация строк в 1С начинается с 1)
ВтораяСтрока = Документ.ПолучитьСтроку(2); // Результат: "Третья строка файла"

// 4. Вставка строки в конкретную позицию
// Последующие строки автоматически сдвигаются вниз
Документ.ВставитьСтроку(2, "Вторая строка файла (вставленная)");

// 5. Замена содержимого существующей строки
Документ.ЗаменитьСтроку(3, "Новое содержимое третьей строки");

// 6. Удаление строки по её индексу
Документ.УдалитьСтроку(1); // Удалит строку "Первая строка файла"

Способ 2: через объект ЗаписьТекста

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

Запись = Новый ЗаписьТекста("C:\Temp\БольшойФайл.txt", КодировкаТекста.UTF8);

Для Каждого Строка Из МассивДанных Цикл
    Запись.ЗаписатьСтроку(Строка);
КонецЦикла;

Запись.Закрыть();

Рекомендации:

  • Всегда указывайте кодировку явно — это избавит от проблем при обмене файлами между разными системами.
  • Используйте ЗаписатьСтроку() вместо конкатенации большого количества строк в цикле — так экономится память.
  • Важно не забывать закрывать поток методом Закрыть() — иначе часть данных может не записаться на диск, а файл останется заблокированным операционной системой.

Чтение текстового файла

Чтение целиком через ТекстовыйДокумент

Синхронное чтение (на сервере)

&НаСервере
Процедура ПрочитатьФайлНаСервере(ПутьКФайлу)
    Документ = Новый ТекстовыйДокумент;
    Документ.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);
    
    Для Индекс = 1 По Документ.КоличествоСтрок() Цикл
        Строка = Документ.ПолучитьСтроку(Индекс);
        // Обработка строки...
    КонецЦикла;
КонецПроцедуры

Асинхронное чтение (на клиенте, платформа 8.3.18+)

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

&НаКлиенте
Асинх Процедура ПрочитатьФайлНаКлиентеАсинх(ПутьКФайлу)
    Документ = Новый ТекстовыйДокумент;
    
    Попытка
        Ждать Документ.ПрочитатьАсинх(ПутьКФайлу, КодировкаТекста.UTF8);
        
        Для Индекс = 1 По Документ.КоличествоСтрок() Цикл
            Строка = Документ.ПолучитьСтроку(Индекс);
            // Обработка строки...
        КонецЦикла;
    Исключение
        ПоказатьПредупреждение(, "Не удалось прочитать файл: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Построчное чтение через ЧтениеТекста

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

Чтение = Новый ЧтениеТекста("C:\Temp\БольшойФайл.txt", КодировкаТекста.UTF8);

Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
    // обработка строки
    Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;

Чтение.Закрыть();

Такой подход особенно актуален при обработке файлов логов, выгрузок из внешних систем или CSV-файлов объемом в сотни тысяч строк.

Клиент-серверное взаимодействие и Временное хранилище

В веб-клиенте или тонком клиенте серверный код не имеет прямого доступа к локальным дискам пользователя, а клиентский код не должен выполнять «тяжелую» сборку данных. Стандартный паттерн работы выглядит так:

  1. Файл формируется на сервере во временную папку.
  2. Файл помещается во временное хранилище в виде двоичных данных.
  3. Временный файл на сервере удаляется.
  4. На клиенте файл асинхронно скачивается на диск пользователя.
// Код модуля управляемой формы

&НаСервереБезКонтекста
Функция СформироватьФайлНаСервере()
    // Создаем временное имя файла на сервере
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
    
    Запись = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
    Запись.ЗаписатьСтроку("Результаты отчета или выгрузки");
    Запись.Закрыть();
    
    // Помещаем файл в хранилище
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
    
    // Чистим за собой временный файл на сервере
    Попытка
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
        // Логирование ошибки удаления, если файл заблокирован
    КонецПопытки;
    
    Возврат АдресХранилища;
КонецФункции

&НаКлиенте
Асинх Процедура СформироватьИПолучитьФайл(Команда)
    // 1. Генерируем данные на сервере и получаем адрес
    АдресХранилища = СформироватьФайлНаСервере();
    
    // 2. Настраиваем диалог сохранения для пользователя
    ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов("Сохранить отчет", "Текстовые файлы (*.txt)|*.txt");
    
    Попытка
        // 3. Асинхронно скачиваем файл на компьютер пользователя
        Ждать ПолучитьФайлССервераАсинх(АдресХранилища, "Выгрузка.txt", ПараметрыДиалога);
    Исключение
        ПоказатьПредупреждение(, "Не удалось сохранить файл: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Определение и указание кодировки

Одна из самых частых ошибок при работе с файлами — некорректно определенная кодировка, из-за чего вместо текста получается набор нечитаемых символов ("кракозябры"). Платформа поддерживает следующие основные варианты через перечисление КодировкаТекста:

  • UTF8
  • UTF16
  • ANSI
  • OEM
  • Система (кодировка операционной системы)

Практический пример: выгрузка данных в CSV

Часто текстовые файлы используются для выгрузки табличных данных. Рассмотрим пример формирования CSV-файла из результата запроса:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Наименование, Цена ИЗ Справочник.Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();

Запись = Новый ЗаписьТекста("C:\Temp\Номенклатура.csv", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Наименование;Цена");

Пока Выборка.Следующий() Цикл
    СтрокаCSV = Выборка.Наименование + ";" + Формат(Выборка.Цена, "ЧЦ=15; ЧДЦ=2");
    Запись.ЗаписатьСтроку(СтрокаCSV);
КонецЦикла;

Запись.Закрыть();

Типичные ошибки при работе с текстовыми файлами

  1. Незакрытый поток — если не вызвать метод Закрыть() у ЗаписьТекста или ЧтениеТекста, файл может остаться заблокированным или данные не запишутся полностью.
  2. Неправильная кодировка — приводит к искажению кириллицы и спецсимволов.
  3. Работа с файлами напрямую на клиенте в управляемом приложении — в тонком клиенте и вебклиенте прямого доступа к файловой системе нет, необходимо использовать серверные вызовы, временное хранилище и системные диалоги выбора файла.
  4. Отсутствие обработки исключений — при работе с файлами стоит оборачивать код в конструкцию Попытка...Исключение, поскольку файл может быть занят другим процессом, отсутствовать по указанному пути или иметь ограничения доступа.
Попытка
    Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
    Запись.ЗаписатьСтроку(ТекстСтроки);
    Запись.Закрыть();
Исключение
    Сообщить("Ошибка при записи файла: " + ОписаниеОшибки());
КонецПопытки;

Заключение

Платформа 1С:Предприятие 8.3 предоставляет гибкий набор инструментов для работы с текстовыми файлами: от простого объекта ТекстовыйДокумент для небольших задач до потоковых ЧтениеТекста и ЗаписьТекста для эффективной работы с большими объемами данных. Правильный выбор объекта, корректное указание кодировки и аккуратное закрытие потоков — три ключевых момента, которые позволят избежать большинства проблем при интеграции 1С с внешними системами через текстовые файлы.

Чувствуете, что застряли в основах 1С?

Информация в интернете кажется обрывочной, а на решение простых задач уходят часы? Вы не одиноки. Я запустил Клуб для 1С разработчиков Alexcode.PRO. Внутри - продвинутые статьи, видео, материалы для скачивания, закрытый чат для резидентов и возможность влиять на контент.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *