Разработка и Конфигурация · 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.
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Строка данных");
Текст.Записать("C:\\Temp\\file.txt", КодировкаТекста.UTF8);Потоковая запись больших файлов через ЗаписьТекста
Когда файл содержит десятки тысяч строк — например, полная выгрузка номенклатуры или журнал обмена — хранение всего текста в памяти неэффективно. Объект ЗаписьТекста создаёт или открывает файл сразу и пишет данные порциями методами ЗаписатьСтроку() и Записать().
Запись = Новый ЗаписьТекста("C:\Temp\большой_файл.txt", КодировкаТекста.UTF8);
Для Каждого СтрокаДанных Из Выборка Цикл
Запись.ЗаписатьСтроку(СтрокаДанных.Представление);
КонецЦикла;
Запись.Закрыть();
Обязательно вызывайте Закрыть() после завершения записи. Пока файл открыт, он может быть заблокирован для других процессов, а буферы — не сброшены на диск. Правильный шаблон — обернуть запись в Попытка...Исключение с закрытием в любом случае, чтобы не оставлять дескриптор открытым.
Конструктор ЗаписьТекста позволяет указать и режим добавления: если передать соответствующий параметр, новые данные допишутся в конец существующего файла. Это удобно для журналов, куда события дописываются по мере возникновения.
- 1Определите, где выполняется код — на клиенте или на сервере
- 2Выберите объект: ТекстовыйДокумент для небольших файлов, ЗаписьТекста для больших
- 3Убедитесь, что каталог назначения существует и доступен на запись
- 4Сформируйте содержимое и вызовите метод записи с явной кодировкой
- 5Проверьте результат: файл создан, размер ненулевой, содержимое читается
Где выполняется код: клиент или сервер
В файловом варианте базы разницы практически нет — клиент и «сервер» работают на одном компьютере. В клиент-серверном варианте директива &НаСервере означает, что файл создастся на диске сервера приложений, и пользователь его напрямую не увидит. Это частая причина вопроса «файл записался, но его нет на диске C:».
Типовой приём для передачи файла пользователю: сформировать файл на сервере во временном хранилище, получить его адрес, а на клиенте вызвать ПолучитьФайл() или НачатьПолучениеФайла() с диалогом сохранения. Так пользователь сам выбирает, куда сохранить результат.
На тонком и веб-клиенте прямой записи в произвольный каталог нет — действуют ограничения безопасности. Работа с файловой системой там выполняется через асинхронные методы с расширением работы с файлами, и пользователь должен подтвердить доступ. Проектируя функциональность, сразу закладывайте серверное формирование файла с последующей передачей на клиент.
Права доступа, пути и блокировки
Запись на сервере выполняется от имени учётной записи службы сервера 1С (например, USR1CV8). Если у этой учётной записи нет прав на целевой каталог, метод записи вызовет исключение. Проверить права проще всего, создав тестовый файл в целевой папке от имени той же учётной записи.
Сетевые пути вида \\server\share\ рабочи, но требуют, чтобы у службы сервера был доступ к сетевому ресурсу — локальные системные учётные записи часто такого доступа не имеют. Надёжнее запускать службу под доменной учётной записью либо настроить явное подключение к ресурсу.
Ещё одна типовая проблема — файл занят другим процессом. Если файл выгрузки открыт в Excel или антивирус проверяет его в момент записи, попытка перезаписи завершится ошибкой. В регламентных заданиях такие ситуации стоит обрабатывать повторной попыткой через паузу и записью в лог.
Для регламентных выгрузок удобно писать файл сначала во временное имя (например, с расширением .tmp) и только после успешного завершения переименовывать в итоговое. Тогда внешняя система никогда не подхватит недописанный файл.
Сохранение табличных документов и двоичных файлов
Печатные формы и отчёты сохраняются напрямую: у табличного документа есть метод Записать(ИмяФайла, ТипФайла), где тип задаётся перечислением ТипФайлаТабличногоДокумента — XLSX, PDF, MXL, HTML и другие. Это штатный способ автоматической рассылки отчётов: сформировали табличный документ, записали в файл, приложили к письму.
Двоичные данные — картинки, архивы, файлы из хранилища значений — записываются через объект ДвоичныеДанные и его метод Записать(ИмяФайла). Если файл хранится в базе, сначала извлеките данные из хранилища значения методом Получить(), затем запишите на диск.
Для структурированного обмена предпочтительны специализированные объекты ЗаписьXML и ЗаписьJSON: они сами контролируют корректность синтаксиса и экранирование, чего нельзя добиться ручной сборкой текста. Ручная сборка XML через строки — частый источник невалидных файлов, которые отклоняет принимающая система.
Как проверить результат
Файл появился в целевом каталоге с ожидаемым именем
Файла нет — код выполнялся на другой стороне (клиент/сервер) или путь неверен
Файл открывается, кириллица читается, строки на месте
«Кракозябры» — несовпадение кодировки записи и программы просмотра
Количество строк совпадает с количеством обработанных записей
Файл обрывается — запись прервана ошибкой или файл не был закрыт
Типичные ошибки и их устранение
Первая группа ошибок — логические: код выполняется на сервере, а файл ищут на клиентском компьютере. Диагностируется просто: проверьте, на какой стороне выполняется процедура, и появился ли файл на сервере. Лечится переносом записи или передачей файла через временное хранилище.
Вторая группа — окружение: несуществующий каталог, отсутствие прав, занятый файл, незакрытый поток. Все эти ситуации дают исключения, поэтому запись всегда стоит оборачивать в Попытка...Исключение с информативным сообщением, включающим путь и описание ошибки. Молчаливая обработка исключений — худший вариант: выгрузка «не срабатывает», а причина неизвестна.
Третья группа — содержательная: неверная кодировка, смешение разделителей строк, ручная сборка XML/CSV без экранирования спецсимволов. Перед отправкой файла во внешнюю систему откройте его в редакторе, который показывает кодировку, и сверьте с требованиями принимающей стороны.
Что важно запомнить
Для текстовых файлов используйте ТекстовыйДокумент или потоковый ЗаписьТекста с явной кодировкой, для печатных форм — метод Записать табличного документа. Всегда учитывайте сторону выполнения кода, проверяйте права на каталог, закрывайте потоки и оборачивайте запись в обработку исключений.
Частые вопросы
Как создать файл, если каталог назначения не существует?
Платформа не создаёт промежуточные папки автоматически. Перед записью проверьте каталог объектом Файл и методом Существует(), а при отсутствии создайте его методом СоздатьКаталог(). Учтите, что для создания вложенной структуры папок тоже потребуются права у учётной записи, от имени которой выполняется код.
Почему в файле вместо русских букв нечитаемые символы?
Кодировка записи не совпадает с кодировкой, в которой файл открывает принимающая программа. Передайте в метод Записать() явное значение, например КодировкаТекста.UTF8 или КодировкаТекста.ANSI, и сверьте требования внешней системы. Проверить результат можно в редакторе, отображающем кодировку файла.
Как передать созданный на сервере файл пользователю?
Сохраните файл на сервере во временный файл, поместите его во временное хранилище методом ПоместитьВоВременноеХранилище(), верните адрес на клиент и там вызовите ПолучитьФайл() с диалогом выбора места сохранения. Так пользователь сам укажет каталог на своём компьютере.
Можно ли дописывать данные в существующий файл, не стирая его?
Да. Конструктор объекта ЗаписьТекста поддерживает режим добавления: при соответствующих параметрах новые строки дописываются в конец файла. Это стандартный подход для журналов событий. У объекта ТекстовыйДокумент такого режима нет — он всегда перезаписывает файл целиком.
Запись вызывает ошибку «отказано в доступе», хотя папка есть. Что проверить?
Проверьте, от имени какой учётной записи выполняется код: на сервере это учётная запись службы сервера 1С, а не текущий пользователь. Убедитесь, что у неё есть право записи в каталог, что файл не открыт другой программой и не заблокирован антивирусом, а для сетевого пути — что учётная запись имеет доступ к ресурсу.
Чем отличается запись табличного документа от записи текстового файла?
Табличный документ записывается методом Записать() с указанием типа файла — XLSX, PDF, MXL и других — и сохраняет форматирование, колонки и оформление. Текстовый файл содержит только символы и переносы строк без форматирования. Выбор определяется тем, что ожидает принимающая сторона: данные для обработки или готовую печатную форму.