Работа с текстовыми файлами — одна из базовых задач, с которой сталкивается почти каждый разработчик 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-файлов объемом в сотни тысяч строк.
Клиент-серверное взаимодействие и Временное хранилище
В веб-клиенте или тонком клиенте серверный код не имеет прямого доступа к локальным дискам пользователя, а клиентский код не должен выполнять «тяжелую» сборку данных. Стандартный паттерн работы выглядит так:
- Файл формируется на сервере во временную папку.
- Файл помещается во временное хранилище в виде двоичных данных.
- Временный файл на сервере удаляется.
- На клиенте файл асинхронно скачивается на диск пользователя.
// Код модуля управляемой формы &НаСервереБезКонтекста Функция СформироватьФайлНаСервере() // Создаем временное имя файла на сервере ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt"); Запись = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); Запись.ЗаписатьСтроку("Результаты отчета или выгрузки"); Запись.Закрыть(); // Помещаем файл в хранилище ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла); АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные); // Чистим за собой временный файл на сервере Попытка УдалитьФайлы(ИмяВременногоФайла); Исключение // Логирование ошибки удаления, если файл заблокирован КонецПопытки; Возврат АдресХранилища; КонецФункции &НаКлиенте Асинх Процедура СформироватьИПолучитьФайл(Команда) // 1. Генерируем данные на сервере и получаем адрес АдресХранилища = СформироватьФайлНаСервере(); // 2. Настраиваем диалог сохранения для пользователя ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов("Сохранить отчет", "Текстовые файлы (*.txt)|*.txt"); Попытка // 3. Асинхронно скачиваем файл на компьютер пользователя Ждать ПолучитьФайлССервераАсинх(АдресХранилища, "Выгрузка.txt", ПараметрыДиалога); Исключение ПоказатьПредупреждение(, "Не удалось сохранить файл: " + ОписаниеОшибки()); КонецПопытки; КонецПроцедуры
Определение и указание кодировки
Одна из самых частых ошибок при работе с файлами — некорректно определенная кодировка, из-за чего вместо текста получается набор нечитаемых символов ("кракозябры"). Платформа поддерживает следующие основные варианты через перечисление КодировкаТекста:
- UTF8
- UTF16
- ANSI
- OEM
- Система (кодировка операционной системы)
Практический пример: выгрузка данных в CSV
Часто текстовые файлы используются для выгрузки табличных данных. Рассмотрим пример формирования CSV-файла из результата запроса:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Наименование, Цена ИЗ Справочник.Номенклатура"; Выборка = Запрос.Выполнить().Выбрать(); Запись = Новый ЗаписьТекста("C:\Temp\Номенклатура.csv", КодировкаТекста.UTF8); Запись.ЗаписатьСтроку("Наименование;Цена"); Пока Выборка.Следующий() Цикл СтрокаCSV = Выборка.Наименование + ";" + Формат(Выборка.Цена, "ЧЦ=15; ЧДЦ=2"); Запись.ЗаписатьСтроку(СтрокаCSV); КонецЦикла; Запись.Закрыть();
Типичные ошибки при работе с текстовыми файлами
- Незакрытый поток — если не вызвать метод Закрыть() у ЗаписьТекста или ЧтениеТекста, файл может остаться заблокированным или данные не запишутся полностью.
- Неправильная кодировка — приводит к искажению кириллицы и спецсимволов.
- Работа с файлами напрямую на клиенте в управляемом приложении — в тонком клиенте и вебклиенте прямого доступа к файловой системе нет, необходимо использовать серверные вызовы, временное хранилище и системные диалоги выбора файла.
- Отсутствие обработки исключений — при работе с файлами стоит оборачивать код в конструкцию Попытка...Исключение, поскольку файл может быть занят другим процессом, отсутствовать по указанному пути или иметь ограничения доступа.
Попытка Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8); Запись.ЗаписатьСтроку(ТекстСтроки); Запись.Закрыть(); Исключение Сообщить("Ошибка при записи файла: " + ОписаниеОшибки()); КонецПопытки;
Заключение
Платформа 1С:Предприятие 8.3 предоставляет гибкий набор инструментов для работы с текстовыми файлами: от простого объекта ТекстовыйДокумент для небольших задач до потоковых ЧтениеТекста и ЗаписьТекста для эффективной работы с большими объемами данных. Правильный выбор объекта, корректное указание кодировки и аккуратное закрытие потоков — три ключевых момента, которые позволят избежать большинства проблем при интеграции 1С с внешними системами через текстовые файлы.
Чувствуете, что застряли в основах 1С?
Информация в интернете кажется обрывочной, а на решение простых задач уходят часы? Вы не одиноки. Я запустил Клуб для 1С разработчиков Alexcode.PRO. Внутри - продвинутые статьи, видео, материалы для скачивания, закрытый чат для резидентов и возможность влиять на контент.
