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

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

Как программно создать файл в 1С: способы и примеры кода

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

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

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

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

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

Платформа 1С предлагает несколько объектов для записи файлов, и у каждого своя область применения. ТекстовыйДокумент подходит для простых текстовых файлов, CSV и логов. ЗаписьТекста даёт более гибкий контроль: посимвольную запись, разделители строк, открытие файла на дозапись. ЗаписьXML и ЗаписьJSON формируют структурированные файлы с контролем корректности формата.

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

ОбъектНазначениеКлючевой метод
ТекстовыйДокументТекст, CSV, логиЗаписать(ИмяФайла)
ЗаписьТекстаПосимвольная запись, дозаписьЗаписатьСтроку(), Закрыть()
ЗаписьXMLXML-файлы обменаЗаписатьНачалоЭлемента(), Закрыть()
ЗаписьJSONJSON для веб-интеграцийЗаписатьНачалоОбъекта(), Закрыть()
ДвоичныеДанныеКартинки, архивы, произвольные байтыЗаписать(ИмяФайла)
ТабличныйДокументMXL, XLSX, PDFЗаписать(ИмяФайла, ТипФайла)

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

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

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

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

Текст.ДобавитьСтроку("Товар 1;1500");

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

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

Для проверки успешности записи полезно после сохранения убедиться, что файл существует. Это делается через объект Файл и метод Существует().

ФайлПроверка = Новый Файл("C:\Обмен\price.csv");

Если ФайлПроверка.Существует() Тогда

Сообщить("Файл создан, размер: " + ФайлПроверка.Размер() + " байт");

КонецЕсли;

Запись потоком через ЗаписьТекста

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

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

Запись.ЗаписатьСтроку("Начало выгрузки: " + ТекущаяДата());

Запись.ЗаписатьСтроку("Обработано записей: 100");

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

Четвёртый параметр конструктора (Истина) включает режим дозаписи: новые строки добавляются в конец существующего файла, а не затирают его. Это стандартный подход для файлов журналов.

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

Создание XML и JSON файлов

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

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл("C:\Обмен\goods.xml");

ЗаписьXML.ЗаписатьОбъявлениеXML();

ЗаписьXML.ЗаписатьНачалоЭлемента("Товары");

ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");

ЗаписьXML.ЗаписатьАтрибут("Код", "0001");

ЗаписьXML.ЗаписатьТекст("Товар 1");

ЗаписьXML.ЗаписатьКонецЭлемента();

ЗаписьXML.ЗаписатьКонецЭлемента();

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

Для JSON логика аналогична: объект ЗаписьJSON с методами ЗаписатьНачалоОбъекта(), ЗаписатьСвойство(), ЗаписатьЗначение(). Также есть вспомогательная функция ЗаписатьJSON(), которая сериализует структуру или соответствие 1С в JSON одним вызовом.

Данные = Новый Структура;

Данные.Вставить("Номенклатура", "Товар 1");

Данные.Вставить("Цена", 1500);

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.ОткрытьФайл("C:\Обмен\data.json");

ЗаписатьJSON(ЗаписьJSON, Данные);

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

bsl
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Обмен\data.json");
ЗаписатьJSON(ЗаписьJSON, Данные);
ЗаписьJSON.Закрыть();

Особенности работы на клиенте и на сервере

Ключевое отличие: код с директивой &НаСервере выполняется на сервере 1С, и путь "C:\Обмен\..." укажет на диск сервера, а не компьютера пользователя. Это самая частая причина «потерянных» файлов — выгрузка создаётся, но пользователь не может её найти, потому что она лежит на сервере.

Для передачи файла с сервера клиенту используется механизм временного хранилища: файл помещается через ПоместитьВоВременноеХранилище(), а на клиенте сохраняется методом НачатьПолучениеФайлов() или ПолучитьФайл(). В веб-клиенте и тонком клиенте без расширения работы с файлами сохранение инициируется через диалог браузера.

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

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

Как выбрать подход

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

Проверка результата и типичные ошибки

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

Типичные ошибки при программном создании файлов: запись по несуществующему пути (каталог не создан — метод Записать выдаст ошибку), отсутствие прав на каталог у пользователя ОС, под которым работает сервер 1С, неверная кодировка, из-за которой кириллица превращается в нечитаемые символы, и попытка писать в файл, открытый другой программой.

Каталог перед записью стоит создавать программно, если его нет. Для этого используется метод СоздатьКаталог() — он безопасно отработает, даже если каталог уже существует.

Если НЕ ФайловаяСистема.КаталогСуществует("C:\Обмен") Тогда

СоздатьКаталог("C:\Обмен");

КонецЕсли;

Типичные ошибки
01
Запись по пути клиента в серверном коде — файл создаётся на сервере, пользователь его не находит
02
Отсутствие Закрыть() у ЗаписьТекста — файл пустой или заблокирован
03
Неправильная кодировка — кириллица в файле нечитаема; используйте UTF8 с BOM для Excel
04
Не создан каталог назначения — ошибка при вызове Записать()
05
Перезапись существующего файла без резервной копии — потеря предыдущей выгрузки
Контрольные точки

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

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

Новый Файл(Путь).Существует() возвращает Истина

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

Метод возвращает Ложь — проверяйте путь и контекст выполнения

Размер файла
Норма

Размер больше нуля и соответствует объёму данных

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

Размер 0 байт — вероятно, не вызван Закрыть() или данные не записаны

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

Текст читается, кириллица отображается корректно

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

Кракозябры — несовпадение кодировки записи и чтения

Доступность для других программ
Норма

Файл открывается в блокноте или Excel

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

Ошибка доступа — файл заблокирован незакрытым объектом

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

Как создать файл Excel из 1С программно?

Сформируйте ТабличныйДокумент и вызовите его метод Записать("Путь\файл.xlsx", ТипФайлаТабличногоДокумента.XLSX). Также поддерживаются форматы PDF, MXL, ODS и HTML. Учтите, что на сервере Linux для некоторых форматов есть ограничения.

Как указать кодировку при записи текстового файла?

Передайте кодировку вторым параметром метода Записать() или в конструктор ЗаписьТекста: КодировкаТекста.UTF8, КодировкаТекста.ANSI, КодировкаТекста.UTF16. Для файлов, которые будут открываться в Excel, обычно нужен UTF-8 с BOM — он используется по умолчанию для UTF8.

Почему файл не создаётся в тонком клиенте?

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

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

Используйте ЗаписьТекста с четвёртым параметром конструктора равным Истина — это включает режим дозаписи. Для ТекстовыйДокумент можно сначала Прочитать() существующий файл, добавить строки и снова Записать().

Как создать файл с уникальным именем?

Добавьте в имя файла дату и время: Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss"). Альтернатива — функция ПолучитьИмяВременногоФайла("txt"), которая возвращает гарантированно уникальное имя во временном каталоге.

Итог

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

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