Как прочитать текстовый файл в кодировке UTF-8 или с непонятной кодировкой в 1С 7.7

Программист 1С v7.7 Торговля и дистрибуция
← На главную

При обмене данными между современными кассовыми терминалами (например, Эвотор) и классической платформой 1С:Предприятие 7.7 часто возникает проблема несовместимости кодировок. Стандартные средства "семерки", такие как объект Текст, рассчитаны на работу с однобайтовыми кодировками (обычно Windows-1251). Когда мы пытаемся открыть современный файл в формате UTF-8, вместо кириллицы мы видим странные символы, например: Отчёт. В этой статье мы подробно разберем, как научить старую добрую 1С 7.7 понимать современные форматы данных.

Выясняем причину проблемы: что такое BOM и UTF-8

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

Для решения задачи нам необходимо два этапа: правильно идентифицировать кодировку (в случае с Эвотор это практически всегда UTF-8) и выбрать инструмент для преобразования этих данных в понятный для 1С 7.7 вид. Рассмотрим наиболее эффективные способы решения этой задачи.

Способ 1. Использование объекта ADODB.Stream (Рекомендуемый)

Это самый гибкий и надежный метод, который не требует установки дополнительных компонент 1С, так как использует системные библиотеки Windows, присутствующие практически на любом компьютере. Объект ADODB.Stream позволяет открывать файл в одной кодировке и считывать его содержимое уже преобразованным в другую.

Разберем по шагам, как реализовать чтение файла через этот объект в коде 1С 7.7:


// Создаем объект для работы с потоком данных
Поток = СоздатьОбъект("ADODB.Stream");

// Устанавливаем тип данных - текстовый
Поток.Type = 2;

// Указываем исходную кодировку файла (для Эвотор это UTF-8)
Поток.Charset = "utf-8";

// Открываем поток и загружаем в него файл
Поток.Open();
Поток.LoadFromFile("C:\Evotor\export.csv");

// Читаем все содержимое файла в переменную
// Объект автоматически перекодирует данные в системную кодировку 1С
ВесьТекст = Поток.ReadText();

// Закрываем поток
Поток.Close();

Важный нюанс: использование свойства Charset со значением "utf-8" автоматически обрабатывает и скрывает метку BOM (те самые п»ї), поэтому в переменную ВесьТекст попадет уже "чистый" русский текст.

Способ 2. Предварительная конвертация через PowerShell

Если вы предпочитаете работать со стандартным объектом 1С Текст, можно выполнить предварительную конвертацию файла во временную копию с кодировкой Windows-1251. Для этого удобно использовать встроенный в Windows инструмент PowerShell. Это решение отлично подходит для автоматизации фоновых процессов.

Рассмотрим пример кода, который вызывает системную команду для перекодировки:


ПутьКФайлуUTF8 = "C:\temp\evotor_utf8.csv";
ПутьКФайлуANSI = "C:\temp\evotor_ansi.csv";

// Формируем команду для PowerShell
// Get-Content читает файл, а Set-Content записывает его в нужной кодировке
Команда = "powershell -Command ""Get-Content '" + ПутьКФайлуUTF8 + "' | Set-Content -Encoding String '" + ПутьКФайлуANSI + "'""";

// Выполняем команду скрыто
КомандаСистемы(Команда);

// Теперь можно читать файл стандартными средствами 1С
Текст = СоздатьОбъект("Текст");
Текст.Открыть(ПутьКФайлуANSI);
Для и=1 По Текст.КоличествоСтрок() Цикл
    Стр = Текст.ПолучитьСтроку(и);
    // Обработка строки...
КонецЦикла;

Проблема окончаний строк (LF против CRLF)

Выясним еще одну важную техническую деталь. Терминалы Эвотор работают под управлением операционной системы на базе Linux. В таких системах окончание строки обозначается только одним символом LF (код 10), в то время как Windows (и 1С 7.7) ожидают пару символов CR+LF (коды 13 и 10).

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


// Заменяем одиночные переводы строк Linux на стандарт Windows
ТекстДляОбработки = СтрЗаменить(ВесьТекст, Симв(10), Симв(13) + Симв(10));

// Если в файле уже были корректные переносы, могут возникнуть двойные CR
// На всякий случай нормализуем их
ТекстДляОбработки = СтрЗаменить(ТекстДляОбработки, Симв(13) + Симв(13), Симв(13));

Особенности разбора CSV от Эвотор

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

  1. Разделитель полей: Чаще всего используется точка с запятой (;) или запятая (,). Проверьте настройки выгрузки в личном кабинете Эвотор.
  2. Текстовые поля: Если название товара содержит разделитель (например, "Масло; 500г"), оно должно быть заключено в кавычки. Обычный метод СтрЗаменить(Стр, ";", Разделитель) здесь не сработает корректно.
  3. Регулярные выражения: Для сложного разбора CSV рекомендуем использовать объект VBScript.RegExp. Это позволит правильно разделять строки, учитывая кавычки внутри текста.

Резюме

Мы рассмотрели основные способы решения проблемы "непонятной кодировки" в 1С 7.7. Подведем итог: наиболее надежным и современным методом является использование ADODB.Stream, так как он позволяет обрабатывать кодировку прямо в оперативной памяти без создания промежуточных файлов. Если же вы сталкиваетесь с огромными файлами (более 100 МБ), рассмотрите вариант с предварительной конвертацией через PowerShell, чтобы не перегружать память старой платформы.

Помните, что корректная работа с данными начинается с правильного определения их формата. Увидев п»ї, вы теперь точно знаете, что перед вами UTF-8, и обладаете всеми инструментами для его прочтения.

← На главную