Разработка и Конфигурация · 10 мин
Как программно создать файл в 1С: способы и примеры кода
Как программно создать файл в 1С: объекты ТекстовыйДокумент, ЗаписьТекста, ЗаписьXML, работа с путями и кодировками. Готовые примеры кода и типичные ошибки.
Программное создание файлов в 1С — одна из самых частых задач при разработке обменов, выгрузок и интеграций. Платформа предоставляет несколько встроенных объектов для работы с файлами: ТекстовыйДокумент, ЗаписьТекста, ЗаписьXML, ЗаписьJSON, ДвоичныеДанные и другие. Выбор конкретного инструмента зависит от формата файла и того, где выполняется код — на клиенте или на сервере.
Важный нюанс: в тонком и веб-клиенте прямой доступ к файловой системе пользователя ограничен. Код, который без проблем работает в толстом клиенте, может выдать ошибку или потребовать расширения работы с файлами. Поэтому перед написанием обработки нужно определить контекст выполнения и выбрать подходящий механизм.
Ниже разобраны основные способы создания файлов с готовыми примерами кода на встроенном языке 1С, различия между клиентом и сервером, типичные ошибки и способы проверки результата.
Какие объекты 1С используются для создания файлов
Платформа 1С предлагает несколько объектов для записи файлов, и у каждого своя область применения. ТекстовыйДокумент подходит для простых текстовых файлов, CSV и логов. ЗаписьТекста даёт более гибкий контроль: посимвольную запись, разделители строк, открытие файла на дозапись. ЗаписьXML и ЗаписьJSON формируют структурированные файлы с контролем корректности формата.
Для двоичных файлов (картинки, архивы, произвольные данные) используется тип ДвоичныеДанные, который получают из содержимого и затем сохраняют методом Записать(). Для табличных документов (MXL, Excel, PDF) применяется метод Записать() объекта ТабличныйДокумент с указанием типа файла.
| Объект | Назначение | Ключевой метод |
|---|---|---|
| ТекстовыйДокумент | Текст, CSV, логи | Записать(ИмяФайла) |
| ЗаписьТекста | Посимвольная запись, дозапись | ЗаписатьСтроку(), Закрыть() |
| ЗаписьXML | XML-файлы обмена | ЗаписатьНачалоЭлемента(), Закрыть() |
| ЗаписьJSON | JSON для веб-интеграций | ЗаписатьНачалоОбъекта(), Закрыть() |
| ДвоичныеДанные | Картинки, архивы, произвольные байты | Записать(ИмяФайла) |
| ТабличныйДокумент | 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.Закрыть();
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Обмен\data.json");
ЗаписатьJSON(ЗаписьJSON, Данные);
ЗаписьJSON.Закрыть();Особенности работы на клиенте и на сервере
Ключевое отличие: код с директивой &НаСервере выполняется на сервере 1С, и путь "C:\Обмен\..." укажет на диск сервера, а не компьютера пользователя. Это самая частая причина «потерянных» файлов — выгрузка создаётся, но пользователь не может её найти, потому что она лежит на сервере.
Для передачи файла с сервера клиенту используется механизм временного хранилища: файл помещается через ПоместитьВоВременноеХранилище(), а на клиенте сохраняется методом НачатьПолучениеФайлов() или ПолучитьФайл(). В веб-клиенте и тонком клиенте без расширения работы с файлами сохранение инициируется через диалог браузера.
Если обработка должна работать и в тонком, и в толстом клиенте, используйте асинхронные методы с префиксом «Начать»: НачатьПолучениеФайлов, НачатьПомещениеФайла. Синхронные вызовы в современных режимах запуска могут быть запрещены настройками конфигурации.
Как выбрать подход
Проверка результата и типичные ошибки
После создания файла полезно проверить три вещи: файл существует, его размер больше нуля, содержимое читается в ожидаемой кодировке. Для этого достаточно объекта Файл и повторного чтения через ТекстовыйДокумент.Прочитать().
Типичные ошибки при программном создании файлов: запись по несуществующему пути (каталог не создан — метод Записать выдаст ошибку), отсутствие прав на каталог у пользователя ОС, под которым работает сервер 1С, неверная кодировка, из-за которой кириллица превращается в нечитаемые символы, и попытка писать в файл, открытый другой программой.
Каталог перед записью стоит создавать программно, если его нет. Для этого используется метод СоздатьКаталог() — он безопасно отработает, даже если каталог уже существует.
Если НЕ ФайловаяСистема.КаталогСуществует("C:\Обмен") Тогда
СоздатьКаталог("C:\Обмен");
КонецЕсли;
Как проверить результат
Новый Файл(Путь).Существует() возвращает Истина
Метод возвращает Ложь — проверяйте путь и контекст выполнения
Размер больше нуля и соответствует объёму данных
Размер 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. Всегда закрывайте потоки записи, проверяйте существование каталога и учитывайте, где выполняется код: путь сервера и путь клиента — разные файловые системы.