Разработка и Конфигурация · 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С — пользователь его на своём компьютере не увидит.
Типовая схема обмена между сервером и клиентом выглядит так:
- На сервере сформировать текст и записать его во временный файл или поместить содержимое во временное хранилище.
- Передать на клиент адрес временного хранилища или двоичные данные файла.
- На клиенте получить данные и сохранить в файл методом
ПолучитьФайл()либо через диалог сохранения.
Для записи непосредственно на клиенте в тонком клиенте доступен объект ТекстовыйДокумент с методом Записать(), но в веб-клиенте прямой доступ к файловой системе ограничен — потребуется диалог выбора файла или расширение работы с файлами. Учитывайте это при проектировании обработок, которые должны работать во всех режимах.
Проверка результата и обработка ошибок
После записи полезно убедиться, что файл действительно создан и содержит ожидаемые данные. Для проверки существования файла используется объект Файл:
ФайлНаДиске = Новый Файл("C:\Exchange\price.csv");
Если ФайлНаДиске.Существует() Тогда
Сообщить("Файл создан, размер: " + ФайлНаДиске.Размер() + " байт");
Иначе
Сообщить("Файл не создан!");
КонецЕсли;
Операцию записи стоит оборачивать в конструкцию Попытка...Исключение с выводом ОписаниеОшибки(). Типичные причины сбоев: нет прав на каталог, путь не существует, диск переполнен, файл открыт и заблокирован другой программой (например, Excel). Создать вложенный каталог автоматически можно методом СоздатьКаталог() — платформа создаст всю цепочку папок.
Как проверить результат
Файл есть в каталоге, размер больше нуля и растёт при добавлении данных
Файл отсутствует или имеет нулевой размер — запись не выполнилась
Кириллица читается корректно в принимающей программе
Кракозябры или знаки вопроса — кодировка записи не совпадает с ожидаемой
Файл открывается сторонней программой сразу после обработки
Ошибка доступа — объект ЗаписьТекста не был закрыт
Типичные ошибки при создании текстовых файлов
Даже простой код записи файла содержит несколько ловушек, которые регулярно встречаются в прикладных решениях. Ниже — ошибки, которые стоит проверить в первую очередь.
Отдельно отметим смешение разделителей строк. Клиентские приложения на Windows традиционно используют CRLF, а Linux-системы — LF. Если принимающая система строга к формату (например, парсер банковской выписки), уточните требуемый разделитель и, при необходимости, формируйте строки с явным указанием символов Символы.ВК + Символы.ПС.
При отладке выгрузок удобно временно выводить сформированный текст в поле текстового документа на форме перед записью в файл: так видно итоговое содержимое, разделители и переносы строк без открытия файла во внешнем редакторе.
Частые вопросы
Как создать текстовый файл в 1С без диалога выбора, полностью автоматически?
Укажите полный путь к файлу прямо в коде и вызовите ТекстовыйДокумент.Записать(Путь) — диалог не появится. В клиент-серверном режиме помните, что серверный код пишет на диск сервера, а для сохранения на компьютере пользователя файл нужно передать через временное хранилище.
Как дописать строки в уже существующий файл, не удаляя его содержимое?
Используйте конструктор Новый ЗаписьТекста(ИмяФайла, Кодировка, , Истина) — четвёртый параметр «Добавить» открывает файл на дозапись. Альтернатива — прочитать файл объектом ТекстовыйДокумент, добавить строки и записать обратно, но для больших файлов это медленнее.
Почему при открытии файла в Excel русские буквы отображаются неправильно?
Excel по умолчанию открывает CSV в системной кодировке ANSI. Если файл записан в UTF-8 без BOM, кириллица искажается. Решения: записывать файл в кодировке ANSI, либо в UTF-8 с BOM, либо импортировать данные в Excel через мастер импорта текста с явным указанием кодировки.
Можно ли создать текстовый файл в веб-клиенте 1С?
Прямая запись в произвольный путь в веб-клиенте недоступна из-за ограничений браузера. Рабочий вариант: сформировать файл на сервере, поместить во временное хранилище и предложить пользователю сохранить его через стандартный диалог скачивания с помощью ПолучитьФайл().
Как записать файл в формате JSON или XML?
Для JSON используйте объект ЗаписьJSON, для XML — ЗаписьXML: они формируют корректную структуру документа автоматически. Результат можно получить строкой методом Закрыть() и затем сохранить в файл через ЗаписьТекста, либо писать напрямую в файл, указав имя файла в конструкторе.
Что важно запомнить
Для небольших файлов используйте ТекстовыйДокумент с методом Записать(), для больших — потоковый ЗаписьТекста с обязательным Закрыть(). Всегда указывайте кодировку явно, учитывайте разницу между записью на клиенте и на сервере и проверяйте результат через объект Файл.