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

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

Как сохранить текстовый файл из 1С

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

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

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

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

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

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

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

Для Каждого СтрокаТовара Из Товары Цикл

Текст.ДобавитьСтроку(СтрокаТовара.Наименование + ";" + Формат(СтрокаТовара.Цена, "ЧГ="));

КонецЦикла;

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

Метод Записать() принимает путь к файлу и необязательные параметры: кодировку, тип разделителя строк, признак записи символа BOM. Если файл с таким именем уже существует, он будет перезаписан без предупреждения — учитывайте это при выгрузках, чтобы не потерять предыдущие результаты.

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

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

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

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

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

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

КонецЦикла;

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

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

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

Выбор кодировки: UTF-8, ANSI и BOM

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

КодировкаКогда использоватьОграничения
UTF8Обмен с современными системами, веб-сервисы, LinuxСтарые программы могут не распознать без BOM
ANSIСовместимость со старым ПО WindowsТолько одна языковая раскладка, нет Unicode
UTF16Редкие случаи, когда это требует принимающая системаФайл вдвое больше, не все программы читают

Если принимающая программа (например, Excel при открытии CSV) показывает вопросительные знаки вместо русских букв, попробуйте записать файл в UTF-8 с BOM — для этого у метода Записать() есть соответствующий параметр, а у ЗаписьТекста кодировка с BOM задаётся через КодировкаТекста.UTF8 с параметром записи BOM в конструкторе или методе записи.

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

Сохранение с выбором файла пользователем

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

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

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

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

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

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

КонецЕсли;

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

1c
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Показать(Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект));

Клиент и сервер: где выполняется сохранение

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

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

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

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

Как выбрать способ

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

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

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

После записи полезно проверить, что файл действительно создан и его размер больше нуля. Для этого используйте объект Файл: Файл = Новый Файл(ИмяФайла); Если Файл.Существует() Тогда .... Дополнительно можно открыть файл и сверить количество строк или контрольную сумму, если данные критичны.

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

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

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

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

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

Файла нет — проверьте права и где выполнялся код

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

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

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

Кракозябры — укажите кодировку явно или добавьте BOM

Полнота данных
Норма

Количество строк совпадает с количеством выгружаемых записей

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

Файл обрезан — возможно, не вызван Закрыть() или ошибка в цикле

Часто задаваемые вопросы

Как сохранить файл в кодировке UTF-8 без BOM?

Передайте в метод Записать() кодировку КодировкаТекста.UTF8 и параметр записи BOM установите в Ложь. У объекта ЗаписьТекста поведение BOM задаётся параметрами конструктора. Без BOM файл корректно обрабатывается большинством Linux-утилит и веб-сервисов.

Почему файл сохраняется, но пользователь его не видит?

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

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

У объекта ЗаписьТекста конструктор поддерживает параметр «Дописать» — установите его в Истина, и новые строки будут добавляться в конец файла. ТекстовыйДокумент такого режима не имеет: он всегда перезаписывает файл целиком.

Как сохранить табличный документ в текстовый файл?

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

Файл занят другой программой — что делать?

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

Можно ли сохранить файл на сетевой диск?

Да, укажите UNC-путь вида \\Сервер\ОбщаяПапка\файл.txt. Учтите, что при серверном выполнении обращение идёт под учётной записью службы сервера 1С — у неё должны быть права на сетевой ресурс, иначе запись завершится ошибкой доступа.

Итог

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

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