Разработка и Конфигурация · 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 в конструкторе или методе записи.
Сохранение с выбором файла пользователем
Если пользователь должен сам решить, куда сохранить файл, используйте ДиалогВыбораФайла в режиме сохранения. Важный нюанс: в тонком и веб-клиенте работа с файловой системой асинхронна, поэтому код строится через описания оповещений.
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Фильтр = "Текстовые файлы (.txt)|.txt";
Диалог.ПолноеИмяФайла = "выгрузка.txt";
Если Диалог.Выбрать() Тогда
Текст.Записать(Диалог.ПолноеИмяФайла, КодировкаТекста.UTF8);
КонецЕсли;
Пример выше работает в толстом клиенте. В тонком клиенте метод Выбрать() недоступен — вместо него используется Показать() с передачей описания оповещения, а запись выполняется уже в обработчике. Если конфигурация работает в режиме управляемого приложения, сразу проектируйте код асинхронно.
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Показать(Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект));Клиент и сервер: где выполняется сохранение
В клиент-серверном режиме код с директивой &НаСервере выполняется на сервере 1С, и файл сохранится в файловую систему сервера, а не компьютера пользователя. Это классическая ошибка: выгрузка «успешно» отрабатывает, но файл пользователь найти не может.
Стандартный приём — сформировать файл на сервере, поместить его во временное хранилище (ПоместитьВоВременноеХранилище), а на клиенте получить данные через ПолучитьИзВременногоХранилища или передать как ДвоичныеДанные и записать уже локально. Для текстовых файлов удобно сериализовать содержимое через ПотокВПамяти.
Для файловых баз разницы между клиентом и сервером нет, и простой код с прямой записью работает. Но если конфигурация может быть переведена в клиент-серверный режим, лучше сразу писать переносимый вариант.
Как выбрать способ
Проверка результата и обработка ошибок
Запись файла может завершиться ошибкой: нет прав на папку, диск переполнен, путь не существует, файл занят другой программой. Оборачивайте запись в Попытка...Исключение и выводите пользователю понятное сообщение с описанием ошибки через ОписаниеОшибки().
После записи полезно проверить, что файл действительно создан и его размер больше нуля. Для этого используйте объект Файл: Файл = Новый Файл(ИмяФайла); Если Файл.Существует() Тогда .... Дополнительно можно открыть файл и сверить количество строк или контрольную сумму, если данные критичны.
Как проверить результат
Файл существует, размер больше нуля
Файла нет — проверьте права и где выполнялся код
Кириллица читается в редакторе и принимающей программе
Кракозябры — укажите кодировку явно или добавьте BOM
Количество строк совпадает с количеством выгружаемых записей
Файл обрезан — возможно, не вызван Закрыть() или ошибка в цикле
Часто задаваемые вопросы
Как сохранить файл в кодировке UTF-8 без BOM?
Передайте в метод Записать() кодировку КодировкаТекста.UTF8 и параметр записи BOM установите в Ложь. У объекта ЗаписьТекста поведение BOM задаётся параметрами конструктора. Без BOM файл корректно обрабатывается большинством Linux-утилит и веб-сервисов.
Почему файл сохраняется, но пользователь его не видит?
Скорее всего, код выполняется на сервере (директива &НаСервере), и файл записывается в файловую систему сервера. Перенесите запись на клиент или передайте содержимое через временное хранилище.
Как дописать данные в существующий файл, а не перезаписать?
У объекта ЗаписьТекста конструктор поддерживает параметр «Дописать» — установите его в Истина, и новые строки будут добавляться в конец файла. ТекстовыйДокумент такого режима не имеет: он всегда перезаписывает файл целиком.
Как сохранить табличный документ в текстовый файл?
У ТабличныйДокумент есть метод Записать() с типом файла ТипФайлаТабличногоДокумента.TXT. Учтите, что при этом сохраняется текстовое представление ячеек без форматирования, а ширина колонок влияет на обрезку значений — проверьте результат на длинных строках.
Файл занят другой программой — что делать?
Закройте файл в программе, которая его держит (часто это Excel с открытым CSV). В коде оберните запись в Попытка...Исключение и при ошибке предложите пользователю выбрать другое имя файла или повторить попытку.
Можно ли сохранить файл на сетевой диск?
Да, укажите UNC-путь вида \\Сервер\ОбщаяПапка\файл.txt. Учтите, что при серверном выполнении обращение идёт под учётной записью службы сервера 1С — у неё должны быть права на сетевой ресурс, иначе запись завершится ошибкой доступа.
Что важно запомнить
Для простых выгрузок используйте ТекстовыйДокумент с методом Записать(), для больших файлов — ЗаписьТекста с обязательным Закрыть(). Всегда указывайте кодировку явно, обрабатывайте ошибки через Попытка...Исключение и помните: код на сервере пишет файлы на сервер, а не на компьютер пользователя.