Меняем кодировку файла на UTF-8 (для СЗВ-СТАЖ)

В ЗиК 7.7 при выгрузке СЗВ-СТАЖ для перевода кодировки файла в UTF-8 используется COM-объект ADODB.Stream.
У клиентов при работе с ним 1С полностью вылетала. Здесь приведён скрипт изменения кодировки файла на PowerShell и способ изменения выгрузки в ЗиК 7.7.

Старые клиенты обратились с проблемой: не выгружается СЗВ-Стаж. При выгрузке процесс доходил до конца и в конце программа просто вылетала с ошибкой.

При детальном разборе выяснилось, что файл выгружается нормально в кодировке Windows-1251. Затем производится конвертация в кодировку UTF-8 при помощи COM-объекта ADODB.Stream. Вот самый конец функции ФайлСЗВ_СТАЖ() в модуле Отчет.ПодготовкаСведенийДляПФР2024:

АдоДБСтрим = CreateObject("Adodb.Stream");
АдоДБСтрим.Charset="windows-1251";
АдоДБСтрим.Type = 2;
АдоДБСтрим.Mode= 3;
АдоДБСтрим.Open();
АдоДБСтрим.LoadFromFile(ПолноеИмяФайла);
ТекстАдоДБСтрим = АдоДБСтрим.ReadText();
АдоДБСтрим.Close();
АдоДБСтрим.Charset = "utf-8";
АдоДБСтрим.Open();
АдоДБСтрим.WriteText(ТекстАдоДБСтрим);
АдоДБСтрим.SaveToFile(ПолноеИмяФайла, 2);
АдоДБСтрим.Close();

На этом коде программа просто вылетала. Принял решение заменить это на запуск скрипта PowerShell. В PS изменение кодировки можно сделать так:

$WithBOM = $false
$enc1251 = [System.Text.Encoding]::GetEncoding(1251)
$encUTF8 = New-Object System.Text.UTF8Encoding($WithBOM)

$reader = New-Object -TypeName System.IO.StreamReader -ArgumentList $Source,$enc1251
$writer = New-Object -TypeName System.IO.StreamWriter -ArgumentList $Destination,$encUTF8

while ($true) {
$line = $reader.ReadLine()
if ($line -eq $null) {
break
}
$writer.WriteLine($line)
}
$reader.Close()
$writer.Close()

Написал скрипт, положил его в папку, прописанную в Path, добавил код вызова в 1С вместо указанного выше кода:

ЗапуститьПриложение("powershell.exe -ExecutionPolicy Bypass ""& ChangeEncoding.ps1 '" + ПолноеИмяФайла + "'""");

и всё заработало, клиент доволен.

У клиента Windows 7. PowerShell не обновлял, думаю, что древний, так что требования в этом смысле минимальные.

P. S. Если кто в курсе, почему может возникать такая ошибка при использовании ADODB.Stream — прошу в комменты.

3 Comments

  1. sashocq

    Ещё вчера на моём же компьютере ошибка воспроизводилась. Сегодня хотел скриншот ошибки сделать, но ADODB.Stream отработала успешно. Чудеса

    Reply
  2. jack19

    (1) Могли бы взглянуть на последние темы форума и увидеть, что проблема решена

    https://forum.infostart.ru/forum68/topic185589/

    Reply
  3. sashocq

    (2) Искал. Видимо, плохо, или как-то не так.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *