При организации интеграционных процессов и автоматического обмена данными сторонние информационные системы часто требуют наличие служебного файла-флага или файла-маркера. Подобный файл сообщает принимающей стороне о завершении выгрузки или готовности данных к обработке. Главное требование к таким файлам — абсолютно пустой размер в 0 байт (или 0 КБ в представлении проводника).
Однако при попытке сформировать пустой текстовый документ или файл XML стандартными методами платформы 1С разработчики сталкиваются с тем, что созданный файл занимает на диске 1 КБ и содержит невидимые символы. Рассмотрим подробнее, почему так происходит, и проанализируем проверенные способы создания файлов нулевой длины.
Разберем основные причины, по которым файл, созданный из 1С, оказывается непустым:
Записать() объекта ТекстовыйДокумент система сохраняет текст в кодировке UTF-8. В начало файла автоматически добавляется маркер порядка байтов BOM (трехбайтовая последовательность 0xEF, 0xBB, 0xBF). Файл фактически содержит 3 байта, которые операционная система округает и показывает как 1 КБ.ЗаписьXML), то при инициализации структуры в файл сразу записываются служебные заголовки вида <?xml version="1.0" encoding="UTF-8"?>. Сформировать истинно пустой файл через XML-объекты невозможно по определению.Самое простое решение для текстовых документов — принудительное указание однобайтовой кодировки при сохранении. Однобайтовые кодировки (ANSI или OEM) не записывают заголовок BOM в начало файла. Если текст для записи отсутствует, итоговый размер файла составит ровно 0 байт.
Посмотрим на пример кода с использованием объекта ТекстовыйДокумент:
Текст = Новый ТекстовыйДокумент;
Текст.Записать("D:\ZeroFile.txt", КодировкаТекста.OEM);
Также можно применить объект ЗаписьТекста, открыв его с однобайтовой кодировкой и сразу закрыв без вызова методов записи строк:
Запись = Новый ЗаписьТекста("D:\ZeroFile.txt", КодировкаТекста.ANSI);
Запись.Закрыть();
Оба этих варианта гарантируют создание файла размером 0 байт на диске.
Начиная с версии платформы 8.3.6, доступна работа со стандартными бинарными потоками через объект ЗаписьДанных. Этот способ универсален и идеально подходит для создания чистых пустых файлов с любым расширением.
Рассмотрим пошаговый алгоритм:
Запись = Новый ЗаписьДанных("D:\ZeroFile.xml");
Запись.Закрыть();
В данном случае платформа создает файловый поток и сразу освобождает его без записи каких-либо байтов. Обратите внимание: если файл-маркер должен иметь расширение .xml, его нужно формировать именно через ЗаписьДанных или ЗаписьТекста, а не через объект ЗаписьXML.
Другой надежный метод — создание пустого потока в оперативной памяти с последующим сохранением двоичных данных на диск:
Поток = Новый ПотокВПамяти();
Двоичные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Двоичные.Записать("D:\ZeroFile.txt");
Если требуется создать пустой файл средствами самой операционной системы, можно воспользоваться функцией ЗапуститьПриложение:
Для ОС Windows:
ЗапуститьПриложение("cmd.exe /c type nul > ""D:\ZeroFile.txt""", , Истина);
Для ОС Linux:
ЗапуститьПриложение("touch ""/tmp/ZeroFile.txt""", , Истина);
При реализации создания файлов на управляемых формах учтите следующие моменты:
1C:Enterprise Server, должны быть предоставлены права на запись в целевой каталог файловой системы.