Разработка и Конфигурация · 8 мин
1С: как записать строку в файл
Как записать строку в файл в 1С: объекты ЗаписьТекста и ТекстовыйДокумент, кодировки, добавление в конец файла, разбор ошибок и готовые примеры кода.
Запись строки в файл — одна из базовых операций при разработке на встроенном языке 1С. Она нужна при выгрузке данных в обменные форматы, формировании логов, создании CSV-файлов, выгрузке отчётов во внешние системы и отладке алгоритмов. Платформа предоставляет для этого несколько объектов, и выбор зависит от задачи: объём данных, кодировка, необходимость дописывать в существующий файл.
Основные инструменты — объекты ЗаписьТекста и ТекстовыйДокумент, а также потоковые средства ЗаписьДанных для бинарных сценариев. Ниже разобраны рабочие примеры кода, различия между объектами, работа с кодировками, добавление строк в конец файла и типичные ошибки, из-за которых файл оказывается пустым или повреждённым.
Запись строки через объект ЗаписьТекста
Объект ЗаписьТекста — основной способ последовательной записи текста в файл. Он подходит для больших файлов, так как пишет данные порциями, не загружая весь текст в память. Минимальный пример выглядит так:
Запись = Новый ЗаписьТекста("C:\Temp\output.txt", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Первая строка файла");
Запись.ЗаписатьСтроку("Вторая строка файла");
Запись.Закрыть();
Метод ЗаписатьСтроку() добавляет после текста символ перевода строки. Если перевод не нужен, используйте метод Записать(), который пишет текст как есть. Это важно при формировании файлов со строгой структурой, где лишний перевод строки нарушит формат.
Вызов Закрыть() обязателен: без него данные могут остаться в буфере и не попасть на диск, а сам файл будет заблокирован для других процессов. В надёжном коде запись оборачивают в попытку с гарантированным закрытием в блоке исключения.
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку(ТекстДляЗаписи);
Запись.Закрыть();Запись через ТекстовыйДокумент
Объект ТекстовыйДокумент удобен, когда текст сначала формируется в памяти: строки можно добавлять, заменять, вставлять в произвольную позицию, а затем одной командой сохранить в файл. Это хороший вариант для небольших файлов и шаблонов.
Документ = Новый ТекстовыйДокумент;
Документ.ДобавитьСтроку("Шапка файла");
Документ.ДобавитьСтроку("Строка данных");
Документ.Записать("C:\Temp\output.txt", КодировкаТекста.UTF8);
Дополнительные методы УстановитьТекст() и ПолучитьТекст() позволяют работать с содержимым целиком. Помните об ограничении: весь документ хранится в оперативной памяти, поэтому для выгрузок в десятки и сотни мегабайт лучше использовать ЗаписьТекста.
Сравнение вариантов
Потоковая запись любого объёма, экономия памяти; требует явного закрытия файла
Удобное редактирование текста перед сохранением; весь текст держится в памяти
Для бинарных данных и точного контроля байтов; избыточен для обычного текста
Кодировка файла: как не получить нечитаемый текст
Кодировка указывается вторым параметром конструктора ЗаписьТекста или метода Записать(). Чаще всего используют КодировкаТекста.UTF8 — современный стандарт для обмена. Если файл должен открываться в старых программах Windows, может потребоваться КодировкаТекста.ANSI, а для некоторых внешних систем — UTF16 или OEM.
Если кодировку не указать, применяется значение по умолчанию, которое зависит от настроек системы. Это частая причина «кракозябр» при открытии файла на другом компьютере. Явное указание кодировки делает поведение кода предсказуемым.
Для CSV-файлов, которые будут открываться в Excel, учтите: Excel корректно распознаёт UTF-8 при наличии BOM (метки порядка байтов). В ЗаписьТекста запись BOM можно включить третьим параметром конструктора, передав Истина.
Добавление строк в существующий файл
По умолчанию ЗаписьТекста перезаписывает файл. Чтобы дописать строки в конец, передайте в конструктор параметр Дописывать со значением Истина:
Запись = Новый ЗаписьТекста("C:\Temp\log.txt", КодировкаТекста.UTF8, , Истина);
Запись.ЗаписатьСтроку("Новая запись в журнале");
Запись.Закрыть();
Такой режим полезен для журналирования: каждый запуск обработки добавляет записи, не затирая предыдущие. Перед записью стоит проверить существование файла через ФайлСуществует() или объект Файл, если логика обработки различается для нового и существующего файла.
Запись на сервере и на клиенте: в чём разница
Путь к файлу интерпретируется относительно того узла, где выполняется код. В серверной процедуре путь C:\Temp\... указывает на диск сервера 1С, а не компьютера пользователя. Это типичная ошибка: разработчик ищет файл у себя, а он создан на сервере.
В клиент-серверном режиме сначала сформируйте файл на сервере, затем передайте его клиенту через временное хранилище (ПоместитьВоВременноеХранилище) и сохраните методом ПолучитьФайл() или через диалог сохранения. В файловом режиме тонкого клиента запись возможна напрямую, если у пользователя есть права на каталог.
Как выбрать действие
Обработка ошибок и проверка результата
Запись в файл может завершиться ошибкой: нет прав на каталог, диск переполнен, путь не существует, файл занят другим процессом. Оборачивайте операции в Попытка ... Исключение ... КонецПопытки и фиксируйте текст ошибки через ОписаниеОшибки() или ИнформацияОбОшибке().
Попытка
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку(Текст);
Запись.Закрыть();
Исключение
Сообщить("Ошибка записи файла: " + ОписаниеОшибки());
КонецПопытки;
После записи полезно проверить результат: существует ли файл и ненулевой ли он размер. Для этого используйте объект Файл и его свойства Существует() и Размер(). В каталоге записи у учётной записи, под которой работает сервер 1С, должны быть права на создание и изменение файлов.
Как проверить результат
Файл есть по указанному пути, дата изменения свежая
Файла нет — проверяйте, на каком узле выполнялся код и текст ошибки
Строки читаются, кириллица отображается корректно
Кракозябры — неверная кодировка при записи или открытии
Размер больше нуля и растёт при дописывании
Нулевой размер — запись не выполнилась или файл не закрыт
Частые вопросы
Как записать строку без перевода строки в конце?
Используйте метод Записать() вместо ЗаписатьСтроку(). Он выводит текст как есть, а разделители вы добавляете сами через Символы.ПС или Символы.ВК + Символы.ПС, если перевод всё же нужен в конкретном месте.
Почему файл создаётся пустым?
Чаще всего не вызван метод Закрыть() — данные остались в буфере. Реже причина в том, что запись выполняется на сервере, а проверяют каталог на клиенте, либо исключение проглатывается пустым обработчиком Попытка...Исключение.
Как записать файл в кодировке Windows-1251?
Передайте в конструктор КодировкаТекста.ANSI — в русскоязычной системе это соответствует Windows-1251. Для гарантированной кодировки независимо от региональных настроек лучше использовать UTF-8.
Можно ли записать файл на сетевой диск?
Да, укажите UNC-путь вида \\сервер\ресурс\файл.txt. Учётная запись, под которой работает сервер 1С или клиентское приложение, должна иметь права записи на этот сетевой ресурс.
Как записать в файл содержимое табличного документа?
Табличный документ сохраняется методом Записать() с указанием типа файла, например ТипФайлаТабличногоДокумента.TXT для текстового представления или форматы MXL, XLSX, PDF для других случаев. Объекты ЗаписьТекста для этого не нужны.
Что важно запомнить
Для записи строки в файл используйте ЗаписьТекста с явной кодировкой и обязательным Закрыть(). Для редактируемого текста подойдёт ТекстовыйДокумент. Учитывайте, где выполняется код — на клиенте или сервере, и всегда обрабатывайте исключения при файловых операциях.