Проблема некорректной кодировки при выгрузке данных из 1С:Предприятие 7.7 на современных операционных системах (Windows 10 и 11) является классической. Пользователи часто сталкиваются с тем, что стандартный объект Текст ведет себя непредсказуемо: один файл записывается в нормальной кириллице (Windows-1251), другой — в западноевропейской кодировке (Windows-1252), а третий и вовсе может быть распознан как иврит (Windows-1255). В этой статье мы подробно разберем, почему это происходит и как обеспечить стабильную работу выгрузки.
Разберем по шагам механизмы, которые приводят к искажению данных. Основная проблема заключается в том, что 1С 7.7 была разработана в эпоху, когда Unicode еще не был стандартом де-факто, и программа работает через системную кодовую страницу ANSI (ACP).
EN, система может применить кодовую страницу 1252. Если RU — то 1251.ACP подменяется на 65001 (UTF-8). Для старых приложений, таких как 1С 7.7, это критично: объект Текст начинает записывать данные в формате, который внешние системы не могут прочитать как привычный ANSI.Прежде чем менять код, проверим настройки операционной системы. Это фундаментальный шаг для корректной работы 1С 7.7.
Рассмотрим порядок действий в реестре:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage.Также обязательно проверим региональные настройки: Панель управления — Региональные стандарты — Дополнительно — Язык программ, не поддерживающих Юникод. Там должен быть выбран "Русский (Россия)", а галочка "Использовать Unicode (UTF-8)" должна быть снята.
Если стандартный объект Текст продолжает работать нестабильно, мы можем воспользоваться системной библиотекой Scripting.FileSystemObject. Она позволяет более гибко управлять созданием файлов, хотя также сильно зависит от системных настроек ANSI.
Посмотрим на пример кода для записи файла через FSO:
// Создание объекта для работы с файловой системой
ФСО = СоздатьОбъект("Scripting.FileSystemObject");
// Создаем текстовый файл (Путь, Перезаписывать=Истина, Юникод=Ложь)
ТекстФайл = ФСО.CreateTextFile(СокрП(Константа.КаталогФТПСервера) + "\" + НЗП.НомерДок + ".onec", -1, 0);
// Записываем строку
ТекстФайл.WriteLine(Стр);
// Закрываем файл
ТекстФайл.Close();
Важно: Третий параметр метода CreateTextFile равен 0, что означает запись в формате ANSI. Если установить -1, файл будет записан в Unicode (UTF-16 LE), что 1С 7.7 обычно не требуется для обмена данными.
Если вам нужно жестко и программно задать кодировку, не полагаясь на раскладку клавиатуры или "настроение" 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 она превращается в Ê), это подтверждает проблему несовпадения кодовых страниц при чтении или записи.
Проанализировав ситуацию, мы пришли к следующим выводам:
Текст в 1С 7.7 слишком сильно зависит от настроек окружения (ACP и раскладки).Текст в пользу ADODB.Stream.Используя эти методы, вы сможете добиться стабильной работы ваших обработок выгрузки и навсегда забыть о "кракозябрах" в текстовых файлах.