Как в 1С создать пустой текстовый файл и избежать проблем с кодировкой BOM

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

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

Разберем проблему: откуда берутся лишние символы?

При использовании стандартных методов 1С, таких как ТекстовыйДокумент или ЗаписьТекста с кодировкой UTF-8, платформа автоматически добавляет в начало файла специальную метку — BOM (Byte Order Mark). В текстовых редакторах или при просмотре через Сообщить() эти символы могут выглядеть как п»ї.

Проанализируем ситуацию: если ваша функция проверки ожидает, что количество строк равно нулю или строка пустая, наличие BOM приведет к тому, что 1С распознает файл как заполненный. Выясним причину: при чтении файла в кодировке, отличной от той, в которой он был записан, эти три байта интерпретируются как значащие символы.

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

Самый простой способ создать файл без лишних меток — это использование объекта ТекстовыйДокумент с принудительным указанием кодировки ANSI (Windows-1251). В этой кодировке метка BOM отсутствует в принципе.

Рассмотрим пример кода:


// Создаем объект текстового документа
ФайлЛог = Новый ТекстовыйДокумент;

// Записываем его в файл, явно указывая ANSI
// Это гарантирует отсутствие BOM-символов
ИмяФайла = "C:\Logs\status_flag.txt";
ФайлЛог.Записать(ИмяФайла, КодировкаТекста.ANSI);

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

Способ 2: Объект ЗаписьТекста — более гибкое управление

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


Процедура СоздатьПустойФайл(ПутьКФайлу)
    // Инициализируем запись текста с нужной кодировкой
    // Параметр Ложь в конструкторе (если бы он был для дозаписи) 
    // здесь не нужен, так как создание нового объекта перезаписывает файл
    Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.ANSI);
    
    // Просто закрываем файл, ничего в него не записывая
    Запись.Закрыть();
КонецПроцедуры

Если вам все же необходимо использовать UTF-8, но без BOM (что актуально для интеграций с веб-сервисами или Linux-системами), в современных версиях платформы (8.3.10 и выше) можно использовать строковое описание кодировки:


// Использование UTF-8 без BOM
Запись = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8");
Запись.Закрыть();

Способ 3: Создание абсолютно пустого файла (0 байт) через ДвоичныеДанные

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


// Создаем пустой массив байтов
ПустойБуфер = Новый ДвоичныеДанные(""); 
// Записываем его в файл
ПустойБуфер.Записать(ИмяФайла);

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

Как эффективно проверить файл на «пустоту»?

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

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

  1. Создаем объект Файл по пути к нему.
  2. Проверяем существование файла методом Существует().
  3. Если файл существует, проверяем его свойство Размер().

Функция ФайлДействительноПустой(ПолноеИмяФайла) Экспорт
    ОбъектФайл = Новый Файл(ПолноеИмяФайла);
    
    Если Не ОбъектФайл.Существует() Тогда
        Возврат Истина; // Если файла нет, считаем его пустым (или по логике задачи)
    КонецЕсли;
    
    // Если размер 0 байт — он абсолютно пуст
    // Если размер 3 байта и это UTF-8 — там только BOM
    Если ОбъектФайл.Размер() <= 3 Тогда 
        // Здесь можно добавить дополнительную проверку содержимого
        // если критично различать 0 байт и BOM
        Возврат Истина;
    Иначе
        Возврат Ложь;
    КонецЕсли;
КонецФункции

Альтернативный подход: Использование системных команд

Иногда быстрее и надежнее «коснуться» файла средствами операционной системы. Рассмотрим, как это сделать через 1С, используя команду touch (для Linux) или copy nul (для Windows).


// Пример для Windows через КомандаСистемы
Команда = "cmd /c copy /b nul """ + ИмяФайла + """";
КомандаСистемы(Команда);

Этот метод мгновенно создает файл нулевого размера, если его не было, или обновляет время его модификации, не затрагивая содержимое.

Рекомендации по использованию файлов-флагов

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

Подводя итог, можно сказать: чтобы избежать проблем с символами п»ї, всегда явно управляйте кодировкой при записи и отдавайте предпочтение проверке размера файла вместо анализа его текстового содержимого.

← На главную