К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как записать текст в файл в 1С

Как записать текст в файл в 1С: ТекстовыйДокумент, ЗаписьТекста, потоки. Примеры кода, кодировки, ошибки и проверка результата.

Запись текста в файл — одна из базовых задач при разработке на платформе 1С:Предприятие. Она встречается при выгрузке данных для обмена с банками и контрагентами, формировании логов, выгрузке отчётов в CSV или TXT, передаче данных в сторонние системы. Платформа предлагает несколько способов решения задачи, и выбор зависит от объёма данных, требований к кодировке и места выполнения кода — на клиенте или на сервере.

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

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

Запись через ТекстовыйДокумент — базовый способ

Объект ТекстовыйДокумент хранит текст в памяти построчно. Типовой сценарий: создать объект, добавить строки, вызвать метод Записать() с полным путём к файлу. Если файл с таким именем существует, он будет перезаписан без предупреждения — это важно учитывать, чтобы не потерять данные.

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

Текст.ДобавитьСтроку("Первая строка");

Текст.ДобавитьСтроку("Вторая строка");

Текст.Записать("C:\Temp\выгрузка.txt", КодировкаТекста.UTF8);

Второй параметр метода Записать() задаёт кодировку. Если его не указать, используется кодировка по умолчанию (обычно ANSI), что часто приводит к «кракозябрам» при открытии файла в других программах. Явно указывайте КодировкаТекста.UTF8 — это самый совместимый вариант для обмена.

Для выгрузки табличных данных удобно формировать строки в цикле с разделителем:

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

Для Каждого СтрокаТовара Из Товары Цикл

Строка = СтрокаТовара.Артикул + ";" + СтрокаТовара.Наименование + ";" + Формат(СтрокаТовара.Цена, "ЧГ=");

Текст.ДобавитьСтроку(Строка);

КонецЦикла;

Текст.Записать(ИмяФайла, КодировкаТекста.UTF8);

Потоковая запись через ЗаписьТекста

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

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

Запись.ЗаписатьСтроку("Начало выгрузки: " + ТекущаяДатаСеанса());

Для Каждого Элемент Из Данные Цикл

Запись.ЗаписатьСтроку(Строка(Элемент));

КонецЦикла;

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

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

Метод Записать() (без «Строки») выводит текст без перевода строки, что удобно при посимвольной сборке содержимого. Разделитель строк можно задать явно через свойство РазделительСтрок, если приёмник требует, например, только LF вместо CRLF.

Запись файла на сервере и передача на клиент

В управляемых формах код часто выполняется на сервере, где нет доступа к диску пользователя. Типовая схема: сформировать файл на сервере во временном каталоге, поместить его во временное хранилище, а на клиенте сохранить через диалог выбора файла.

&НаСервере

Функция СформироватьНаСервере()

ИмяФайла = ПолучитьИмяВременногоФайла("txt");

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

Текст.ДобавитьСтроку("Данные выгрузки");

Текст.Записать(ИмяФайла, КодировкаТекста.UTF8);

Двоичные = Новый ДвоичныеДанные(ИмяФайла);

Адрес = ПоместитьВоВременноеХранилище(Двоичные, УникальныйИдентификатор);

УдалитьФайлы(ИмяФайла);

Возврат Адрес;

КонецФункции

&НаКлиенте

Процедура Сохранить(Команда)

Адрес = СформироватьНаСервере();

ПолучитьФайл(Адрес, "выгрузка.txt", Истина);

КонецПроцедуры

Обратите внимание на очистку: временный файл на сервере следует удалять после помещения в хранилище, иначе каталог временных файлов сервера будет разрастаться. Метод ПолучитьФайл() с третьим параметром Истина показывает пользователю стандартный диалог сохранения.

Типичные ошибки
01
Запись файла серверным кодом по пути C:\ — файл окажется на диске сервера, а не у пользователя
02
Не указана кодировка UTF-8 — внешняя система получает нечитаемые символы
03
Не вызван метод Закрыть() у ЗаписьТекста — файл заблокирован или записан не полностью
04
Не удалён временный файл на сервере — каталог temp переполняется

Кодировки и символы конца строки

Большинство проблем при обмене текстовыми файлами связано с кодировкой. Системное перечисление КодировкаТекста поддерживает UTF8, UTF16, ANSI, OEM и другие варианты, а также позволяет указать кодировку строкой, например «windows-1251» или «koi8-r». Выбор определяется требованиями принимающей стороны: банковские форматы нередко требуют windows-1251, современные API — UTF-8.

Отдельный нюанс — BOM (метка порядка байтов). Некоторые системы не принимают UTF-8 с BOM, другие без него не распознают кодировку. В объекте ЗаписьТекста наличием BOM можно управлять через параметр конструктора ЗаписатьBOM. Если принимающая система отвергает файл без видимой причины, проверьте этот параметр в первую очередь.

Разделитель строк — ещё один источник несовместимости. Windows традиционно использует CRLF, Linux-системы — LF. Свойство РазделительСтрок у ЗаписьТекста позволяет задать нужный вариант явно, независимо от операционной системы сервера 1С.

Сравнение вариантов

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

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

ЗаписьТекста

Потоковая запись больших объёмов, дописывание в файл, управление BOM и разделителем строк. Требует обязательного Закрыть()

ЗаписьДанных / потоки

Максимальный контроль над байтами, подходит для бинарных и смешанных форматов. Код сложнее, для обычного текста избыточен

Проверка результата и обработка ошибок

После записи полезно убедиться, что файл существует и не пуст. Для этого используется объект Файл: метод Существует() и свойство Размер(). Если файл не создан, чаще всего причина в отсутствии каталога или прав на запись.

Файл = Новый Файл(ИмяФайла);

Если Файл.Существует() И Файл.Размер() > 0 Тогда

Сообщить("Файл записан: " + Файл.ПолноеИмя);

Иначе

ВызватьИсключение "Файл не создан или пуст";

КонецЕсли;

Операции с файловой системой стоит оборачивать в конструкцию Попытка...Исключение с записью подробностей в журнал регистрации: ЗаписьЖурналаРегистрации() с текстом ОписаниеОшибки(). Это особенно важно для регламентных заданий, где ошибку иначе никто не увидит.

Контрольные точки

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

Файл существует по указанному пути
Норма

Файл на месте, размер больше нуля

Тревожный признак

Файла нет — проверьте путь, права и контекст выполнения (клиент/сервер)

Кодировка содержимого
Норма

Кириллица читается при открытии в целевой программе

Тревожный признак

Кракозябры — неверная кодировка или лишний/отсутствующий BOM

Полнота данных
Норма

Все строки выгружены, последняя строка присутствует

Тревожный признак

Файл обрывается — вероятно, не вызван Закрыть() или запись прервана ошибкой

Ограничения, права и безопасность

В файловом режиме и на клиенте запись возможна только в каталоги, доступные текущему пользователю ОС. На сервере 1С код выполняется под учётной записью службы агента сервера (обычно USR1CV8), и у неё должны быть права на целевой каталог — это частая причина «молчаливых» сбоев выгрузки по сетевому пути.

В веб-клиенте прямая запись в произвольный путь невозможна: работа с файлами идёт только через диалоги выбора и механизм НачатьПомещениеФайла / ПолучитьФайл. В безопасном режиме (например, при выполнении внешних обработок) доступ к файловой системе может быть запрещён политиками безопасности.

Итог

Что важно запомнить

Для простой записи используйте ТекстовыйДокумент с методом Записать(), для больших объёмов и дописывания — ЗаписьТекста с обязательным Закрыть(). Всегда указывайте кодировку явно, учитывайте разделение клиент/сервер и проверяйте результат через объект Файл.

Частые вопросы

Как дописать текст в конец существующего файла?

Используйте объект ЗаписьТекста и передайте в конструктор третьим параметром значение Истина (параметр «Дописать»). Новые строки будут добавлены после существующего содержимого. ТекстовыйДокумент такой возможности не имеет — он всегда перезаписывает файл целиком.

Почему в файле вместо русских букв непонятные символы?

Файл записан в одной кодировке, а открывается в другой. Укажите кодировку явно при записи, например КодировкаТекста.UTF8, и убедитесь, что принимающая программа её поддерживает. Если файл открывается в Excel или старой системе, может потребоваться windows-1251 или наличие BOM.

Как записать файл на компьютер пользователя из серверного кода?

Напрямую нельзя — сервер не имеет доступа к диску клиента. Сформируйте файл на сервере, поместите двоичные данные во временное хранилище, верните адрес на клиент и сохраните методом ПолучитьФайл() с диалогом выбора места сохранения.

Файл создаётся пустым или не создаётся вовсе — в чём причина?

Проверьте три вещи: существует ли каталог по указанному пути, есть ли права на запись у учётной записи, под которой выполняется код (на сервере это учётная запись службы агента), и вызывается ли метод Закрыть() при работе через ЗаписьТекста. Оберните код в Попытка...Исключение и выведите ОписаниеОшибки() — текст ошибки обычно сразу указывает причину.

Можно ли записать файл в формате CSV с разделителями?

Да, CSV — это обычный текст. Формируйте строки конкатенацией полей через точку с запятой или запятую и записывайте любым из описанных способов. Учтите, что значения, содержащие разделитель или переводы строк, нужно заключать в кавычки, а для Excel часто требуется кодировка windows-1251 или UTF-8 с BOM.

Чем отличается запись в тонком клиенте от веб-клиента?

В тонком клиенте доступны прямые операции с файловой системой через ТекстовыйДокумент и ЗаписьТекста в клиентском контексте. В веб-клиенте работа с файлами возможна только через асинхронные методы с диалогами выбора файла — прямой записи по произвольному пути нет из соображений безопасности браузера.