Разработка и Конфигурация · 12 мин
Как создать TXT файл в 1С: инструкция с примерами кода
Как создать TXT файл в 1С: ТекстовыйДокумент, ЗаписьТекста, потоки. Рабочие примеры кода, кодировки, диалог выбора файла, типичные ошибки.
Создание текстового файла — одна из базовых задач при разработке в 1С: выгрузка данных для банка-клиента, обмен с внешними системами, формирование логов, экспорт справочников в простом формате. Встроенный язык платформы предоставляет несколько инструментов для этого, и выбор конкретного зависит от того, где выполняется код (клиент или сервер), какой объём данных нужно записать и в какой кодировке должен быть файл.
Основных подхода три: объект ТекстовыйДокумент, объект ЗаписьТекста и работа через потоки (Поток, ЗаписьДанных). Первые два покрывают подавляющее большинство задач, третий нужен при потоковой обработке больших объёмов. Ниже разобраны все варианты с готовым кодом, который можно вставить в свою обработку или процедуру.
Важный нюанс: в тонком и веб-клиенте прямой доступ к файловой системе пользователя ограничен. Файл либо формируется на сервере, либо сохраняется через диалог выбора файла с использованием расширения работы с файлами. Это поведение платформы, а не ошибка в коде.
Способ 1: создание файла через объект ТекстовыйДокумент
Объект ТекстовыйДокумент — самый наглядный инструмент. Вы формируете содержимое в памяти, добавляя строки, а затем одной командой записываете всё на диск. Подходит для файлов небольшого и среднего размера: выгрузки списков, печатных форм в текстовом виде, простых файлов обмена.
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Номенклатура;Цена;Количество");
Запрос = Новый Запрос("ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Текст.ДобавитьСтроку(Выборка.Наименование);
КонецЦикла;
Текст.Записать("C:\Обмен\выгрузка.txt", КодировкаТекста.UTF8);
Метод Записать() принимает путь к файлу и необязательный параметр кодировки. Если кодировку не указать, используется значение по умолчанию платформы, что часто приводит к «крякозябрам» при открытии файла в других программах. Явно указывайте кодировку всегда.
Проверка результата простая: откройте созданный файл в Блокноте или Notepad++ и убедитесь, что строки читаются, а кириллица отображается корректно. Если вместо русских букв видны знаки вопроса или нечитаемые символы — проблема в кодировке, об этом ниже.
Способ 2: построчная запись через объект ЗаписьТекста
Объект ЗаписьТекста пишет данные в файл по мере выполнения кода, не накапливая всё содержимое в памяти. Это правильный выбор для больших выгрузок — сотен тысяч и миллионов строк, где ТекстовыйДокумент может занять слишком много оперативной памяти.
Запись = Новый ЗаписьТекста("C:\Обмен\выгрузка.txt", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Номенклатура;Цена");
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не Выборка.ПометкаУдаления Тогда
Запись.ЗаписатьСтроку(Выборка.Наименование);
КонецЕсли;
КонецЦикла;
Запись.Закрыть();
Критически важный момент: метод Закрыть() обязателен. Пока файл не закрыт, данные могут оставаться в буфере, а сам файл — заблокированным для других программ. Забытый Закрыть() — одна из самых частых причин «пустых» или обрезанных файлов.
Для надёжности оборачивайте запись в конструкцию Попытка...Исключение и закрывайте файл в обработчике ошибки, чтобы при сбое не оставался заблокированный файл:
Запись = Новый ЗаписьТекста("C:\Обмен\выгрузка.txt");
Попытка
Запись.ЗаписатьСтроку("Данные");
Запись.Закрыть();
Исключение
Запись.Закрыть();
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
- 1Создайте объект: Новый ЗаписьТекста(путь, кодировка)
- 2Записывайте данные методом ЗаписатьСтроку() в цикле
- 3Вызовите Закрыть() после окончания записи
- 4Откройте файл и проверьте содержимое и кодировку
Выбор кодировки и управление переносами строк
Кодировка определяет, как символы будут сохранены в байтах. Неверный выбор — главная причина нечитаемых файлов при передаче их в банки, сторонние программы и на другие платформы. В 1С кодировка задаётся системным перечислением КодировкаТекста.
| Кодировка | Когда использовать |
|---|---|
| UTF8 | Современные системы, веб-сервисы, Linux. Стандартный выбор по умолчанию |
| ANSI | Старые Windows-программы, часть банк-клиентов, ожидающих windows-1251 |
| OEM | Устаревшие DOS-приложения, редкие случаи совместимости |
| UTF16 | Системы, явно требующие Unicode с BOM |
Если принимающая система документированно требует конкретную кодировку — используйте именно её. Если требований нет, выбирайте UTF8: его корректно читают практически все современные редакторы и языки программирования.
Отдельно стоит вопрос символов конца строки. По умолчанию платформа использует разделитель, принятый в операционной системе (CRLF для Windows). Если файл уходит на Linux-сервер, где ожидается LF, укажите разделитель явно:
Запись = Новый ЗаписьТекста("C:\Обмен\выгрузка.txt",
КодировкаТекста.UTF8, Символы.ПС);
Создание файла на клиенте и на сервере: в чём разница
Код записи файла выполняется там, где находится в контексте конфигурации. Если процедура помечена директивой &НаСервере, файл создастся на сервере 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 файл?
Да. У объекта ЗаписьТекста конструктор поддерживает параметр дозаписи: Новый ЗаписьТекста(Путь, Кодировка, , Истина) — четвёртый параметр Истина означает, что данные будут добавлены в конец существующего файла, а не перезапишут его. У ТекстовыйДокумент такой возможности нет: он всегда перезаписывает файл целиком.
Как создать файл в веб-клиенте, где нет прямого доступа к диску?
В веб-клиенте файл формируется на сервере, помещается во временное хранилище как ДвоичныеДанные, а затем пользователю предлагается сохранить его через ПолучитьФайл() или навигационную ссылку на хранилище. Прямая запись по локальному пути в веб-клиенте невозможна — это ограничение безопасности браузерной модели.
Что делать, если файл создаётся, но пустой?
Наиболее вероятная причина — не вызван метод Закрыть() у объекта ЗаписьТекста: данные остались в буфере и не сброшены на диск. Вторая возможная причина — цикл добавления строк ни разу не выполнился (пустая выборка). Добавьте отладочный вывод счётчика записанных строк, чтобы отличить одну ситуацию от другой.
Как записать в файл строку без переноса в конце?
У объекта ЗаписьТекста есть метод Записать() (без «Строки») — он выводит текст без добавления разделителя строк. Это полезно, когда формат файла требует нестандартной структуры или разделители нужно расставлять вручную. Комбинируйте Записать() и ЗаписатьСтроку() для точного контроля над содержимым.
Что важно запомнить
Для большинства задач достаточно ТекстовыйДокумент с методом Записать(), для больших выгрузок — ЗаписьТекста с обязательным Закрыть(). Всегда указывайте кодировку явно, проверяйте существование каталога и помните: в клиент-серверном режиме файл, записанный на сервере, нужно отдельно передавать пользователю через временное хранилище.