Подпись для 1С 7.7-8.3 (CAPICOM vs CAdESCOM) под х64 ОС

04.11.24

Разработка - Инструментарий разработчика

1. Подпись для 1с 7.7 (CAPICOM vs CAdESCOM) под х64 ОС. 2. Подпись для 1с 8.3 CAdESCOM под х64 ОС.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Подпись 1с 7.7 CAPICOM
.ert 51,50Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.
Подпись 1с 8.3 CAdESCOM
.epf 9,09Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Подпись для 1с 7.7 (CAPICOM vs CAdESCOM) под х64 ОС.

  Для решения ряда проблем с библиотеками в рамках платформы 1с 7.7 представлен вариант обработки для подписи (формирования сигнатуры ) сообщений. Signature — электронная подпись в формате CMS SignedData в DER-кодировке. Тесты проводились на клиентском ПК с ОС Win10 x64 и настройками ключа ЭЦП под работу в ЛК операторов ЭДО и сервисов ГИСМТ, КриптоПро SCP 5.0.13000 КС1. Принципиально было добиться работы CAPICOM в данном окружении, заявленный как устаревший элемент управления, но по факту он под капотом у CAdESCOM. CAdESCOM же в свою очередь в тех же условиях настроенной ОС не выводит списка сертификатов, ошибка на этапе открытия CAdESCOM.Store, решено взять рабочие примеры с использование JavaScript из 1с 8.х. В скриптах модифицирован возврат xbase64 строки в код обработки, для более простого переброса в тело запросов, требующих сигнатуру представить в данной кодировке. функция для кодирования в xbase64, может быть заменен на встроенную в CAPICOM.Utilities.Base64Encode(Str), вмеcто использования объекта CDO.Message. В обработку так же включен пример отправки сообщения XML через HTTP API c добавленной сигнатурой. Отмечу, что саму сигнатуру после сохранения в файл *.sig можно проверить инструментом криптопро cptools.

пример формирования подписи/сигнатуры (фрагмент):

Функция Base64Encoder(ИмяФайла) 	
	CDO=СоздатьОбъект("CDO.Message");
	Attachment=CDO.AddAttachment(ИмяФайла);
    Attachment.ContentTransferEncoding="base64";
    Стр=Attachment.GetEncodedContentStream(); 	
    Возврат Стр.ReadText(); 
КонецФункции   

Функция ПодписатьФайл(ИмяФайла,ВыбСертификат,ИмяВыхФайла)    
	
	сообщить(ИмяФайла);
	
	Попытка
		JS=СоздатьОбъект("MSScriptControl.ScriptControl");
		JS.Language="javascript";		
	Исключение
		ТекстОшибки=ОписаниеОшибки();
		Сообщить("Не удалось создать объект MSScriptControl.ScriptControl","!");
		Сообщить("Описание ошибки: "+ТекстОшибки,"!");
		Возврат 0;
	КонецПопытки;
	
	Попытка
		
		СтрКода="function SignFile(FileName,Cert,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);		
		|   Signer=new ActiveXObject(""CAPICOM.Signer"");
		|   Signer.Certificate=Cert;
		|   Signer.Options=2; 
		|   SignedData=new ActiveXObject(""CAPICOM.SignedData""); 	
		|   SignedData.Content=InData;		
		|   OutSignedData=SignedData.Sign(Signer,1,0);	        
		|
		|   OutStream=new ActiveXObject(""ADODB.Stream""); 	
		|   OutStream.Charset = ""ASCII"";
		|   OutStream.Open();                      
		|   OutStream.Type=2; // text data
		|   OutStream.WriteText(OutSignedData);				
		|   OutStream.SaveToFile(OutFileName,2);
		|   OutStream.Close();
		|
		| return(OutSignedData);
		|}
		|";
	
	JS.AddCode(СтрКода);
	Рез=JS.Modules("Global").CodeObject.SignFile(ИмяФайла,ВыбСертификат,ИмяВыхФайла);
	сообщить(лев(Рез,255));
	Исключение
		ТекстОшибки=ОписаниеОшибки();
		Сообщить("Произошла ошибка при подписи файла!","!");
		Сообщить("Описание ошибки: "+ТекстОшибки,"!");
		Возврат 0;
	КонецПопытки;
	Возврат Рез;
КонецФункции

функция ПодписьФайла(ПутьКФайлу,ПоказыватьНастройки=1)	
	
	ПравильноеЧислоПолучателей=1;
	ИмяНастроек="Подпись_";	
	
	// CAPICOM constants
	CAPICOM_CURRENT_USER_STORE=2;
	CAPICOM_MY_STORE="My";	
	CAPICOM_STORE_OPEN_READ_ONLY=0;
	CAPICOM_CERTIFICATE_FIND_TIME_VALID=9;      
	
	ТекДата=ТекущаяДата();
	
	СохранённыйОтпечатокСертификата="";
	
	// восстанавливаем настройки
	Попытка
		НастройкиПодписи=ВосстановитьЗначение(ИмяНастроек);
		Если ТипЗначенияСтр(НастройкиПодписи)="СписокЗначений" Тогда
			СохранённыйОтпечатокСертификата=НастройкиПодписи.Получить("ОтпечатокСертификата");		
		КонецЕсли;
	Исключение
		
	КонецПопытки;
	
	СписокНашихСертификатов=СоздатьОбъект("СписокЗначений");
	
	ВыбСертификатЭЦП="";
	
	Попытка
		
		Store         = CreateObject("CAPICOM.Store"); 
		//comCPSigner   = CreateObject("CAPICOM.Signer"); 
    	//comSignedData = CreateObject("CAPICOM.SignedData");   
		
		//Store         = CreateObject("CAdESCOM.Store");
		//comCPSigner   = CreateObject("CAdESCOM.CPSigner"); 
    	//comSignedData = CreateObject("CAdESCOM.CadesSignedData");  
				
		CURRENT_USER_STORE = 2;                                       
	    MY_STORE = "My";  
	    STORE_OPEN_READ_ONLY = 0;
	    //Store.Open(CURRENT_USER_STORE, MY_STORE, STORE_OPEN_READ_ONLY);
	
		Store.Open(CAPICOM_CURRENT_USER_STORE,CAPICOM_MY_STORE,CAPICOM_STORE_OPEN_READ_ONLY);
		Certs=Store.Certificates;
		ValidCerts=Certs.Find(CAPICOM_CERTIFICATE_FIND_TIME_VALID,ТекущаяДата(),-1);
		Для CertNum=1 По ValidCerts.Count Цикл
			CurCert=ValidCerts.Item(CertNum);
			Thumbprint   =CurCert.Thumbprint;
			SerialNumber =CurCert.SerialNumber;
			SubjectName  =CurCert.SubjectName;
			ValidFromDate=CurCert.ValidFromDate;
			ValidToDate  =CurCert.ValidToDate;
			
			ПредставлениеСертификата=ПолучитьПредставлениеСертификата(SubjectName);
			ПредставлениеСертификата=ПредставлениеСертификата+", с "+Формат(ValidFromDate,"Д ДДММГГГГ")+" по "+Формат(ValidToDate,"Д ДДММГГГГ");
			СписокНашихСертификатов.ДобавитьЗначение(CurCert,ПредставлениеСертификата);
			Если (Thumbprint=СохранённыйОтпечатокСертификата) Тогда
				ВыбСертификатЭЦП = CurCert;
				
				//comCPSigner.Certificate = ВыбСертификатЭЦП;
    			//comCPSigner.Options = 2;     				                          											
				 
				//comSignedData.Content = СодержимоеФайла;
				
				//ПодписанныеДанные = comSignedData.Sign(comCPSigner, 1, 0);   
				//ПодписанныеДанные = comSignedData.SignCades(comCPSigner, 1, "true", );
														
				ПодписанныеДанные = ПодписатьФайл(ПутьКФайлу, ВыбСертификатЭЦП, ПутьКФайлу+".sig");
				
				//сообщить(лев(ПодписанныеДанные,250));
				
				возврат ПодписанныеДанные;
									
			КонецЕсли;
			
		КонецЦикла;
	Исключение
		ТекстОшибки=ОписаниеОшибки();
		Сообщить("Произошла ошибка при работе с хранилищем сертификатов! (Возможно, не установлен модуль CAPICOM)","!");
		Сообщить("Описание ошибки: "+ТекстОшибки,"!");
		Возврат 0;
	КонецПопытки;

конецфункции

Подпись для 1с 8.3 (CAPICOM vs CAdESCOM) под х64 ОС.

  Реализация подписи для 8ки обратная версии 7.7, драйвер CAPICOM по дефолту х32 и как правило установленная 1с платформа х64 его не видит. Переключаемся на CAdESCOM инсталлированием драйвера cadescom-x64.msi, т.к одних настроек под работу в ЛК ЭДО не достаточно. В отличии от 7ки скрипты можно не использовать и вызвать методы подписи из com-объекта. Из минусов такой реализации сигнатура при сохранении не подлежит проверке в криптопро cptools, и сохранение в файл *.sig выполнено аналогично через "ADODB.Stream" com-объект.

   пример подписи 8.х (фрагмент):

функция ПодписьФайла(СодержимоеФайла)
			   			
	Попытка
		// CAPICOM constants
		//CAPICOM_CURRENT_USER_STORE=2;
		//CAPICOM_MY_STORE="My";
		//CAPICOM_STORE_OPEN_READ_ONLY=0;
		CAPICOM_CERTIFICATE_FIND_TIME_VALID=9;  
		
		//Store         = Новый COMОбъект("CAPICOM.Store"); 
		//comCPSigner   = Новый COMОбъект("CAPICOM.Signer"); 
		//comSignedData = Новый COMОбъект("CAPICOM.SignedData");        
		
		//Store.Open(CAPICOM_CURRENT_USER_STORE,CAPICOM_MY_STORE,CAPICOM_STORE_OPEN_READ_ONLY);
		
		Store         = Новый COMОбъект("CAdESCOM.Store");
		comCPSigner   = Новый COMОбъект("CAdESCOM.CPSigner"); 
		comSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");  
				
		CURRENT_USER_STORE = 2;                                       
		MY_STORE = "My";  
		STORE_OPEN_READ_ONLY = 0;                                      
		
		Store.Open(CURRENT_USER_STORE, MY_STORE, STORE_OPEN_READ_ONLY);			
		
		Certs=Store.Certificates;
		ValidCerts=Certs.Find(CAPICOM_CERTIFICATE_FIND_TIME_VALID,ТекущаяДата(),-1);
		Для CertNum=1 По ValidCerts.Count Цикл
			CurCert      =ValidCerts.Item(CertNum);
			Thumbprint   =CurCert.Thumbprint;
			SerialNumber =CurCert.SerialNumber;
			SubjectName  =CurCert.SubjectName;
			ValidFromDate=CurCert.ValidFromDate;
			ValidToDate  =CurCert.ValidToDate;
			
			сообщить(SerialNumber);
			
			Если SerialNumber="xxx" Тогда
				ВыбСертификатЭЦП = CurCert;
				
				comCPSigner.Certificate = ВыбСертификатЭЦП;
    			comCPSigner.Options = 2;     
				
				comSignedData.ContentEncoding = 1; 
				comSignedData.Content = СодержимоеФайла;
				
				//ПодписанныеДанные = comSignedData.Sign(comCPSigner, 1, 0); 
				ПодписанныеДанные = comSignedData.SignCades(comCPSigner, 1, "true", );
				
				//сообщить(лев(ПодписанныеДанные,250));				
				//Сообщить("Файл подписан!");

				возврат ПодписанныеДанные;
									
			КонецЕсли;
			
		КонецЦикла;
	Исключение
		ТекстОшибки=ОписаниеОшибки();
		Сообщить("Произошла ошибка при работе с хранилищем сертификатов! (Возможно, не установлен модуль CAPICOM)");
		Сообщить("Описание ошибки: "+ТекстОшибки);
		Возврат 0;
	КонецПопытки;
		
КонецФункции 

 

Проверено на следующих конфигурациях и релизах:

  • Управление торговлей, редакция 10.3, релизы 10.2.8.2
  • Управление торговлей, редакция 11, релизы 11.5.22.63

CAPICOM CAdESCOM Signature Сигнатура CMS SignedData

См. также

Оптовая торговля Розничная торговля ККМ ЭДО и ОФД Обмен с ГосИС Системный администратор Программист Оперативный учет 7.7 Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 1С:Комплексная 7.7 1С:Торговля и склад 7.7 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Платные (руб)

Поддерживаются новые ставки НДС 5% и 7% для УСН при продаже через ККТ. Подключение фискального регистратора к 1С 7.7 в режиме онлайн-кассы в соответствии с 54-ФЗ. Поддержка актуальных версий драйверов ККТ: ДТО 10 и ДТО 8 для Атол, 4.15, 5.16 для Штрих-М. Поддержка розничной продажи маркированной продукции (алкоголь, табак, обувь, лекарства, шины, одежда, белье, парфюмерия, молочная продукция, вода и пр.). Поддержка онлайн и офлайн (через Локальный Модуль ЧЗ) проверки маркировки в разрешительном режиме (РР).

2000 руб.

28.03.2017    496108    4643    3526    

2505

Файловый обмен (TXT, XML, DBF), FTP ЭДО и ОФД Программист Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 1С:Торговля и склад 7.7 1С:Упрощенное налогообложение 7.7 Россия Бухгалтерский учет Абонемент ($m)

Обмениваемся УПД (УКД) с различными контрагентами через 1С-Клиент ЭДО. А чтобы выгрузить УПД (УКД) из 7.7 в конфигурацию 1С-Клиент ЭДО , используем данную обработку, которая создает файл в формате XML, который можно импортировать в систему электронного документооборота. Для конфигурации "Бухгалтерский учет" (тестировалась на релизе 7.70.663) Для конфигурации "Упрощенная система налогообложения" ( тестировалась на релизе 7.70.305) Для конфигурации "Торговля и Склад 7.7" (тестировалась на релизе 7.70.1007)

2 стартмани

31.07.2021    19402    379    AndKovalchuk    125    

21

Инструментарий разработчика Системный администратор Программист Платформа 1С v7.7 1C77 Абонемент ($m)

Консоль запросов к базе SQL, не требующая внешних компонент

10 стартмани

29.04.2015    22757    57    Gvozdod    8    

17

Инструментарий разработчика Системный администратор Программист Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.

1 стартмани

23.04.2014    170355    1898    Alexoniq    1603    

500

Инструментарий разработчика Программист Платформа 1С v7.7 Платформа 1С v8.3 Россия Абонемент ($m)

Согласитесь, что окно стандартное сообщений в 1С иногда приносит больше неудобств, чем пользы. И тем более разные "Предупредить"... Что с этим окном только не делают! Его отцепают от формы, делают маленьким, умудряются спрятать за границы экрана. А потом звонят программистам с претензией, что документ почему-то не проводится, отя ничего и не пишет. У вас такого не было? А вот у нас было и не раз )))

1 стартмани

04.09.2013    33739    61    O-Planet    78    

49

Инструментарий разработчика Программист Платформа 1С v7.7 1C77 Абонемент ($m)

На днях встретил вопрос на форуме про возможность внесения изменений в конфигурацию без долгого сохранения в рабочей базе большого объема. Вот решил поделиться опытом, как это делал я. База у нас была объемом порядка 120 Гб. К базе обращался сайт в режиме 24/7, поэтому важно было быстро сохранять изменения и желательно без последующего монопольного запуска для восстановления индексов и процедур и без отключения пользователей от базы. Это первая часть статьи и посвящена она справочникам. С одной стороны - это самый простой объект, с другой стороны, именно про справочник спрашивалось на форуме. Если статья будет востребована, то я напишу аналогичные про документы, регистры и может еще что.

1 стартмани

13.08.2013    22325    Reptile    5    

36

Инструментарий разработчика Программист Платформа 1С v7.7 1C77 Абонемент ($m)

Давным давно, когда я еще плотно писал на 7.7 работа с формами была мучительной и неудобной. Приходилось каждый элемент выкладывать, выравнивать на форме ручками, прописывать код в модуле. Иногда при разработке очередной формы приходила в голову мысль: "а где-то я уже похожее делал..." и начинался мучительный поиск подходящего кода в своих запасах........

1 стартмани

21.02.2013    18670    36    MarSeN    14    

17
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. fishca 1260 18.01.16 14:06 Сейчас в теме
Публикация ниочЁм.
Светлый ум; BigB; +2 Ответить
2. JetBrain 79 18.01.16 19:05 Сейчас в теме
(1) fishca, Вам со знанием С++ зачем ее было вообще читать? Понятно было что уровень для новичка!
Оставьте свое сообщение