Обмен между 1С7.7 и Честным знаком через API. Часть 1.

В этом цикле статей расскажу, как сделать выгрузку документов из конфигурации на базе 1С7.7 в Честный знак через API.

На просторах интернета достаточно много эта тема обсуждается, но я нигде не нашел подробного описания по шагам, как сделать рабочий обмен данными. И что самое печальное, нигде не было описания, как правильно подписать документ с помощью ЭЦП так, чтобы Честный знак его принял. Постараюсь исправить этот недочет. Теперь обо всем по-порядку.

У меня стояла задача выгрузить из базы данных в честный знак документы “Вывод из оборота” для групп товаров “Молочной продукция” и “Упакованная вода” при ведении ОСУ (объемно-сортового учета). На этом примере я и расскажу о реализации обмена.

Необходимое для интеграции ПО:

  1. 1С7.7 – я использовал версию 7.0.27 для SQL
  2. КриптоПро CSP – это можно скачать с официального сайта
  3. КриптоПро ЭЦП Browser-plugin – так же скачивается с официального сайта

При реализации использовались процедуры и функции с просторов сети, некоторые из которых пришлось “допилить”. Предлагаемый алгоритм не без изъянов, о которых я не забуду упомянуть по мере описания.

Весь алгоритм можно разделить на три этапа: выбор сертификата электронной подписи, установка подключения к честному знаку и отправка документа. А теперь расскажу подробно о каждом из этих этапов.

Этап 1. Выбор сертификата электронной подписи.

Это самый простой этап. Здесь приведу только пример заполнения таблицы значений данными сертификатов из личного хранилища пользователя.

Процедура ЗаполнитьТаблицуСертификатовИзЛичногоХранилища()
	Перем oStore, текСертификат, текОтпечаток, Владелец, ДействителенПо;
	Перем ТекстСообщения;
	
	ТаблицаСертификатов.УдалитьСтроки();
	
	Если ТаблицаСертификатов.КоличествоКолонок() = 0 Тогда
		ТаблицаСертификатов.НоваяКолонка("Отпечаток", "Строка", 100,, "Отпечаток", 10);
		ТаблицаСертификатов.НоваяКолонка("Владелец", "Строка", 200,, "Владелец", 25);
		ТаблицаСертификатов.НоваяКолонка("ДействителенПо", "Дата",,, "Действителен по", 8);
	КонецЕсли;
	ТаблицаСертификатов.ВидимостьКолонки("Отпечаток", 0);
	
	Попытка
		oStore = Подпись_ПолучитьОбъектХранилищеСертификатов();
		Если oStore = 0 Тогда
			Возврат;
		КонецЕсли;
		
		Certs = oStore.Certificates;
		Для СчСер = 1 По Certs.Count Цикл
			текСертификат  = Certs.Item(СчСер);
			текОтпечаток   = ТекСертификат.Thumbprint;
			Владелец       = ТекСертификат.SubjectName;
			ДействителенПо = ТекСертификат.ValidToDate;
			Если ДействителенПо < ТекущаяДата() Тогда
				Продолжить;
			КонецЕсли;
			СерийныйНомер  = ТекСертификат.SerialNumber;
			ДанныеСертификатаBase64 = ТекСертификат.Export();
			
			ТаблицаСертификатов.НоваяСтрока();
			ТаблицаСертификатов.Отпечаток         = текОтпечаток;
			ТаблицаСертификатов.Владелец          = Владелец;
			ТаблицаСертификатов.ДействителенПо    = ДействителенПо;
		КонецЦикла;
		oStore.Close();
	Исключение
		ТекстСообщения = "Не удалось прочитать список сертификатов из личного хранилища! " + ОписаниеОшибки();
		Сообщить(ТекстСообщения, "!!");
	КонецПопытки;
	
КонецПроцедуры

Функция Подпись_ПолучитьОбъектХранилищеСертификатов()
	Перем CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY;
	Перем oStore;
	Перем ТекстСообщения;
	
	Попытка
		CAPICOM_CURRENT_USER_STORE = 2; // 2 - Искать сертификат в ветке "Личное" хранилища.
		CAPICOM_MY_STORE = "My"; // Указываем, что ветку "Личное" берем из хранилища текущего пользователя
		CAPICOM_STORE_OPEN_READ_ONLY = 0; // Открыть хранилище только на чтение
		oStore 	= СоздатьОбъект("CAPICOM.Store"); // Объект описывает хранилище сертификатов
		oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY); // Открыть хранилище сертификатов
	Исключение
		ТекстСообщения = "Не удалось открыть личное хранилище сертификатов! " + ОписаниеОшибки();
		Сообщить(ТекстСообщения, "!!");
		oStore = 0;
	КонецПопытки;
	
	Возврат oStore;
	
КонецФункции

Вот и все. Теперь остается только предоставить пользователю выбор необходимого сертификата из таблицы значений и запомнить отпечаток выбранного сертификата для дальнейшего использования при установке подключения и отправке документов.

Как получить токен авторизации в Честном знаке, описано с следующей статье.

Если вы заметили ошибку, неточность или у вас появились вопросы, пишите в комментариях, я обязательно вам отвечу и приму все ваши замечания.

Author: admin

Добавить комментарий