Как задать кодировку ISO-8859-1 при записи файла в 1С

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

При выгрузке текстовых файлов для интеграции с внешними системами или зарубежными сервисами нередко требуется сформировать файл в специфической кодировке, например ISO-8859-1 (Latin-1). Разработчики часто пытаются решить эту задачу привычным объектом ТекстовыйДокумент, однако сталкиваются с тем, что файл сохраняется в кодировке по умолчанию либо внешние редакторы определяют его формат как UTF-8. Разберем подробно, почему так происходит и как правильно записать файл с требуемой кодировкой в платформе 1С:Предприятие 8.3.

Анализ причин некорректного сохранения кодировки

Проанализируем ситуацию и выясним, почему стандартный код с объектом ТекстовыйДокумент не дает нужного результата:

  1. Ограничения объекта ТекстовыйДокумент. Методы УстановитьТипФайла и второй параметр метода Записать принимают исключительно значения системного перечисления ТипФайлаТекстовогоДокумента (такие как ANSI, DOS, UTF8, UTF16_BE, UTF16_LE) либо их строковые эквиваленты. Произвольные строковые названия кодировок формата IANA (например, "ISO-8859-1") объект ТекстовыйДокумент не распознает и подставляет системное значение по умолчанию.
  2. Особенности эвристического анализа кодировок в текстовых редакторах (Notepad++). В простом текстовом файле метаданные о кодировке не сохраняются (за исключением сигнатуры BOM в Unicode). Если в файле содержатся только символы базовой латиницы и цифры (диапазон кодов 0–127, US-ASCII), то их байтовое представление в кодировках ASCII, ISO-8859-1, Windows-1252 и UTF-8 абсолютно идентично. Текстовый редактор не видит байтов выше 127 и определяет такой файл как UTF-8. Чтобы проверить реальную работу кодировки, необходимо включить в текст спецсимволы из диапазона 128–255 (например, символы ä, é, ñ).

Основное решение: использование объекта «ЗаписьТекста»

Для записи файлов в произвольных стандартах кодирования платформой 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");

Запись.Закрыть();

Альтернативное решение: использование COM-объекта ADODB.Stream (для ОС Windows)

Если код выполняется на сервере или клиенте под управлением 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();

Рекомендации по проверке результата

Чтобы убедиться, что файл действительно сохранен в нужной кодировке, выполним следующие шаги:

  1. Добавим в тестовую строку нелатинский символ из набора Latin-1 (например, ü или é).
  2. Откроем полученный файл в шестнадцатеричном редакторе (HEX-редактор): в ISO-8859-1 каждый символ кодируется строго одним байтом, тогда как в UTF-8 символы за пределами ASCII занимают два или более байт.
  3. При открытии файла в Notepad++ в правом нижнем углу или в меню «Кодировки» будет отображаться ожидаемый однобайтовый набор символов.
← На главную