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

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

Как создать TXT файл в 1С: инструкция с примерами кода

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

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

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

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

Способ 1: создание файла через объект ТекстовыйДокумент

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

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

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

Запрос = Новый Запрос("ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура");

Выборка = Запрос.Выполнить().Выбрать();

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

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

КонецЦикла;

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

Метод Записать() принимает путь к файлу и необязательный параметр кодировки. Если кодировку не указать, используется значение по умолчанию платформы, что часто приводит к «крякозябрам» при открытии файла в других программах. Явно указывайте кодировку всегда.

Проверка результата простая: откройте созданный файл в Блокноте или Notepad++ и убедитесь, что строки читаются, а кириллица отображается корректно. Если вместо русских букв видны знаки вопроса или нечитаемые символы — проблема в кодировке, об этом ниже.

Способ 2: построчная запись через объект ЗаписьТекста

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

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

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

Выборка = Справочники.Номенклатура.Выбрать();

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

Если Не Выборка.ПометкаУдаления Тогда

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

КонецЕсли;

КонецЦикла;

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

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

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

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

Попытка

Запись.ЗаписатьСтроку("Данные");

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

Исключение

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

ВызватьИсключение ОписаниеОшибки();

КонецПопытки;

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

Выбор кодировки и управление переносами строк

Кодировка определяет, как символы будут сохранены в байтах. Неверный выбор — главная причина нечитаемых файлов при передаче их в банки, сторонние программы и на другие платформы. В 1С кодировка задаётся системным перечислением КодировкаТекста.

КодировкаКогда использовать
UTF8Современные системы, веб-сервисы, Linux. Стандартный выбор по умолчанию
ANSIСтарые Windows-программы, часть банк-клиентов, ожидающих windows-1251
OEMУстаревшие DOS-приложения, редкие случаи совместимости
UTF16Системы, явно требующие Unicode с BOM

Если принимающая система документированно требует конкретную кодировку — используйте именно её. Если требований нет, выбирайте UTF8: его корректно читают практически все современные редакторы и языки программирования.

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

Запись = Новый ЗаписьТекста("C:\Обмен\выгрузка.txt",

КодировкаТекста.UTF8, Символы.ПС);

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

Создание файла на клиенте и на сервере: в чём разница

Код записи файла выполняется там, где находится в контексте конфигурации. Если процедура помечена директивой &НаСервере, файл создастся на сервере 1С, и пользователь его на своём компьютере не увидит. Это частая причина вопросов «почему файл не появился».

Для файлового режима работы (одна база на локальном компьютере) разницы практически нет — клиент и сервер фактически одна машина. В клиент-серверном варианте различие принципиально: сервер обычно не имеет доступа к диску C: пользователя.

Типовая схема для клиент-серверного режима: сформировать файл на сервере, поместить его во временное хранилище, а на клиенте предложить пользователю сохранить через диалог:

&НаСервере

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

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

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

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

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

Двоичные = Новый ДвоичныеДанные(ИмяВременного);

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

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

&НаКлиенте

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

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

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

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

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

Диалог выбора пути и работа с файловой системой

Если пользователь сам должен указать, куда сохранить файл, используйте ДиалогВыбораФайла в режиме сохранения. Это удобно для интерактивных обработок, где жёстко заданный путь не подходит.

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

Диалог.Фильтр = "Текстовые файлы (.txt)|.txt";

Диалог.ИмяФайла = "выгрузка.txt";

Если Диалог.Выбрать() Тогда

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

Текст.ДобавитьСтроку("Содержимое файла");

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

КонецЕсли;

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

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

Маршрут решения

Как выбрать способ создания файла

Нужно быстро выгрузить небольшой объём данных в файловом режимеИспользуйте ТекстовыйДокумент с методом Записать()
Выгружаются сотни тысяч строк или данные формируются в длительном циклеИспользуйте ЗаписьТекста с обязательным Закрыть()
Работа идёт в клиент-серверном режиме, файл нужен пользователюФормируйте на сервере, передавайте через временное хранилище и ПолучитьФайл()
Пользователь должен сам выбрать место сохраненияПрименяйте ДиалогВыбораФайла в режиме Сохранение

Проверка результата и частые проблемы

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

Файл = Новый Файл("C:\Обмен\выгрузка.txt");

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

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

Иначе

Сообщить("Файл не найден — проверьте путь и права доступа");

КонецЕсли;

Три наиболее частые проблемы при создании TXT в 1С. Первая — отсутствие прав на запись в целевой каталог, особенно при работе на сервере под служебной учётной записью. Вторая — файл занят другим процессом (открыт в редакторе с блокировкой или не закрыт предыдущим запуском обработки). Третья — неверная кодировка, из-за которой принимающая система отклоняет файл.

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

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

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

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

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

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

Файла нет или размер 0 байт при непустых данных

Читаемость содержимого
Норма

Кириллица отображается корректно в редакторе

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

Знаки вопроса или нечитаемые символы — неверная кодировка

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

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

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

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

FAQ: частые вопросы о создании TXT в 1С

Как создать TXT файл без указания полного пути?

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

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

Это признак несовпадения кодировки записи и кодировки, в которой файл открывают. Чаще всего файл записан в ANSI, а открывается как UTF-8, или наоборот. Решение: явно укажите КодировкаТекста.UTF8 при записи и убедитесь, что принимающая программа понимает эту кодировку. Если система старая — используйте ANSI (windows-1251).

Можно ли дописывать данные в существующий TXT файл?

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

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

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

Что делать, если файл создаётся, но пустой?

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

Как записать в файл строку без переноса в конце?

У объекта ЗаписьТекста есть метод Записать() (без «Строки») — он выводит текст без добавления разделителя строк. Это полезно, когда формат файла требует нестандартной структуры или разделители нужно расставлять вручную. Комбинируйте Записать() и ЗаписатьСтроку() для точного контроля над содержимым.

Итог

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

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