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

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

Как записать текстовый документ в 1С

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

Запись текстового файла — одна из базовых задач при разработке на платформе 1С: так выгружают данные для обмена с банками, формируют CSV-отчёты, пишут логи обменов и готовят файлы для сторонних систем. Встроенный язык предлагает два основных инструмента: объект ТекстовыйДокумент с методом Записать() и низкоуровневый объект ЗаписьТекста. Выбор зависит от объёма данных, требований к кодировке и того, нужно ли дописывать файл порциями.

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

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

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

Объект ТекстовыйДокумент создаётся конструктором Новый ТекстовыйДокумент. Текст наполняется построчно методом ДобавитьСтроку() — каждая строка автоматически завершается символом перевода строки при записи. Если текст уже сформирован как единая строка, используйте УстановитьТекст(). Метод ПолучитьТекст() позволяет проверить содержимое до записи.

Запись выполняется методом Записать(ИмяФайла, Кодировка, РазделительСтрок). Минимальный вызов — только с именем файла, тогда применяется кодировка по умолчанию (зависит от настроек системы, обычно ANSI). Для обмена с внешними системами кодировку лучше указывать явно.

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

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

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

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

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

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

Порядок записи через ТекстовыйДокумент
  1. 1
    Создайте объект: Новый ТекстовыйДокумент
  2. 2
    Добавьте строки методом ДобавитьСтроку() или задайте текст целиком через УстановитьТекст()
  3. 3
    Проверьте существование каталога назначения, при отсутствии создайте его
  4. 4
    Вызовите Записать() с явным указанием кодировки
  5. 5
    Откройте файл и убедитесь, что текст читается и переносы строк корректны

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

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

Запись = Новый ЗаписьТекста("C:\Обмен\лог.txt", КодировкаТекста.UTF8);

Пока Выборка.Следующий() Цикл

Запись.ЗаписатьСтроку(Строка(Выборка.Дата) + ";" + Выборка.Комментарий);

КонецЦикла;

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

Метод ЗаписатьСтроку() добавляет перевод строки после текста, метод Записать() пишет данные как есть, без разделителя. Смешивая их, можно управлять форматом строк вручную — например, собирать CSV с собственным разделителем.

Критически важно вызывать Закрыть() в любой ветке выполнения. Если код прервётся по исключению до закрытия, файл останется заблокированным, а незаписанные буферы могут быть потеряны. Надёжный шаблон — оборачивать запись в Попытка ... Исключение ... КонецПопытки и закрывать файл в обработчике.

Кодировка и переносы строк

Параметр кодировки принимает значения системного перечисления КодировкаТекста: UTF8, UTF8БезBOM, ANSI, UTF16, OEM и другие. Неверный выбор — самая частая причина «крякозябр» при открытии файла в сторонней программе. Для обмена с веб-сервисами и современными системами стандарт — UTF-8; банковские форматы иногда требуют OEM (DOS) или ANSI.

Третий параметр метода Записать() — разделитель строк. По умолчанию используется значение Символы.ПС (перевод строки LF) либо системный разделитель. Windows-программы ожидают пару CR+LF, которую задаёт Символы.ВК + Символы.ПС. Если получатель файла жалуется, что весь текст слипся в одну строку, проблема почти наверняка в разделителе.

Выбор кодировки

UTF-8

Универсальный вариант для обмена с веб-сервисами, Linux-системами и современными программами

ANSI (Windows-1251)

Подходит для старых Windows-приложений и Excel при открытии CSV двойным щелчком

OEM (DOS)

Требуется некоторыми банковскими форматами и устаревшими загрузчиками

UTF-8 без BOM

Нужен, когда принимающая система не понимает сигнатуру BOM в начале файла

Работа на сервере и на клиенте

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

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

Типичные ошибки при записи

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

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

Типичные ошибки
01
Запись без указания кодировки — файл открывается с неправильными символами в сторонней программе
02
Отсутствие вызова Закрыть() у ЗаписьТекста — файл остаётся заблокированным и пустым
03
Запись на сервере с ожиданием файла на компьютере пользователя — файл создаётся не там, где ищут
04
Перезапись существующего файла без проверки — теряются ранее сохранённые данные
05
Использование УстановитьТекст() в цикле вместо ДобавитьСтроку() — сохраняется только последняя порция

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

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

Визуальная проверка: откройте файл в редакторе, который показывает кодировку (например, Notepad++), и убедитесь, что кириллица читается, а переносы строк соответствуют ожиданиям принимающей системы. Если файл предназначен для загрузки в другую программу, финальный тест — реальная загрузка тестового файла.

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

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

Существование файла
Норма

Файл.Существует() возвращает Истина, размер больше нуля

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

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

Кодировка
Норма

Кириллица читается в принимающей программе

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

Вместо русских букв отображаются нечитаемые символы

Переносы строк
Норма

Каждая запись на отдельной строке

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

Весь текст слипся в одну строку или лишние пустые строки

Доступность файла
Норма

Файл открывается другой программой сразу после записи

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

Ошибка доступа — поток не был закрыт вызовом Закрыть()

FAQ

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

Используйте объект ЗаписьТекста с третьим параметром конструктора: Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8, , Истина) — параметр дозаписи открывает файл на добавление. Альтернатива — прочитать файл через ТекстовыйДокумент.Прочитать(), добавить строки и записать заново.

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

Кодировка записи не совпадает с кодировкой, в которой файл открывает принимающая программа. Укажите кодировку явно при записи (чаще всего КодировкаТекста.UTF8) и проверьте, какую кодировку ожидает загрузчик. Для Excel при открытии CSV иногда нужна ANSI с BOM.

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

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

Чем ТекстовыйДокумент отличается от ЗаписьТекста?

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

Что делать, если при записи возникает ошибка «Файл занят другим процессом»?

Файл открыт другой программой или не был закрыт предыдущим вызовом ЗаписьТекста. Убедитесь, что все потоки закрываются методом Закрыть(), в том числе в обработчике исключений, и что внешние программы (Excel, редакторы) не держат файл открытым.

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

Формируйте каждую строку конкатенацией полей через «;» и добавляйте её методом ДобавитьСтроку() или ЗаписатьСтроку(). Специального CSV-формата в платформе нет — это обычный текстовый файл, структуру которого вы контролируете сами, включая экранирование разделителей внутри значений.

Итог

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

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