При выгрузке текстовых файлов для интеграции с внешними системами или зарубежными сервисами нередко требуется сформировать файл в специфической кодировке, например ISO-8859-1 (Latin-1). Разработчики часто пытаются решить эту задачу привычным объектом ТекстовыйДокумент, однако сталкиваются с тем, что файл сохраняется в кодировке по умолчанию либо внешние редакторы определяют его формат как UTF-8. Разберем подробно, почему так происходит и как правильно записать файл с требуемой кодировкой в платформе 1С:Предприятие 8.3.
Проанализируем ситуацию и выясним, почему стандартный код с объектом ТекстовыйДокумент не дает нужного результата:
ТекстовыйДокумент. Методы УстановитьТипФайла и второй параметр метода Записать принимают исключительно значения системного перечисления ТипФайлаТекстовогоДокумента (такие как ANSI, DOS, UTF8, UTF16_BE, UTF16_LE) либо их строковые эквиваленты. Произвольные строковые названия кодировок формата IANA (например, "ISO-8859-1") объект ТекстовыйДокумент не распознает и подставляет системное значение по умолчанию.ä, é, ñ).Для записи файлов в произвольных стандартах кодирования платформой 1С предусмотрен объект ЗаписьТекста. В параметре Кодировка (как в конструкторе, так и в методе Открыть) он поддерживает строковые названия кодировок стандартов IANA и ICU, включая "ISO-8859-1".
Разберем по шагам правильный алгоритм формирования и сохранения файла:
ПутьКФайлу = "C:\TestTD\1.txt";
// Создаем объект ЗаписьТекста с явным указанием кодировки строкой
Запись = Новый ЗаписьТекста(ПутьКФайлу, "ISO-8859-1");
// Записываем нужные строки
Запись.ЗаписатьСтроку("test 1");
Запись.ЗаписатьСтроку("test 2");
// Обязательно закрываем поток после завершения записи
Запись.Закрыть();
Посмотрим на расширенный вариант, в котором можно управлять разделителями строк и режимом добавления в конец файла:
ПутьКФайлу = "C:\TestTD\export_data.txt";
Запись = Новый ЗаписьТекста;
// Метод Открыть принимает: Путь, Кодировку, РазделительСтрок, РежимДозаписи
Запись.Открыть(ПутьКФайлу, "ISO-8859-1", Символы.ПС, Ложь);
Запись.ЗаписатьСтроку("Header: Export Data");
Запись.ЗаписатьСтроку("Item: Café / Naïve");
Запись.Закрыть();
Если код выполняется на сервере или клиенте под управлением Windows, можно применить низкоуровневую запись через поток ADODB.Stream. Этот способ гарантирует точное преобразование кодовой страницы:
ПутьКФайлу = "C:\TestTD\adodb_test.txt";
Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 2; // adTypeText
Поток.Charset = "ISO-8859-1";
Поток.Open();
Поток.WriteText("test 1" + Символы.ПС);
Поток.WriteText("test 2" + Символы.ПС);
// Сохраняем поток в файл (2 = adSaveCreateOverWrite)
Поток.SaveToFile(ПутьКФайлу, 2);
Поток.Close();
Чтобы убедиться, что файл действительно сохранен в нужной кодировке, выполним следующие шаги:
ü или é).ISO-8859-1 каждый символ кодируется строго одним байтом, тогда как в UTF-8 символы за пределами ASCII занимают два или более байт.