22.01.2018 23:37
MWWRuza
 
Доброе время суток!
Есть на ИнфоСтарте вот такая разработка, ищется по названию: "Подписываем и шифруем алкогольные декларации (опт и розница) прямо в 1С 7.7" - ссылку вставить не дает форум.
Очень интересно, захотел встроить в свою конфу, но... Не работает! Точнее, работает, но, как-то не правильно... В обсуждении подробно описано. Автор пропал, как и не было. Создал на Мисте тему, вот, название "Подпись декларации в 1С 7.7 с помощью CapiCom, JS-скрипт..." , пытался разобраться... Бесполезно...
Интересно, у нас кто-нибудь занимался чем-нибудь подобным?
В кратце - после подписания(до шифрования!) файл становится не читаемым... Пробовал и через js-скрипт, и через vb-скрипт, все одно... Такое чувство, что что-то с кодировкой подписи.
Кому интересна тема, посмотрите плиз...

Если кого-то заинтересует, то все, что надо перенесу сюда, а нет... Ну... И ладно.
26.01.2018 13:06
MWWRuza
 
С помощью коллег с Мисты разобрался... В принципе, обработка в исходном виде, как скачана с ИнфоСтарта, подписывает и шифрует правильно. Но, сохраняет файлы с BOM(Byte order mark), первые два символа с кодами 254 и 255. Если просматривать файлы например FAR-ом, то первые символы файла выглядят как "юя", а должно начинаться с "0". Может быть ФСРАРовский сайт и проглотит такие файлы, не знаю, не пробовал. Но, тот-же КриптоАРМ вываливается с ошибкой "Неверный формат". Экспериментировать с подачей таких файлов в РАР возможности уже не было, пока разбирался, декларации уже все сдали.
Поэтому, на будущее, решил разобраться, как записывать файлы без BOM.

Тут два варианта:

1. Написал универсальную функцию, которая вырезает эти символы из готовых файлов, код на VBS такой:

|Set objFSO = CreateObject(""Scripting.FileSystemObject"")
|Set writer = CreateObject(""Adodb.Stream"")
|Set reader = CreateObject(""Adodb.Stream"")
|reader.Open
|reader.LoadFromFile OutFileName
|writer.Mode=3
|writer.Type=1
|writer.Open
|reader.position=2
|reader.copyto writer,-1
|writer.SaveToFile OutFileName,2
|Set writer = Nothing
|Set reader = Nothing

Добавляется в конец функций подписи и шифрования. Работает нормально, КриптоАРМ открывает, расшифровывает(если конечно свой сертификат в получатели добавить), снимает подпись и сохраняет файл в исходном виде.

2. Вариант 2, более простой и красивый, предложил коллега NorthWind с Мисты:
Данные после подписи или шифрования преобразуем в массив байтов методом самого CAPICOM - BinaryStringToByteArray объекта Utilities, и потом записываем в файл как бинарный поток.
Вот код JS-скрипта шифрования, в подписи надо сделать аналогично:

Код = "function CryptFile(FileName,Recipients,OutFileName)
|{
| InStream=new ActiveXObject(""ADODB.Stream"");
| InStream.Type=1; // binary data
| InStream.Mode=3; // read/write
| InStream.Open();
| InStream.LoadFromFile(FileName);
| InData=InStream.Read(-1);
|
| EnvelopedData=new ActiveXObject(""CAPICOM.EnvelopedData"");
| EnvelopedData.Content=InData;
| for (var i=1; i<=Recipients.Count; i++) {EnvelopedData.Recipients.Add(Recipients.Item(i));}
| OutEnvelopedData=EnvelopedData.Encrypt(1);
|
| Util = new ActiveXObject(""CAPICOM.Utilities"");
| BinArr = Util.BinaryStringToByteArray(OutEnvelopedData);
|
| OutStream=new ActiveXObject(""ADODB.Stream"");
| OutStream.Type=1; // binary data
| OutStream.Mode=3; // read/write
| OutStream.Open();
| OutStream.Write(BinArr);
| OutStream.SaveToFile(OutFileName,2);
| OutStream.Close();
|
| return(0);
|}
|";

После этого, тоже все красиво читается, расшифровывается КриптоАРМом и т.д.

PS Вполне возможно, что это все не обязательно, и ФСРАР проглотил бы файлы и с BOM, но, как-то так красивее и приятнее... В конце концов, тот-же рекомендованый ФСРАРом КриптоАРМ и другие программы пишут файлы без BOM, значит так будет правильнее.

PS Если кого-то заинтересовало, пишите, расскажу подробнее. Саму обработку не выкладываю, не имею морального права, так, как она на ИнфоСтарте за СтартМани распространяется.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.