В практике разработки на платформе 1С:Предприятие часто возникает задача создания внешнего файла, который служит своего рода «флагом» или сигналом для других систем или сессий. Например, наличие пустого файла может означать, что процесс завершен, а наличие текста внутри него — детализацию ошибки. Однако программисты часто сталкиваются с тем, что «пустой» файл на самом деле содержит невидимые символы, которые мешают корректной логике программы. Рассмотрим подробнее, как правильно создавать такие файлы и почему возникают ошибки при их чтении.
При использовании стандартных методов 1С, таких как ТекстовыйДокумент или ЗаписьТекста с кодировкой UTF-8, платформа автоматически добавляет в начало файла специальную метку — BOM (Byte Order Mark). В текстовых редакторах или при просмотре через Сообщить() эти символы могут выглядеть как п»ї.
Проанализируем ситуацию: если ваша функция проверки ожидает, что количество строк равно нулю или строка пустая, наличие BOM приведет к тому, что 1С распознает файл как заполненный. Выясним причину: при чтении файла в кодировке, отличной от той, в которой он был записан, эти три байта интерпретируются как значащие символы.
Самый простой способ создать файл без лишних меток — это использование объекта ТекстовыйДокумент с принудительным указанием кодировки ANSI (Windows-1251). В этой кодировке метка BOM отсутствует в принципе.
Рассмотрим пример кода:
// Создаем объект текстового документа
ФайлЛог = Новый ТекстовыйДокумент;
// Записываем его в файл, явно указывая ANSI
// Это гарантирует отсутствие BOM-символов
ИмяФайла = "C:\Logs\status_flag.txt";
ФайлЛог.Записать(ИмяФайла, КодировкаТекста.ANSI);
Этот метод хорош тем, что он прост и понятен. Однако стоит помнить, что ТекстовыйДокумент при записи пустого объекта может все равно создать файл минимального размера или добавить перевод строки, в зависимости от версии платформы.
Объект ЗаписьТекста предоставляет больше контроля над процессом записи. Посмотрим на пример создания файла, который будет гарантированно очищен перед использованием:
Процедура СоздатьПустойФайл(ПутьКФайлу)
// Инициализируем запись текста с нужной кодировкой
// Параметр Ложь в конструкторе (если бы он был для дозаписи)
// здесь не нужен, так как создание нового объекта перезаписывает файл
Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.ANSI);
// Просто закрываем файл, ничего в него не записывая
Запись.Закрыть();
КонецПроцедуры
Если вам все же необходимо использовать UTF-8, но без BOM (что актуально для интеграций с веб-сервисами или Linux-системами), в современных версиях платформы (8.3.10 и выше) можно использовать строковое описание кодировки:
// Использование UTF-8 без BOM
Запись = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8");
Запись.Закрыть();
Если стоит задача создать файл размером ровно 0 байт, чтобы даже самый чувствительный алгоритм не нашел в нем ни одного символа, лучше всего воспользоваться механизмом работы с двоичными данными. Мы создадим пустой буфер и запишем его на диск.
// Создаем пустой массив байтов
ПустойБуфер = Новый ДвоичныеДанные("");
// Записываем его в файл
ПустойБуфер.Записать(ИмяФайла);
Этот способ является «золотым стандартом», если файл нужен только как факт своего существования на диске.
Проанализируем типичную ошибку: использование метода КоличествоСтрок(). Для этого 1С приходится считывать весь файл в память и парсить его. Если файл окажется случайно огромным (например, лог разросся), это вызовет зависание. Правильнее проверять размер файла через объект Файл.
Рассмотрим по шагам оптимальный алгоритм проверки:
Файл по пути к нему.Существует().Размер().
Функция ФайлДействительноПустой(ПолноеИмяФайла) Экспорт
ОбъектФайл = Новый Файл(ПолноеИмяФайла);
Если Не ОбъектФайл.Существует() Тогда
Возврат Истина; // Если файла нет, считаем его пустым (или по логике задачи)
КонецЕсли;
// Если размер 0 байт — он абсолютно пуст
// Если размер 3 байта и это UTF-8 — там только BOM
Если ОбъектФайл.Размер() <= 3 Тогда
// Здесь можно добавить дополнительную проверку содержимого
// если критично различать 0 байт и BOM
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Иногда быстрее и надежнее «коснуться» файла средствами операционной системы. Рассмотрим, как это сделать через 1С, используя команду touch (для Linux) или copy nul (для Windows).
// Пример для Windows через КомандаСистемы
Команда = "cmd /c copy /b nul """ + ИмяФайла + """";
КомандаСистемы(Команда);
Этот метод мгновенно создает файл нулевого размера, если его не было, или обновляет время его модификации, не затрагивая содержимое.
Если вы используете файл для определения того, занята ли информационная база или выполняется ли в ней регламентное задание, помните о следующих правилах:
ЧтениеТекста или ЗаписьТекста с монопольным доступом, чтобы другие процессы не могли изменить файл, пока вы с ним работаете.Попытка...Исключение, чтобы гарантированно закрыть или удалить файл-флаг, даже если произошла критическая ошибка.ПолучитьСоединенияИнформационнойБазы(). Это гораздо надежнее файловых методов.Подводя итог, можно сказать: чтобы избежать проблем с символами п»ї, всегда явно управляйте кодировкой при записи и отдавайте предпочтение проверке размера файла вместо анализа его текстового содержимого.