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

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

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

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

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

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

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

Какие объекты 1С используются для создания файлов

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

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

Для нетекстовых данных используются другие механизмы: ДвоичныеДанные с методом Записать(), ЗаписьXML и ЗаписьJSON для структурированных форматов, метод Записать() табличного документа — для сохранения печатных форм в Excel, PDF, HTML и других поддерживаемых типах файлов.

Создание текстового файла через ТекстовыйДокумент

Типовой сценарий выглядит так: создаётся объект, в него добавляются строки, затем вызывается запись. Путь к файлу указывается абсолютный, например C:\Temp\выгрузка.txt или /tmp/export.txt на Linux-сервере. Каталог должен существовать — платформа не создаёт промежуточные папки автоматически.

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

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

Текст.ДобавитьСтроку("Кабель ВВГ 3х2.5;150");

Попытка

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

Исключение

Сообщить("Ошибка записи файла: " + ОписаниеОшибки());

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

Второй параметр метода Записать() задаёт кодировку. Для обмена с внешними системами чаще всего нужен UTF-8, но банковские форматы и устаревшие программы могут требовать ANSI (Windows-1251). Неверная кодировка — самая частая причина «кракозябр» при открытии файла в сторонней программе.

Если файл с указанным именем уже существует, он будет перезаписан без предупреждения. Если нужно сохранять историю выгрузок, формируйте уникальные имена, например с датой и временем в формате выгрузка_20260314_153000.csv.

1c
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Строка данных");
Текст.Записать("C:\\Temp\\file.txt", КодировкаТекста.UTF8);

Потоковая запись больших файлов через ЗаписьТекста

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

Запись = Новый ЗаписьТекста("C:\Temp\большой_файл.txt", КодировкаТекста.UTF8);

Для Каждого СтрокаДанных Из Выборка Цикл

Запись.ЗаписатьСтроку(СтрокаДанных.Представление);

КонецЦикла;

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

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

Конструктор ЗаписьТекста позволяет указать и режим добавления: если передать соответствующий параметр, новые данные допишутся в конец существующего файла. Это удобно для журналов, куда события дописываются по мере возникновения.

Порядок действий
  1. 1
    Определите, где выполняется код — на клиенте или на сервере
  2. 2
    Выберите объект: ТекстовыйДокумент для небольших файлов, ЗаписьТекста для больших
  3. 3
    Убедитесь, что каталог назначения существует и доступен на запись
  4. 4
    Сформируйте содержимое и вызовите метод записи с явной кодировкой
  5. 5
    Проверьте результат: файл создан, размер ненулевой, содержимое читается

Где выполняется код: клиент или сервер

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

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

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

Права доступа, пути и блокировки

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

Сетевые пути вида \\server\share\ рабочи, но требуют, чтобы у службы сервера был доступ к сетевому ресурсу — локальные системные учётные записи часто такого доступа не имеют. Надёжнее запускать службу под доменной учётной записью либо настроить явное подключение к ресурсу.

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

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

Сохранение табличных документов и двоичных файлов

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

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

Для структурированного обмена предпочтительны специализированные объекты ЗаписьXML и ЗаписьJSON: они сами контролируют корректность синтаксиса и экранирование, чего нельзя добиться ручной сборкой текста. Ручная сборка XML через строки — частый источник невалидных файлов, которые отклоняет принимающая система.

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

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

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

Файл появился в целевом каталоге с ожидаемым именем

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

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

Содержимое
Норма

Файл открывается, кириллица читается, строки на месте

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

«Кракозябры» — несовпадение кодировки записи и программы просмотра

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

Количество строк совпадает с количеством обработанных записей

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

Файл обрывается — запись прервана ошибкой или файл не был закрыт

Типичные ошибки и их устранение

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

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

Третья группа — содержательная: неверная кодировка, смешение разделителей строк, ручная сборка XML/CSV без экранирования спецсимволов. Перед отправкой файла во внешнюю систему откройте его в редакторе, который показывает кодировку, и сверьте с требованиями принимающей стороны.

Типичные ошибки
01
Запись в несуществующий каталог — метод Записать вызывает исключение; создавайте папку заранее через СоздатьКаталог()
02
Отсутствие Закрыть() у ЗаписьТекста — файл остаётся заблокированным и может содержать не все данные
03
Игнорирование стороны выполнения кода — файл создаётся на сервере, а ищут его на клиенте
04
Ручная сборка CSV без экранирования — поля с разделителями и кавычками ломают структуру файла
05
Перезапись файла без проверки — предыдущая выгрузка теряется безвозвратно
Итог

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

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

Частые вопросы

Как создать файл, если каталог назначения не существует?

Платформа не создаёт промежуточные папки автоматически. Перед записью проверьте каталог объектом Файл и методом Существует(), а при отсутствии создайте его методом СоздатьКаталог(). Учтите, что для создания вложенной структуры папок тоже потребуются права у учётной записи, от имени которой выполняется код.

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

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

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

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

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

Да. Конструктор объекта ЗаписьТекста поддерживает режим добавления: при соответствующих параметрах новые строки дописываются в конец файла. Это стандартный подход для журналов событий. У объекта ТекстовыйДокумент такого режима нет — он всегда перезаписывает файл целиком.

Запись вызывает ошибку «отказано в доступе», хотя папка есть. Что проверить?

Проверьте, от имени какой учётной записи выполняется код: на сервере это учётная запись службы сервера 1С, а не текущий пользователь. Убедитесь, что у неё есть право записи в каталог, что файл не открыт другой программой и не заблокирован антивирусом, а для сетевого пути — что учётная запись имеет доступ к ресурсу.

Чем отличается запись табличного документа от записи текстового файла?

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