Как в 1С программно создать файл размером 0 КБ?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При организации интеграционных процессов и автоматического обмена данными сторонние информационные системы часто требуют наличие служебного файла-флага или файла-маркера. Подобный файл сообщает принимающей стороне о завершении выгрузки или готовности данных к обработке. Главное требование к таким файлам — абсолютно пустой размер в 0 байт (или 0 КБ в представлении проводника).

Однако при попытке сформировать пустой текстовый документ или файл XML стандартными методами платформы 1С разработчики сталкиваются с тем, что созданный файл занимает на диске 1 КБ и содержит невидимые символы. Рассмотрим подробнее, почему так происходит, и проанализируем проверенные способы создания файлов нулевой длины.

Выясним причину: почему создаваемый файл получается больше 0 байт

Разберем основные причины, по которым файл, созданный из 1С, оказывается непустым:

  1. Служебный маркер BOM (Byte Order Mark): По умолчанию при вызове метода Записать() объекта ТекстовыйДокумент система сохраняет текст в кодировке UTF-8. В начало файла автоматически добавляется маркер порядка байтов BOM (трехбайтовая последовательность 0xEF, 0xBB, 0xBF). Файл фактически содержит 3 байта, которые операционная система округает и показывает как 1 КБ.
  2. Особенности работы объектов XML: Если использовать специализированные объекты работы с XML (например, ЗаписьXML), то при инициализации структуры в файл сразу записываются служебные заголовки вида <?xml version="1.0" encoding="UTF-8"?>. Сформировать истинно пустой файл через XML-объекты невозможно по определению.

Способ 1. Использование кодировок OEM или ANSI

Самое простое решение для текстовых документов — принудительное указание однобайтовой кодировки при сохранении. Однобайтовые кодировки (ANSI или OEM) не записывают заголовок BOM в начало файла. Если текст для записи отсутствует, итоговый размер файла составит ровно 0 байт.

Посмотрим на пример кода с использованием объекта ТекстовыйДокумент:


Текст = Новый ТекстовыйДокумент;
Текст.Записать("D:\ZeroFile.txt", КодировкаТекста.OEM);

Также можно применить объект ЗаписьТекста, открыв его с однобайтовой кодировкой и сразу закрыв без вызова методов записи строк:


Запись = Новый ЗаписьТекста("D:\ZeroFile.txt", КодировкаТекста.ANSI);
Запись.Закрыть();

Оба этих варианта гарантируют создание файла размером 0 байт на диске.

Способ 2. Использование объекта ЗаписьДанных

Начиная с версии платформы 8.3.6, доступна работа со стандартными бинарными потоками через объект ЗаписьДанных. Этот способ универсален и идеально подходит для создания чистых пустых файлов с любым расширением.

Рассмотрим пошаговый алгоритм:


Запись = Новый ЗаписьДанных("D:\ZeroFile.xml");
Запись.Закрыть();

В данном случае платформа создает файловый поток и сразу освобождает его без записи каких-либо байтов. Обратите внимание: если файл-маркер должен иметь расширение .xml, его нужно формировать именно через ЗаписьДанных или ЗаписьТекста, а не через объект ЗаписьXML.

Способ 3. Формирование пустых двоичных данных в памяти

Другой надежный метод — создание пустого потока в оперативной памяти с последующим сохранением двоичных данных на диск:


Поток = Новый ПотокВПамяти();
Двоичные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Двоичные.Записать("D:\ZeroFile.txt");

Способ 4. Вызов системных команд ОС

Если требуется создать пустой файл средствами самой операционной системы, можно воспользоваться функцией ЗапуститьПриложение:

Для ОС Windows:

ЗапуститьПриложение("cmd.exe /c type nul > ""D:\ZeroFile.txt""", , Истина);

Для ОС Linux:

ЗапуститьПриложение("touch ""/tmp/ZeroFile.txt""", , Истина);

Важные особенности при работе на сервере и в тонком клиенте

При реализации создания файлов на управляемых формах учтите следующие моменты:

  1. В тонком клиенте при включенном режиме запрета синхронных вызовов прямое использование конструкторов работы с файлами вызовет ошибку. Рекомендуется переносить процедуру создания файла на сервер.
  2. При выполнении кода на стороне сервера у учетной записи ОС, от имени которой заведена служба 1C:Enterprise Server, должны быть предоставлены права на запись в целевой каталог файловой системы.
← На главную