При выгрузке регламентированной отчетности (в частности, формы СЗВ-СТАЖ) из конфигурации «Зарплата и Кадры» на платформе 1С 7.7 пользователи и разработчики часто сталкиваются с проблемой: сформированный XML-файл в кодировке UTF-8 вместо русской кириллицы содержит поврежденные символы («крякозябры»). В то же время аналогичные файлы, выгруженные из современных конфигураций на платформе 1С 8, открываются и читаются без ошибок.
В этой статье мы разберем причины возникновения данной проблемы, проанализируем особенности работы платформы 1С 7.7 с Юникодом и рассмотрим практические способы исправления кодировки XML-файлов.
Проблема искажения кириллических символов при выгрузке отчетов из 1С 7.7 связана с несколькими ключевыми факторами:
ADODB.Stream в начало файла могут записываться служебные байты BOM (0xEF, 0xBB, 0xBF). Из-за этого сторонние XML-парсеры и приемные программы ПФР/Социального фонда считывают заголовок некорректно.Первым делом проверим параметры операционной системы, в которой запускается выгрузка 1С 7.7. Если текущая языковая раскладка или системная локаль установлена в английский язык, при буферизации текста и генерации файлов платформа может некорректно транслировать кириллицу.
Если выгрузка формируется с использованием объекта внешней компоненты (например, 1Cv77.DOMDocument или объекта типа XMLАнализатор), необходимо явно задать кодировку формируемого XML-документа при его создании.
Рассмотрим пример кода, в котором явно прописывается кодировка перед добавлением узлов:
XMLДанныеСЗВ = XMLАнализатор.СоздатьДокумент();
XMLДанныеСЗВ.Кодировка = "UTF-8";
Явное задание свойства Кодировка = "UTF-8" гарантирует, что объект парсера запишет соответствующий заголовок <?xml version="1.0" encoding="UTF-8"?> и применит правильную таблицу перекодировки при сохранении узлов на диск.
В случаях, когда типовой механизм выгрузки сохраняет файл в кодировке 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, который успешно пройдет все проверки в контролирующих органах.