Шастун Алексей | Руководитель отдела | 1С-Рарус

«Опытная эксплуатация - цели, проблемы и их решение»

"Когда начинаешь опытную эксплуатацию, прежде всего нужно подумать, как ее закончить" 1. Цели опытной эксплуатации на проекте 2. Стратегия и тактика 3. Основные технические вопросы 4. Риски этапа опытной эксплуатации, их минимизация, возникающие проблемы и их решение 5. Что еще дополнительно предложить клиенту на этапе опытной эксплуатации

Юридически значимый электронный документооборот с Контур.Диадок

Обмен - Обмен с другими системами

Пример использования компоненты DiadocComApi http://diadocsdk-1c.readthedocs.io/ru/latest/

Добрый день.

Прилагаю пример работы с сервисом юридически значимого электронного документоборота Контур.Диадок.

1. Установление соединения с сервером Диадок:

Функция ПолучитьДиадокAPI() Экспорт
    Поп ытка    
        ДиадокAPI = Новый ComОбъект("Diadoc.DiadocClient");
        ДиадокAPI.ApiClientId = ВашКлюч Разработчика;
        ДиадокAPI.ServerURL = "https://diadoc-api.kontur.ru:443";     
        ДиадокAPI.ProxyMode = "UseDefaultProxy";
        Возврат ДиадокAPI;
    Исключение
        ЛогированиеЭДО("Не удалось создать ДиадокAPI " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;    
КонецФункции

2. Подключаемся по сертификату к ящику организации-отправителя документа:

Функция ПолучитьОрганизацию(Отпечаток, ПинКод, ИДЯщикаОрганизации, ДиадокAPI) Экспорт
	Попытка
		ДиадокСоединение = ДиадокAPI.CreateConnectionByCertificate(Отпечаток, ПинКод);
	Исключение
		Сообщить("Не удалось получить соединение " + Отпечаток + " " + ОписаниеОшибки());
		Возврат Неопределено;	
	КонецПопытки;
		
	Если ДиадокСоединение = Неопределено Тогда
		Сообщить("Не удалось получить соединение " + Отпечаток);
		Возврат Неопределено;
	КонецЕсли;
	
	Organization = ДиадокСоединение.GetOrganizationById(ИДЯщикаОрганизации);
	
	Если Organization = Неопределено Тогда 
		Сообщить("Не удалось получить организацию " + ИДЯщикаОрганизации);
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат Organization;
	
КонецФункции

3. Создаем документ, заполняем его, отправляем и подписываем.

Функция ОтправитьУПД(ДиадокAPI, РасходнаяНакладная, Продавец) Экспорт
	
	СтруктураВозврата = Новый Структура("docid, ОписаниеОшибки");
	
	Попытка
		
		ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
		ДатаДокумента = РасходнаяНакладная.Дата;
		Организация = РасходнаяНакладная.Организация;
		Контрагент = РасходнаяНакладная.Контрагент;
		
		Organization = ПолучитьОрганизацию(Отпечаток, ПинКод, ИДЯщикаОрганизации, ДиадокAPI);
		Если Organization = Неопределено Тогда 
			ОписаниеОшибки = ОписаниеОшибки();
			Сообщить("Не удалось выгрузить документ " + РасходнаяНакладная + " " + ОписаниеОшибки);
			СтруктураВозврата.docid = "";
			СтруктураВозврата.ОписаниеОшибки = ОписаниеОшибки;
			Возврат СтруктураВозврата;
		КонецЕсли;
		
		SendTask = Organization.CreateSendTask("UniversalTransferDocument");//создаем объект УПД для отправки и подписания
		SendTask.CounteragentId   = ИДЯщикаКонтрагента;
		SendTask.CustomDocumentID = Строка(РасходнаяНакладная.УникальныйИдентификатор());
		
		InvoiceContent = SendTask.Content;//содержимое счет-фактуры
		InvoiceContent.Function    = "InvoiceAndBasic";//тип УПД - СЧФДОП
		InvoiceContent.Date        = ДатаДокумента;
		InvoiceContent.Number      = РасходнаяНакладная.Номер;
		InvoiceContent.Currency    = РасходнаяНакладная.Валюта.Код;
		
		////////////////////////////
		//продавец(
		InvoiceContent.Seller.Name = Организация.ПолноеНаименование;
		InvoiceContent.Seller.Inn  = СокрЛП(Организация.ИНН);
		InvoiceContent.Seller.Kpp  = СокрЛП(Организация.КПП);
		InvoiceContent.Seller.Address.IsForeign = Истина;
		InvoiceContent.Seller.Address.Countrycode = 643;
		InvoiceContent.Seller.Address.AddressText = Организация.ЮридическийАдрес;
		InvoiceContent.Seller.type 	= "LegalEntity";//юрлицо
		//Продавец)
		////////////////////////////
		
		////////////////////////////
		//Грузоотправитель(может отсутствовать
		InvoiceContent.Shipper.OrganizationInfo.Name = Грузоотправитель.ПолноеНаименование;
		InvoiceContent.Shipper.OrganizationInfo.Inn  = СокрЛП(Грузоотправитель.ИНН);
		InvoiceContent.Shipper.OrganizationInfo.Kpp  = СокрЛП(Грузоотправитель.КПП);
		InvoiceContent.Shipper.OrganizationInfo.Address.IsForeign = Истина;
		InvoiceContent.Shipper.OrganizationInfo.Address.Countrycode = 643;
		InvoiceContent.Shipper.OrganizationInfo.Address.AddressText = Грузоотправитель.ЮридическийАдрес;
		InvoiceContent.Shipper.OrganizationInfo.type = ?(Грузоотправитель.ВидКонтрагента = Перечисления.ВидКонтрагента.ЮридическоеЛицо, "LegalEntity", "IndividualEntity");//юрлицо или физлицо
		//Грузоотправитель
		////////////////////////////
		
		////////////////////////////
		//Покупатель
		InvoiceContent.Buyer.Name = Контрагент.ПолноеНаименование;
		InvoiceContent.Buyer.Inn  = СокрЛП(Контрагент.ИНН);
		InvoiceContent.Buyer.Kpp  = СокрЛП(Контрагент.КПП);
		InvoiceContent.Buyer.Address.IsForeign = Истина;
		InvoiceContent.Buyer.Address.Countrycode = 643;
		InvoiceContent.Buyer.Address.AddressText = Контрагент.ЮридическийАдрес;
		InvoiceContent.Buyer.type  	= "LegalEntity";
		//Покупатель)
		////////////////////////////
		
		////////////////////////////
		//Грузополучатель(может отсутствовать
		InvoiceContent.Consignee.Name = Грузополучатель.ПолноеНаименование;
		InvoiceContent.Consignee.Inn  = СокрЛП(Грузополучатель.ИНН);
		InvoiceContent.Consignee.Kpp  = СокрЛП(Грузополучатель.КПП);
		InvoiceContent.Consignee.Address.IsForeign = Истина;
		InvoiceContent.Consignee.Address.Countrycode = 643;
		InvoiceContent.Consignee.Address.AddressText = Грузополучатель.ЮридическийАдрес;
		InvoiceContent.Consignee.type  	= "LegalEntity";
		//Грузополучатель
		////////////////////////////
		
		InvoiceContent.Creator	   	= Организация.Наименование;
		InvoiceContent.TransferInfo.OperationInfo = "Продажа";
		
		SendTask.CustomDocumentId = Строка(РасходнаяНакладная.УникальныйИдентификатор());
		SendTask.OneSDocumentId = Строка(РасходнаяНакладная.УникальныйИдентификатор());
		
		Всего = 0;
		ВсегоБезНДС = 0;
		НДС = 0;
		
        //заполняем табличную часть
		Для Каждого Стр Из РасходнаяНакладная.Товары Цикл 
			
			Номенклатура = Стр.Номенклатура;
			Количество = Стр.Количество;
			
			СтавкаНДС = Неопределено;
			СуммаНДС = 0;
			СуммаСНДС = 0;
			
			Item = InvoiceContent.InvoiceTable.AddItem();//новая строка ТЧ
			Item.Product               		= Строка(Номенклатура);
			Item.UnitCode              		= Стр.Единица.ЕдиницаИзмерения.Код;
			Item.UnitName              		= Стр.Единица.Наименование;
			Item.VendorCode              	        =  Номенклатура.Артикул;
			Item.Quantity              		= Количество;
			Item.Price                 		= Окр(?(Количество = 0, 0, СуммаБезНДС / Количество), 2);
			Item.SubtotalWithVatExcluded  	= Окр(СуммаБезНДС, 2);
			Item.TaxRate               		= ?(Стр.СтавкаНДС.Наименование = "Без налога", "без НДС", Стр.СтавкаНДС.Ставка);
			Item.Vat                   		= Окр(СуммаНДС, 2);
			Item.Subtotal                 	        = Окр(СуммаСНДС, 2);
			
			Всего							= Всего + Окр(СуммаСНДС, 2);
			ВсегоБезНДС						= ВсегоБезНДС + Окр(СуммаБезНДС, 2);
			НДС								= НДС + Окр(СуммаНДС, 2);
			
			ДопИнфо = Item.AddStructedAdditionalInfo();//можно добавлять произвольные строковые данные
			ДопИнфо.Key = "ГУИД";
			ДопИнфо.Value = Строка(Номенклатура.УникальныйИдентификатор());
			
			Если Номенклатура.СтранаПроисхождения <> Справочники.КлассификаторСтранМира.РОССИЯ И Число(Номенклатура.СтранаПроисхождения.ЦифровойКодОКСМ) > 0 Тогда
				
				НомерГТД = ПолучитьНомерГТД(РасходнаяНакладная, Номенклатура);
				
				CD = Item.AddCustomDeclaration();//добавляем номер ГТД и страну происхождения для импортного товара
				CD.CountryCode = Строка(Номенклатура.СтранаПроисхождения.ЦифровойКодОКСМ);
				CD.DeclarationNumber = НомерГТД;
				
			КонецЕсли;
			
		КонецЦикла;
		
		InvoiceContent.InvoiceTable.Total					= Окр(Всего, 2);
		InvoiceContent.InvoiceTable.Vat						= Окр(НДС, 2);
		InvoiceContent.InvoiceTable.TotalWithVatExcluded	= Окр(ВсегоБезНДС, 2);
		
		Signer = InvoiceContent.AddSigner();//добавляем подписанта
		
		МассивЧастейИмени = РазложитьСтрокуВМассивПодстрок(Organization.Certificate.Name, " ");//функция БСП
		
		Signer.SignerDetails.Surname    = МассивЧастейИмени[0];
		Signer.SignerDetails.FirstName  = МассивЧастейИмени[1];
		Signer.SignerDetails.Patronymic = ?(МассивЧастейИмени.Количество() > 2, МассивЧастейИмени[2], "");//подписанты бывают без отчества в паспорте
		Signer.SignerDetails.JobTitle   = Organization.Certificate.JobTitle;
		Signer.SignerDetails.SignerType = "LegalEntity";
		Signer.SignerDetails.Inn        = СтрЗаменить(Строка(Число(Organization.Certificate.INN)), Символы.НПП, "");
		Signer.SignerDetails.Powers     = "MadeAndSignOperation";
		
		ОтправленныйДокумент = SendTask.Send();//отправляем + подписываем
                
        ЗафиксироватьОтправку(РасходнаяНакладная.Ссылка, ОтправленныйДокумент.DocumentId);//при необходимости, для исключения дублирования - Диадок не следит за уникальностью документов
		
		СтруктураВозврата.docid = ОтправленныйДокумент.DocumentId;
		СтруктураВозврата.ОписаниеОшибки = "";
		
		Возврат СтруктураВозврата;
		
	Исключение
		
		ОписаниеОшибки = ОписаниеОшибки();
		Сообщить("Не удалось выгрузить документ " + РасходнаяНакладная + " " + ОписаниеОшибки);
		
		СтруктураВозврата.docid = "";
		СтруктураВозврата.ОписаниеОшибки = ОписаниеОшибки;
		
		Возврат СтруктураВозврата;
		
	КонецПопытки;

4. На что обратить внимание.

        4.1 Классификаторы стран мира (ОКСМ) и единиц измерения (ОКЕИ) должны быть в актуальном состоянии - отсутствующие в классификаторах коды Диадок отвергнет (будет исключение).

        4.2 Если товар импортный, номер ГТД должен присутствовать обязательно (т.е. когда к строке добавляется CustomDeclaration).

        4.3 Общий принцип работы = получили API, подключились по отпечатку сертификата организации (должен быть доступен закрытый ключ - на токене, в реестре и т.д.), заполнили документ, оправка совмещается с подписанием.

См. также

Комментарии
Сортировка: Древо Сохранить
1. Константин Исиченко (IsiKosta) 725 01.06.18 13:23 Сейчас в теме
А со СБИСом можете пример привести?
2. Александр Савостин (savostin.alex) 37 01.06.18 14:37 Сейчас в теме
Нет, только с Контур. Но СБИС предлагает свое решение для интеграции, примеры (если решение не подойдет к вашей конфигурации) можно взять оттуда
https://sbis.ru/help/integration/1C_set/modul/download.
3. Андрей М (_Z1) 38 06.06.18 08:13 Сейчас в теме
(2) У Сбиса есть аналогичный инструмент - но он сложнее потому , что объектая модель
у диадок-контур очень хорошая.
Мы со сбис для исходящих работаем через коннектор.
4. Денис Злобин (user612295_death4321) 06.06.18 17:07 Сейчас в теме
У сбиса документация тоже вполне понятная .

У меня тоже построено много логики на этой компоненте.
5. Михаил Филимонов (NN2P) 278 08.06.18 09:55 Сейчас в теме
Александр, можете уточнить откуда мы получаем Отпечаток и ПинКод в пункте 2?
6. Александр Савостин (savostin.alex) 37 08.06.18 13:39 Сейчас в теме
В типовой УТ 11 (ERP, БП 3 - там, где есть БСП) есть справочник СертификатыКлючейЭлектроннойПодписиИШифрования, там для пользователя и организации подбираются сертификаты из личного хранилища пользователя ОС, получить нужные данные нужно оттуда. Но можно реализовать и свой аналог этого справочника.
Оставьте свое сообщение