JSON без BOM-кодировки

Веб-разработчик клиента пожаловался, что json-файл, который я передаю ему на FTP Bitrix-сайта, приходит в кодировке UTF с BOM.

Я проверил, действительно Notepad++ определяет его в такой кодировке:

Это легко проверить если открыть файл в двоичном виде (в Total Commander):

Как видно, в начале файла содержится 3 байта EF BB BF. Это и есть BOM-кодировка.

Нашел решение на инфостарте поиском.

В решении используется функция ЗаписьТекста:

Заменил ТекстовыйДокумент на ЗаписьТекста:

    Лок_ИмяФайла = КаталогВременныхФайлов() + Строка(Новый УникальныйИдентификатор);

    ТекстСопутствующих = Обработки.дор_РассчетСопутствующихДляСайта.РассчитатьВФайл();

    УдалитьФайлы(Лок_ИмяФайла); //Не обязательно, у файла уникальное имя, но для общности
   
ЗаписьТекста = Новый ЗаписьТекста(Лок_ИмяФайла,КодировкаТекста.UTF8,,Ложь,Символы.ПС);
   
//Т = Новый ТекстовыйДокумент();
   
ЗаписьТекста.Записать(ТекстСопутствующих);
   
//Т.УстановитьТекст(ТекстСопутствующих);
    //Т.Записать(Лок_ИмяФайла);
   
ЗаписьТекста.Закрыть();

Посмотрел в отладчике, в какой файл сохраняется временный файл: C:\Users\User\AppData\Local\Temp\50cfa3b5-8cf8-481d-aaa6-d0b2498d974d

Поиском нашел этот файл в каталоге:

Но увы, независимо от значения параметра Дописывать, 1С настойчиво добавляло BOM-кодировку:

Бюджет решения не позволялся углубляться в поиски, поэтому я сделал решение через ADODB.Stream, которое было написано в той же статье:

    Лок_ИмяФайла = КаталогВременныхФайлов() + Строка(Новый УникальныйИдентификатор);
   
Лок_ИмяФайлаНач = Лок_ИмяФайла + «_Нач»;
   
ТекстСопутствующих = Обработки.дор_РассчетСопутствующихДляСайта.РассчитатьВФайл();

    Т = Новый ТекстовыйДокумент();
   
Т.УстановитьТекст(ТекстСопутствующих);
   
Т.Записать(Лок_ИмяФайлаНач);

    УбитьВОМ(Лок_ИмяФайлаНач, Лок_ИмяФайла);

Процедура УбитьВОМ(ИсходныйФайл,РезультирующийФайл)
    Попытка
       
файл = Новый ComObject(«ADODB.Stream»);
       
файл.Mode = 3; // r/w
       
файл.Type = 1; //1-Binary, 2-Text
       
файл.Open();
       
файл.LoadFromFile(ИсходныйФайл);
       
файл.Position = 3;
       
текстБезБОМ = Новый ComObject(«ADODB.Stream»);
       
текстБезБОМ.Mode = 3; // r/w
       
текстБезБОМ.Type = 1; //1-Binary, 2-Text
       
текстБезБОМ.Open();
       
файл.CopyTo(текстБезБОМ);
       
файл.Close();
       
текстБезБОМ.SaveToFile(РезультирующийФайл,2);
       
текстБезБОМ.Close();
       
УдалитьФайлы(ИсходныйФайл);
    Исключение
       
Сообщить(ОписаниеОшибки(),СтатусСообщения.Важное);
    КонецПопытки;
КонецПроцедуры

Наконец у меня получился чистый UTF, без BOM:

Потом почитал, что метод через ЗаписьТекста работает не на всех режимах совместимости.

У меня была УТ11, релиз платформы 8.3.16.1502, режим совместимости 8.3.14.

Время факт: 0.5 час.