Почему файлы из 1С 7.7 сохраняются в неверной кодировке и как принудительно задать Windows-1251

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

Проблема некорректной кодировки при выгрузке данных из 1С:Предприятие 7.7 на современных операционных системах (Windows 10 и 11) является классической. Пользователи часто сталкиваются с тем, что стандартный объект Текст ведет себя непредсказуемо: один файл записывается в нормальной кириллице (Windows-1251), другой — в западноевропейской кодировке (Windows-1252), а третий и вовсе может быть распознан как иврит (Windows-1255). В этой статье мы подробно разберем, почему это происходит и как обеспечить стабильную работу выгрузки.

Анализ причин: почему "дурит" объект Текст

Разберем по шагам механизмы, которые приводят к искажению данных. Основная проблема заключается в том, что 1С 7.7 была разработана в эпоху, когда Unicode еще не был стандартом де-факто, и программа работает через системную кодовую страницу ANSI (ACP).

  1. Зависимость от раскладки клавиатуры. Проанализируем интересный факт: в некоторых случаях Windows при преобразовании строки из внутреннего представления в однобайтовую кодировку ориентируется на текущую активную раскладку клавиатуры. Если в момент записи файла у пользователя или системного процесса установлена раскладка EN, система может применить кодовую страницу 1252. Если RU — то 1251.
  2. Эвристическое определение кодировки (угадывание). Это самая частая причина "ложных срабатываний". Рассмотрим ситуацию: если в текстовом файле содержатся только латинские буквы, цифры и знаки пунктуации (символы с кодами от 0 до 127), то такой файл будет абсолютно идентичен для кодировок Windows-1251, Windows-1252 и многих других. Программы для просмотра (например, Far Manager или Notepad++) используют алгоритмы "угадывания". Если в тексте нет специфических русских букв, анализатор может ошибочно пометить файл как Windows-1252.
  3. Влияние системных настроек Windows 10. В современных версиях Windows появилась настройка "Бета-версия: Использовать Unicode (UTF-8) для поддержки языков во всем мире". Если эта опция включена, системная кодовая страница ACP подменяется на 65001 (UTF-8). Для старых приложений, таких как 1С 7.7, это критично: объект Текст начинает записывать данные в формате, который внешние системы не могут прочитать как привычный ANSI.

Способ 1. Настройка системного реестра и региональных стандартов

Прежде чем менять код, проверим настройки операционной системы. Это фундаментальный шаг для корректной работы 1С 7.7.

Рассмотрим порядок действий в реестре:

  1. Откроем редактор реестра (regedit.exe).
  2. Перейдем в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage.
  3. Найдем параметр ACP. Его значение должно быть 1251.
  4. Найдем параметр OEMCP. Его значение должно быть 866.

Также обязательно проверим региональные настройки: Панель управления — Региональные стандарты — Дополнительно — Язык программ, не поддерживающих Юникод. Там должен быть выбран "Русский (Россия)", а галочка "Использовать Unicode (UTF-8)" должна быть снята.

Способ 2. Использование FileSystemObject (FSO)

Если стандартный объект Текст продолжает работать нестабильно, мы можем воспользоваться системной библиотекой Scripting.FileSystemObject. Она позволяет более гибко управлять созданием файлов, хотя также сильно зависит от системных настроек ANSI.

Посмотрим на пример кода для записи файла через FSO:


// Создание объекта для работы с файловой системой
ФСО = СоздатьОбъект("Scripting.FileSystemObject");
// Создаем текстовый файл (Путь, Перезаписывать=Истина, Юникод=Ложь)
ТекстФайл = ФСО.CreateTextFile(СокрП(Константа.КаталогФТПСервера) + "\" + НЗП.НомерДок + ".onec", -1, 0);
// Записываем строку
ТекстФайл.WriteLine(Стр);
// Закрываем файл
ТекстФайл.Close();

Важно: Третий параметр метода CreateTextFile равен 0, что означает запись в формате ANSI. Если установить -1, файл будет записан в Unicode (UTF-16 LE), что 1С 7.7 обычно не требуется для обмена данными.

Способ 3. Гарантированная запись через ADODB.Stream

Если вам нужно жестко и программно задать кодировку, не полагаясь на раскладку клавиатуры или "настроение" Windows, лучшим решением будет использование объекта ADODB.Stream. Этот метод позволяет явно указать windows-1251.

Разберем этот программный метод по шагам:


// Создаем объект потока
Поток = СоздатьОбъект("ADODB.Stream");
// Устанавливаем тип данных - текст
Поток.Type = 2; 
// Явно задаем нужную нам кодировку
Поток.Charset = "windows-1251";
// Открываем поток
Поток.Open();
// Записываем нашу строку в поток
Поток.WriteText(Стр);
// Сохраняем содержимое потока в файл (Путь, Режим: 2 = Создать или перезаписать)
Поток.SaveToFile(СокрП(Константа.КаталогФТПСервера) + "\" + НЗП.НомерДок + ".onec", 2);
// Закрываем поток
Поток.Close();

Этот способ является самым надежным, так как он полностью исключает влияние эвристических алгоритмов системы при записи. Принимающая сторона получит файл именно в той кодировке, которую вы указали в свойстве Charset.

Диагностика проблемы: проверка кодов символов

Если вы сомневаетесь, правильно ли записан файл, или подозреваете, что ваш редактор (например, Far Manager) вас обманывает, можно выполнить проверку реальных кодов символов в файле. Выясним причину искажений, проанализировав десятичные коды байтов.

Ниже приведен скрипт (VBScript), который можно сохранить как check.vbs и запустить для анализа файла. Он выведет таблицу кодов символов:


Set Fso = CreateObject("Scripting.FileSystemObject")
' Открываем файл для чтения (параметр 0 - путь к файлу)
Set r = Fso.OpenTextFile("C:\temp\yourfile.onec", 1, False, False)
' Создаем лог-файл с результатами
Set w = Fso.CreateTextFile("C:\temp\result.txt", True)
q = 0
Do While Not r.AtEndOfStream
    s = r.Read(1)
    k = Asc(s) ' Получаем ASCII код символа
    w.Write k & vbTab
    q = q + 1
    If q >= 16 Then
        w.Write vbCrLf
        q = 0
    End If
Loop
w.Close
r.Close
MsgBox "Анализ завершен. Результаты в result.txt"

Как интерпретировать результат: если вы видите коды в диапазоне 192–255, значит, русские буквы записаны в кодировке Windows-1251. Если же вместо русских букв вы видите коды других диапазонов (например, символ Ê имеет код 202, тогда как русская К в 1251 имеет код 202, но при открытии в 1252 она превращается в Ê), это подтверждает проблему несовпадения кодовых страниц при чтении или записи.

Итоги и рекомендации

Проанализировав ситуацию, мы пришли к следующим выводам:

Используя эти методы, вы сможете добиться стабильной работы ваших обработок выгрузки и навсегда забыть о "кракозябрах" в текстовых файлах.

← На главную