Имя: Пароль:
1C
1С v8
МенеджерКриптографии и формат выходного файла ЭЦП - ???
0 MWWRuza
 
гуру
29.10.25
15:54
Добрый день!
Вообще-то я застарелый клюшечник, но, эта тема:
Где посмотреть значение атрибута КоличествоЕдиницУпотребления (для частичного выбытия)?
как-то "сподвигла меня на подвиги" :-)))
Решил написать нечто подобное тому, что у меня в рабочей конфе семерки, для типовых 8.Х...
И даже, что-то получилось:



С самим отчетом то особых проблем не возникло, работает.
Но, для доступа в ЧЗ требуется получить токен...
На скриншоте, токен полученный в 7.7, просто вставлен в соответствующее поле.
Алгоритм его получения мне понятен и в 7.7 я его успешно использую, а тут столкнулся с проблемой подписания строки данных.
В 7.7 я использую джава-скрипты и CadesCom... Все давно и успешно работает.
Думал, что в восьмерке будет проще - всетаки для работы с ЭЦП есть встроенные штатные объекты.
А оказалось - фигвам...
В принципе, получение нужного сертификата из хранилища винды, и само подписание - я освоил, и даже как-то работает.
НО!!! На выходе получается ЭЦП "не в том формате", как нужно ЧЗ... И ни какими параметрами изменить это не получается...

Сам фрагмент модуля:
&НаКлиенте
Функция ПодписатьСтроку(СтрокаДляПодписи, СертификатЭЦП, ТекстОшибки = "", Кодировка = "CESU-8") Экспорт
	ТекстОшибки = "";
	ИмяВремФайла = ПолучитьИмяВременногоФайла();
	Текст = Новый ЗаписьТекста(ИмяВремФайла, Кодировка);
	Текст.Записать(СтрокаДляПодписи);
	Текст.Закрыть();
	ИмяМодуля				= "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
	ТипМодуля				= 80;
	ПутьМодуля				= "";
	МенеджерКриптографии 	= Новый МенеджерКриптографии(ИмяМодуля, ПутьМодуля, ТипМодуля);
	АлгоритмПодписи 		= "GR 34.10-2012 256";
	АлгоритмХеширования	 = "GR 34.11-2012 256"; 
	МенеджерКриптографии.АлгоритмПодписи 		= АлгоритмПодписи;
	МенеджерКриптографии.АлгоритмХеширования	= АлгоритмХеширования;
	ИмВых		= СтрЗаменить(ИмяВремФайла, ".tmp", ".sig");
	ТипПодп 	= ПолТипПодписи();
	Попытка
		Результат =  МенеджерКриптографии.Подписать(ИмяВремФайла, ИмВых, СертификатЭЦП, ТипПодп);
		ЧтениеТекста = Новый ЧтениеТекста;  
		ЧтениеТекста.Открыть(ИмВых);  
		Подп = ЧтениеТекста.Прочитать();  
		ЧтениеТекста.Закрыть();  
	Исключение
		ТекстОшибки = ОписаниеОшибки();
	КонецПопытки;
	Попытка
		УдалитьФайлы(ИмяВремФайла);
		УдалитьФайлы(ИмВых);
	Исключение
	КонецПопытки;
	Возврат Подп;
КонецФункции // ПодписатьСтроку()

&НаКлиенте
Процедура ВыполнитьПослеВыбора(ИндВыбСтр, Пар2) Экспорт
	ИндМассСерт	= ИндВыбСтр;
	ВыбрСерт 	= СпСерт.Получить(ИндМассСерт);
	СтрИНН 		= СокрЛП(ИНН); 
	
	ПодпИНН		= ПодписатьСтроку(СтрИНН, ВыбрСерт);


КонецПроцедуры


На выходе получаю:



В семерке так:



Формат явно другой...
Но, что самое интересное - если оба файла сохранить и проверить ЭЦП с помощью "Инструментов КриптоПро", то подпись валидная! :-)))
Но, боюсь, что ЧЗ в таком виде ее не примет...
Как получить ЭЦП в правильном формате?

PS Похоже, в 7.7 ДжаваСкрипт возвращает ЭЦП в Basa64... А тут, просто бинарник... Можно попробовать закодировать готовый результат в Basa64... Но, чувствую, что есть какие-то другие решения... Использовать всякие БСП и прочее, не хочется... Уж слишком там заморочено все, не та задача.
1 timurhv
 
30.10.25
00:16
Для типовых лучше вклиниться в:
Оповещение = Новый ОписаниеОповещения("ОбработатьСообщения_ПриЗавершенииОперацииПодписи", ЭтотОбъект);
ОбменДаннымиИСМПКлиент.Подписать(*)
Плюс дополнить
ОбменДаннымиИСМПКлиент.ПодписатьЗавершение

Либо скопировать в свой общий модуль и сделать по аналогии без параметров лишних.


Для самописок без БСП в документации True API:
"Пример получения токена при авторизации с прикрепленной подписью / подписание документов с открепленной подписью на 1С"
2 timurhv
 
30.10.25
00:20
+ "CESU-8" может из-за этого ошибка отображения
3 MWWRuza
 
гуру
30.10.25
02:20
(1) Ага...
Это видел:
"Для самописок без БСП в документации True API:
"Пример получения токена при авторизации с прикрепленной подписью / подписание документов с открепленной подписью на 1С""
Но, это по сути то-же самое, что у меня в 7.7 - через CADESCOM, просто там из-за некоторых ограничений приходится Java скрипты использовать, тут можно напрямую с данными работать...
Если совсем не получится со штатным объектом "МенеджерКриптографии", то конечно переделаю на CADESCOM, не проблема... Если в клюшках заставил работать через него, тут тем более должно получиться. Но, как-то странно штатный объект работает.
Может в этом проблема - "// ТекстДляПодписи должен быть в Base64"...
Как-то я про это не подумал, подписываю строку ИНН, а там, как я подумал не критично, так, как только цифры... Но, х.з., надо попробовать...
4 MWWRuza
 
гуру
30.10.25
02:45
Попробовал перед подписанием закодировать ИНН в Basa64... Да, конечно это получается далеко не строка цифр.
Но, на выходе подпись в таком-же формате...
ЧЗ не понимает такой формат, проверил.
Сам запрос токена отрабатывает, если ему подсунуть правильную ЭЦП из файла, токен прилетает.
И если закодировать готовую ЭЦП после МенеджераКриптографии в Basa64, файл становится визуально похожим на правильный, но ЧЗ с ним 403 возвращает, подпись не валидна...
5 ProxyInspector
 
30.10.25
08:07
Сталкивался, когда
ЗаписьТекста(ИмяВремФайла, Кодировка) добавляет BOM в файл.
Создай файл в блокноте со строкой ИНН, посмотри размер. Потом  через ЗаписьТекста() с этой же строкой. Вероятнее всего размер будет другой.
Закон Брукера: Даже маленькая практика стоит большой теории.