Как исправить некорректную кодировку (крякозябры) при выгрузке СЗВ-СТАЖ в XML из 1С 7.7?

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

При выгрузке регламентированной отчетности (в частности, формы СЗВ-СТАЖ) из конфигурации «Зарплата и Кадры» на платформе 1С 7.7 пользователи и разработчики часто сталкиваются с проблемой: сформированный XML-файл в кодировке UTF-8 вместо русской кириллицы содержит поврежденные символы («крякозябры»). В то же время аналогичные файлы, выгруженные из современных конфигураций на платформе 1С 8, открываются и читаются без ошибок.

В этой статье мы разберем причины возникновения данной проблемы, проанализируем особенности работы платформы 1С 7.7 с Юникодом и рассмотрим практические способы исправления кодировки XML-файлов.

Выясним причину проблемы

Проблема искажения кириллических символов при выгрузке отчетов из 1С 7.7 связана с несколькими ключевыми факторами:

  1. Ограничения платформы 1С 7.7: Внутренние механизмы 1С 7.7 работают с кодовой страницей Windows-1251 (ANSI) или OEM-866. Встроенный язык платформы не имеет прямой нативной поддержки формирования файлов в UTF-8.
  2. Проблема байтовой метки BOM (Byte Order Mark): При конвертации файла из 1251 в UTF-8 средствами Windows или системного объекта ADODB.Stream в начало файла могут записываться служебные байты BOM (0xEF, 0xBB, 0xBF). Из-за этого сторонние XML-парсеры и приемные программы ПФР/Социального фонда считывают заголовок некорректно.
  3. Системные региональные стандарты: Если в операционной системе Windows для программ, не поддерживающих Юникод (Non-Unicode programs), выбран языковой стандарт, отличный от русского, системные функции преобразования возвращают ошибочные таблицы символов.

Способ 1. Проверка системного языка в Windows

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

  1. Откроем Панель управления Windows и перейдем в раздел Региональные стандарты.
  2. На вкладке Дополнительно найдем параметр Язык программ, не поддерживающих Юникод.
  3. Убедимся, что там выставили Русский (Россия).
  4. Проверим, что опция «Использовать Unicode UTF-8 для поддержки языков во всем мире (Beta)» отключена, так как она может вызывать сбои в работе старых версий 1С.

Способ 2. Установка кодировки в параметрах XML-анализатора

Если выгрузка формируется с использованием объекта внешней компоненты (например, 1Cv77.DOMDocument или объекта типа XMLАнализатор), необходимо явно задать кодировку формируемого XML-документа при его создании.

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


XMLДанныеСЗВ = XMLАнализатор.СоздатьДокумент();
XMLДанныеСЗВ.Кодировка = "UTF-8";

Явное задание свойства Кодировка = "UTF-8" гарантирует, что объект парсера запишет соответствующий заголовок <?xml version="1.0" encoding="UTF-8"?> и применит правильную таблицу перекодировки при сохранении узлов на диск.

Способ 3. Перекодирование файла с помощью ADODB.Stream

В случаях, когда типовой механизм выгрузки сохраняет файл в кодировке Windows-1251, его можно програмно перекодировать в UTF-8 перед отправкой. Для этого используют COM-объект ADODB.Stream.

Разберем по шагам алгоритм чтения текста и пересохранения его в правильном формате:


ИмяФайла = КаталогПользователя() + "СЗВ_СТАЖ.xml";

// Создаем объект для работы с текстовым потоком
АдоДБСтрим = CreateObject("Adodb.Stream");
АдоДБСтрим.Charset = "utf-8";
АдоДБСтрим.Type = 2; // Текстовый режим
АдоДБСтрим.Mode = 3; // Режим чтения и записи
АдоДБСтрим.Open();

// Загружаем сформированный файл
АдоДБСтрим.LoadFromFile(ИмяФайла);
ТекстАдоДБСтрим = АдоДБСтрим.ReadText();
АдоДБСтрим.Close();

Для гарантированного исключения служебной метки BOM (Byte Order Mark) при сохранении через ADODB.Stream рекомендуется переключить поток в бинарный режим и пропустить первые три байта:


// Создаем поток для чтения в 1251
ПотокВход = CreateObject("Adodb.Stream");
ПотокВход.Type = 2;
ПотокВход.Charset = "windows-1251";
ПотокВход.Open();
ПотокВход.LoadFromFile(ИмяФайла);

// Читаем текст
ТекстФайла = ПотокВход.ReadText();
ПотокВход.Close();

// Заменяем заголовок кодировки в самом XML, если необходимо
ТекстФайла = СтрЗаменить(ТекстФайла, "encoding=""windows-1251""", "encoding=""UTF-8""");
ТекстФайла = СтрЗаменить(ТекстФайла, "encoding=""ANSI""", "encoding=""UTF-8""");

// Записываем в UTF-8
ПотокВыход = CreateObject("Adodb.Stream");
ПотокВыход.Type = 2;
ПотокВыход.Charset = "utf-8";
ПотокВыход.Open();
ПотокВыход.WriteText(ТекстФайла);

// Сдвигаем позицию на 3 байта для удаления BOM
ПотокВыход.Position = 0;
ПотокВыход.Type = 1; // Переключаем в бинарный режим
ПотокВыход.Position = 3; // Пропускаем байты EF BB BF

ПотокДвоичный = CreateObject("Adodb.Stream");
ПотокДвоичный.Type = 1;
ПотокДвоичный.Open();
ПотокВыход.CopyTo(ПотокДвоичный);

// Сохраняем итоговый файл без BOM
ПотокДвоичный.SaveToFile(ИмяФайла, 2);

ПотокВыход.Close();
ПотокДвоичный.Close();

Применив описанные способы настройки локали и перекодирования файла, мы получим корректный XML-документ отчета СЗВ-СТАЖ в кодировке UTF-8, который успешно пройдет все проверки в контролирующих органах.

← На главную