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

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

Как программно создать текстовый файл в 1С: способы, код и нюансы

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

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

Выбор инструмента зависит от контекста: где выполняется код, нужна ли конкретная кодировка (UTF-8, ANSI, UTF-16), требуется ли дозапись в существующий файл и работает ли конфигурация в веб-клиенте. Ошибка в выборе приводит к файлам с «кракозябрами», невозможности записи на сервер или блокировке файла другой программой.

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

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

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

Минимальный пример создания файла:

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

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

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

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

Текст.Записать("C:\Exchange\price.csv", КодировкаТекста.UTF8);

Метод Записать() принимает имя файла и необязательный параметр кодировки. Если кодировку не указать, используется системная кодировка по умолчанию (в русскоязычной Windows — ANSI/Windows-1251), что часто становится причиной проблем при передаче файла в веб-сервисы, ожидающие UTF-8.

Помимо ДобавитьСтроку(), есть метод ВставитьСтроку() для вставки в произвольную позицию и УстановитьТекст(), который заменяет всё содержимое одной строкой с разделителями. Для формирования CSV удобно собирать строку через конкатенацию с разделителем и добавлять её целиком.

Способ 2: ЗаписьТекста — потоковая запись больших файлов

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

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

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

Запись.ЗаписатьСтроку(Выборка.Артикул + ";" + Выборка.Наименование);

КонецЦикла;

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

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

Метод Записать() (без «Строку») пишет текст без перевода строки, а ЗаписатьСтроку() добавляет разделитель строк автоматически. Для дозаписи в существующий файл в конструкторе ЗаписьТекста предусмотрен параметр «Добавить» — файл не перезаписывается, а дополняется.

Сравнение способов записи

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

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

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

Подходит для больших выгрузок: пишет потоково, экономит память, поддерживает дозапись, но требует обязательного закрытия.

Поток / ПотокВПамяти

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

Кодировка файла: почему текст превращается в «кракозябры»

Наиболее частая проблема при обмене текстовыми файлами — несовпадение кодировки записи и кодировки, в которой файл открывает принимающая сторона. 1С поддерживает значения перечисления КодировкаТекста: UTF8, UTF16, ANSI, OEM и другие, а также вариант с указанием системной кодировки.

Практические рекомендации по выбору:

  • UTF-8 — стандарт для обмена с сайтами, банк-клиентами нового поколения и API. Указывайте КодировкаТекста.UTF8 явно.
  • ANSI (Windows-1251) — требуют некоторые старые банковские форматы и программы, работающие только с однобайтовой кириллицей.
  • UTF-16 — встречается в выгрузках для специфических систем; файл занимает вдвое больше места.

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

Запись файла на сервере и в клиент-серверном режиме

В файловом режиме работы код выполняется на компьютере пользователя, и путь вида C:\Exchange\file.txt указывает на локальный диск. В клиент-серверном режиме код, выполняемый в серверной процедуре (директива &НаСервере), пишет файл на диск сервера 1С — пользователь его на своём компьютере не увидит.

Типовая схема обмена между сервером и клиентом выглядит так:

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

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

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

После записи полезно убедиться, что файл действительно создан и содержит ожидаемые данные. Для проверки существования файла используется объект Файл:

ФайлНаДиске = Новый Файл("C:\Exchange\price.csv");

Если ФайлНаДиске.Существует() Тогда

Сообщить("Файл создан, размер: " + ФайлНаДиске.Размер() + " байт");

Иначе

Сообщить("Файл не создан!");

КонецЕсли;

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

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

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

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

Файл есть в каталоге, размер больше нуля и растёт при добавлении данных

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

Файл отсутствует или имеет нулевой размер — запись не выполнилась

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

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

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

Кракозябры или знаки вопроса — кодировка записи не совпадает с ожидаемой

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

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

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

Ошибка доступа — объект ЗаписьТекста не был закрыт

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

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

Типичные ошибки
01
Запись без указания кодировки: файл создаётся в системной кодировке, и при передаче в веб-сервис или на Linux кириллица превращается в мусор.
02
Отсутствие Закрыть() у ЗаписьТекста: файл остаётся заблокированным до завершения сеанса, обмен с внешними системами останавливается.
03
Запись на сервер вместо клиента: пользователь ищет файл у себя, а он лежит на диске сервера 1С.
04
Фиксированное имя файла в многопользовательском режиме: параллельные запуски обработки перезаписывают данные друг друга.
05
Запись в несуществующий каталог без СоздатьКаталог(): код падает с ошибкой, хотя каталог можно было создать одной строкой.

Отдельно отметим смешение разделителей строк. Клиентские приложения на Windows традиционно используют CRLF, а Linux-системы — LF. Если принимающая система строга к формату (например, парсер банковской выписки), уточните требуемый разделитель и, при необходимости, формируйте строки с явным указанием символов Символы.ВК + Символы.ПС.

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

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

Как создать текстовый файл в 1С без диалога выбора, полностью автоматически?

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

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

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

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

Excel по умолчанию открывает CSV в системной кодировке ANSI. Если файл записан в UTF-8 без BOM, кириллица искажается. Решения: записывать файл в кодировке ANSI, либо в UTF-8 с BOM, либо импортировать данные в Excel через мастер импорта текста с явным указанием кодировки.

Можно ли создать текстовый файл в веб-клиенте 1С?

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

Как записать файл в формате JSON или XML?

Для JSON используйте объект ЗаписьJSON, для XML — ЗаписьXML: они формируют корректную структуру документа автоматически. Результат можно получить строкой методом Закрыть() и затем сохранить в файл через ЗаписьТекста, либо писать напрямую в файл, указав имя файла в конструкторе.

Итог

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

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