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

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

20
Пример использования компоненты 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 = "";
		СтруктураВозврата.ОписаниеОшибки = ОписаниеОшибки;
		
		Возврат СтруктураВозврата;
		
	КонецПопытки;

 

КонецФункции

&НаКлиенте
Функция ОтправитьПодписатьУКД(СчетФактура, Organization, ДанныеПодключения)
	
	ДатаДокумента = СчетФактура.Дата;
	Организация = СчетФактура.Организация;
	Контрагент = СчетФактура.Контрагент;
	СчетФактура = СчетФактура.Ссылка;
	
	Попытка
		
		СтруктураШапки = ПолучитьДанныеПервичногоДокументаУКД(Истина,,, СчетФактура);
		
		SendTask = Organization.CreateSendTask("UniversalCorrectionDocument");
		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.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";
		//Покупатель)
		////////////////////////////
		
		SendTask.CustomDocumentId = Строка(СчетФактура.УникальныйИдентификатор());
		SendTask.OneSDocumentId = Строка(СчетФактура.УникальныйИдентификатор());
		
		TotalWithVatExcludedInc = 0;
		TotalWithVatExcludedDec = 0;
		TotalVatInc = 0;
		TotalVatDec = 0;
		TotalInc = 0;
		TotalDec = 0;
		
		КоличествоСтрок = ПолучитьДанныеПервичногоДокументаУКД(Ложь,, Истина, СчетФактура);
		Для СчетчикСтрок = 0 По КоличествоСтрок - 1 Цикл
			
			СтруктураСтроки = ПолучитьДанныеПервичногоДокументаУКД(Ложь, СчетчикСтрок,, СчетФактура);
			
			Item = InvoiceContent.InvoiceCorrectionTable.AddItem();
			Item.Product = СтруктураСтроки.ТоварНаименование;
			
			
			СтруктураТовара = Новый Структура("Артикул, ТоварНаименование, ЕдиницаИзмеренияКодДоКорректировки, ЕдиницаИзмеренияКод, КоличествоДоКорректировки, Количество, ЦенаЗаЕдиницуИзмеренияДоКорректировки, ЦенаЗаЕдиницуИзмерения, 
			|СтоимостьТоваровБезНалогаДоКорректировки, СтоимостьТоваровБезНалога, СтоимостьТоваровБезНалогаУвеличение, СтоимостьТоваровБезНалогаУменьшение, НалоговаяСтавкаДоКорректировки, НалоговаяСтавка, СуммаНалогаДоКорректировки,
			|СуммаНалога, СуммаНалогаУвеличение, СуммаНалогаУменьшение, СуммаАкцизаДоКорректировки, СуммаАкциза, СуммаАкцизаУвеличение, СуммаАкцизаУменьшение, СтоимостьТоваровСНалогомДоКорректировки, СтоимостьТоваровСНалогом,
			|СтоимостьТоваровСНалогомУвеличение, СтоимостьТоваровСНалогомУменьшение");
			
			
			Item.OriginalValues.Quantity = СтруктураСтроки.КоличествоДоКорректировки;
			Item.OriginalValues.UnitCode = СтруктураСтроки.ЕдиницаИзмеренияКод;
			Item.OriginalValues.Price = СтруктураСтроки.ЦенаЗаЕдиницуИзмеренияДоКорректировки;
			Item.OriginalValues.TaxRate = СтруктураСтроки.НалоговаяСтавкаДоКорректировки;
			Item.OriginalValues.Excise = СтруктураСтроки.СуммаАкцизаДоКорректировки;
			Item.OriginalValues.TotalWithVatExcluded = СтруктураСтроки.СтоимостьТоваровБезНалогаДоКорректировки;
			Item.OriginalValues.Vat = СтруктураСтроки.СуммаНалогаДоКорректировки;
			Item.OriginalValues.Total = СтруктураСтроки.СтоимостьТоваровСНалогомДоКорректировки;
			
			Item.CorrectedValues.Quantity = СтруктураСтроки.Количество;
			Item.CorrectedValues.UnitCode = СтруктураСтроки.ЕдиницаИзмеренияКод;
			Item.CorrectedValues.Price = СтруктураСтроки.ЦенаЗаЕдиницуИзмерения;
			Item.CorrectedValues.TaxRate = СтруктураСтроки.НалоговаяСтавка;
			Item.CorrectedValues.Excise = СтруктураСтроки.СуммаАкциза;
			Item.CorrectedValues.TotalWithVatExcluded = СтруктураСтроки.СтоимостьТоваровБезНалога;
			Item.CorrectedValues.Vat = СтруктураСтроки.СуммаНалога;
			Item.CorrectedValues.Total = СтруктураСтроки.СтоимостьТоваровСНалогом;
			
			Item.AmountsInc.Excise = СтруктураСтроки.СуммаАкцизаУвеличение;
			Item.AmountsInc.TotalWithVatExcluded = СтруктураСтроки.СтоимостьТоваровБезНалогаУвеличение;
			Item.AmountsInc.Vat = СтруктураСтроки.СуммаНалогаУвеличение;
			Item.AmountsInc.Total = СтруктураСтроки.СтоимостьТоваровСНалогомУвеличение;
			
			Item.AmountsDec.Excise = СтруктураСтроки.СуммаАкцизаУменьшение;
			Item.AmountsDec.TotalWithVatExcluded = СтруктураСтроки.СтоимостьТоваровБезНалогаУменьшение;
			Item.AmountsDec.Vat = СтруктураСтроки.СуммаНалогаУменьшение;
			Item.AmountsDec.Total = СтруктураСтроки.СтоимостьТоваровСНалогомУменьшение;
			
			ДопИнфо = Item.AddStructedAdditionalInfo();
			ДопИнфо.Key = "ГУИД";
			ДопИнфо.Value = Строка(СтруктураСтроки.ТоварИдентификатор);
			
			ДопИнфо = Item.AddStructedAdditionalInfo();
			ДопИнфо.Key = "Артикул";
			ДопИнфо.Value = Строка(СтруктураСтроки.Артикул);
			
			TotalWithVatExcludedInc = TotalWithVatExcludedInc + СтруктураСтроки.СтоимостьТоваровБезНалогаУвеличение;
			TotalWithVatExcludedDec = TotalWithVatExcludedDec + СтруктураСтроки.СтоимостьТоваровБезНалогаУменьшение;
			
			TotalVatInc = TotalVatInc + СтруктураСтроки.СуммаНалогаУвеличение;
			TotalVatDec = TotalVatDec + СтруктураСтроки.СуммаНалогаУменьшение;
			
			TotalInc = TotalInc + СтруктураСтроки.СтоимостьТоваровСНалогомУвеличение;
			TotalDec = TotalDec + СтруктураСтроки.СтоимостьТоваровСНалогомУменьшение;
			
		КонецЦикла;
		
		InvoiceContent.InvoiceCorrectionTable.TotalsInc.TotalWithVatExcluded = TotalWithVatExcludedInc;
		InvoiceContent.InvoiceCorrectionTable.TotalsInc.Vat = TotalVatInc;
		InvoiceContent.InvoiceCorrectionTable.TotalsInc.Total = TotalInc;
		
		InvoiceContent.InvoiceCorrectionTable.TotalsDec.TotalWithVatExcluded = TotalWithVatExcludedDec;
		InvoiceContent.InvoiceCorrectionTable.TotalsDec.Vat = TotalVatDec;
		InvoiceContent.InvoiceCorrectionTable.TotalsDec.Total = TotalDec;
		
		Invoice = InvoiceContent.AddInvoice();
		СтруктураОснования = ПолучитьДанныеСФОснования();
		Invoice.InvoiceDate = СтруктураОснования.InvoiceDate;
		Invoice.InvoiceNumber = СтруктураОснования.InvoiceNumber;
		
		Signer = InvoiceContent.AddSigner();
		МассивЧастейИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Organization.Certificate.Name, " ");
		InvoiceContent.Creator = Organization.Certificate.Name;
		
		Signer.BoxId = ДанныеПодключения.ИдентификаторОрганизации;
		Signer.CertificateThumbprint = Organization.Certificate.Thumbprint;
		
		СтруктураКорретировки = ПолучитьДанныеКорректировки();
		InvoiceContent.EventContent.OperationContent = СтруктураКорретировки.НомерКорректировки + " от " + СтруктураКорретировки.ДатаКорректировки;
		InvoiceContent.EventContent.CostChangeInfo = "";
		InvoiceContent.EventContent.NotificationDate = Лев(Строка(ТекущаяДата()), 10);
		InvoiceContent.EventContent.TransferDocDetails = "УПД " + СтруктураОснования.InvoiceNumber + " от " + СтруктураОснования.InvoiceDate;
		
		CorrectionBase = InvoiceContent.EventContent.AddCorrectionBase();
		CorrectionBase.BaseDocumentName = СтруктураКорретировки.НаименованиеКорректировки;
		CorrectionBase.BaseDocumentNumber = СтруктураКорретировки.НомерКорректировки;
		CorrectionBase.BaseDocumentDate = СтруктураКорретировки.ДатаКорректировки;
		
		ОтправленныйДокумент = SendTask.Send();
		
		ИмяФайла = ПолучитьИмяВременногоФайла(".pdf");
		ОтправленныйДокумент.GetPrintForm(ИмяФайла);
		ЗапуститьПриложение(ИмяФайла);
		Сообщить("Отправлен и подписан УКД к корректировке " + СтруктураКорретировки.НомерКорректировки + " от " + СтруктураКорретировки.ДатаКорректировки);
		
		ЗафиксироватьОтправку(ОтправленныйДокумент.DocumentId, СчетФактура);
		
		Возврат Истина;
		
	Исключение
		
		ОписаниеОшибки = ОписаниеОшибки();
		Сообщить(ОписаниеОшибки);
		Возврат Ложь;
		
	КонецПопытки;
	
КонецФункции

&НаСервере
Функция ПолучитьДанныеПервичногоДокументаУКД(Шапка, НомерСтроки = Неопределено, КоличествоСтрок = Ложь, СчетФактура)
	
	МассивОбъектов = Новый Массив;
	МассивОбъектов.Добавить(СчетФактура);
	ПараметрыПечати = Новый Структура();
	
	СтруктураДанных = Документы.СчетФактураВыданный.ПолучитьДанныеДляПечатнойФормыУКД(ПараметрыПечати, МассивОбъектов);
	
	Если КоличествоСтрок Тогда
		Возврат СтруктураДанных.РезультатПоТабличнойЧасти.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам).Строки.Количество();
	КонецЕсли;
	
	Если Не Шапка И НомерСтроки = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Если Шапка Тогда
		
		Выборка = СтруктураДанных.РезультатПоШапке.Выбрать();
		Выборка.Следующий();
		
		СтруктураШапки = Новый Структура;
		СтруктураШапки.Вставить("ВалютаКод", Выборка.ВалютаКод);
		СтруктураШапки.Вставить("Организация", Выборка.Организация);
		СтруктураШапки.Вставить("ПредставлениеОрганизации", Выборка.Организация.НаименованиеПолное);
		СтруктураШапки.Вставить("ОрганизацияИНН", Выборка.Организация.ИНН);
		СтруктураШапки.Вставить("ОрганизацияКПП", Выборка.Организация.КПП);
		СтруктураШапки.Вставить("Контрагент", Выборка.Контрагент);
		СтруктураШапки.Вставить("ПредставлениеКонтрагента", Выборка.Контрагент.НаименованиеПолное);
		СтруктураШапки.Вставить("КонтрагентИНН", Выборка.Контрагент.ИНН);
		СтруктураШапки.Вставить("КонтрагентКПП", Выборка.Контрагент.КПП);
		СтруктураШапки.Вставить("ДатаВыставления", Объект.Ссылка.ДатаВыставления);
		СтруктураШапки.Вставить("Номер", Объект.Ссылка.Номер);
		
		Возврат СтруктураШапки;
		
	КонецЕсли;
	
	СтруктураТовара = Новый Структура("Артикул, ТоварНаименование, ЕдиницаИзмеренияКодДоКорректировки, ЕдиницаИзмеренияКод, КоличествоДоКорректировки, Количество, ЦенаЗаЕдиницуИзмеренияДоКорректировки, ЦенаЗаЕдиницуИзмерения, 
			|СтоимостьТоваровБезНалогаДоКорректировки, СтоимостьТоваровБезНалога, СтоимостьТоваровБезНалогаУвеличение, СтоимостьТоваровБезНалогаУменьшение, НалоговаяСтавкаДоКорректировки, НалоговаяСтавка, СуммаНалогаДоКорректировки,
			|СуммаНалога, СуммаНалогаУвеличение, СуммаНалогаУменьшение, СуммаАкцизаДоКорректировки, СуммаАкциза, СуммаАкцизаУвеличение, СуммаАкцизаУменьшение, СтоимостьТоваровСНалогомДоКорректировки, СтоимостьТоваровСНалогом,
			|СтоимостьТоваровСНалогомУвеличение, СтоимостьТоваровСНалогомУменьшение, ТоварИдентификатор");
	
	ТаблицаТоваров = Новый ТаблицаЗначений;
	ТаблицаТоваров.Колонки.Добавить("ИдТовараУКонтрагента");
	ТаблицаТоваров.Колонки.Добавить("ТоварНаименование");
	ТаблицаТоваров.Колонки.Добавить("Артикул");
	ТаблицаТоваров.Колонки.Добавить("ЕдиницаИзмеренияКодДоКорректировки");
	ТаблицаТоваров.Колонки.Добавить("ЕдиницаИзмеренияКод");
	ТаблицаТоваров.Колонки.Добавить("КоличествоДоКорректировки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(26,11)));
	ТаблицаТоваров.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(26,11)));
	ТаблицаТоваров.Колонки.Добавить("ЦенаЗаЕдиницуИзмеренияДоКорректировки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(26,11)));
	ТаблицаТоваров.Колонки.Добавить("ЦенаЗаЕдиницуИзмерения", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(26,11)));
	ТаблицаТоваров.Колонки.Добавить("СтоимостьТоваровБезНалогаДоКорректировки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СтоимостьТоваровБезНалога", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СтоимостьТоваровБезНалогаУвеличение", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СтоимостьТоваровБезНалогаУменьшение", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("НалоговаяСтавкаДоКорректировки");
	ТаблицаТоваров.Колонки.Добавить("НалоговаяСтавка");
	ТаблицаТоваров.Колонки.Добавить("СуммаНалогаДоКорректировки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СуммаНалога", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СуммаНалогаУвеличение", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СуммаНалогаУменьшение", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СуммаАкцизаДоКорректировки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СуммаАкциза", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СуммаАкцизаУвеличение", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СуммаАкцизаУменьшение", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СтоимостьТоваровСНалогомДоКорректировки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СтоимостьТоваровСНалогом", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СтоимостьТоваровСНалогомУвеличение", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("СтоимостьТоваровСНалогомУменьшение", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(19,2)));
	ТаблицаТоваров.Колонки.Добавить("ТоварИдентификатор", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(255)));
	
	ВыборкаПоДокументам = СтруктураДанных.РезультатПоТабличнойЧасти.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	ВыборкаПоДокументам.Следующий();
	СтрокаТовары = ВыборкаПоДокументам.Выбрать();
	
	Пока СтрокаТовары.Следующий() Цикл
		
		НовСтрока = ТаблицаТоваров.Добавить();
		ЗаполнитьЗначенияСвойств(НовСтрока, СтрокаТовары);
		
		НовСтрока.ТоварНаименование  = НоменклатураКлиентСервер.ПредставлениеНоменклатурыДляПечати(
			СтрокаТовары.НоменклатураНаименование,
			СтрокаТовары.ХарактеристикаНаименование
			) + ?(СтрокаТовары.ЭтоВозвратнаяТара, НСтр("ru=' (возвратная тара)'"), "");
			
		НовСтрока.ТоварИдентификатор 						= Строка(СтрокаТовары.Номенклатура.УникальныйИдентификатор());
		
		НовСтрока.Артикул									= СтрокаТовары.Номенклатура.Артикул;
		НовСтрока.ЕдиницаИзмеренияКодДоКорректировки		= СокрЛП(СтрокаТовары.ЕдиницаИзмеренияКод);
		НовСтрока.ЕдиницаИзмеренияКод               		= СокрЛП(СтрокаТовары.ЕдиницаИзмеренияКод);		
		НовСтрока.КоличествоДоКорректировки					= СтрокаТовары.КоличествоДо;
		НовСтрока.Количество                				= СтрокаТовары.Количество;		
		НовСтрока.ЦенаЗаЕдиницуИзмеренияДоКорректировки 	= Окр(СтрокаТовары.ЦенаДо, 2);
		НовСтрока.ЦенаЗаЕдиницуИзмерения                	= Окр(СтрокаТовары.Цена, 2);		
		НовСтрока.СтоимостьТоваровБезНалогаДоКорректировки 	= Окр(СтрокаТовары.СуммаБезНДСДо, 2);
		НовСтрока.СтоимостьТоваровБезНалога                	= Окр(СтрокаТовары.СуммаБезНДС, 2);		
		НовСтрока.СтоимостьТоваровБезНалогаУвеличение      	= Окр(СтрокаТовары.РазницаБезНДСУвеличение, 2);
		НовСтрока.СтоимостьТоваровБезНалогаУменьшение      	= Окр(СтрокаТовары.РазницаБезНДСУменьшение, 2);
		НовСтрока.НалоговаяСтавкаДоКорректировки 			= СтрокаТовары.СтавкаНДС;
		НовСтрока.НалоговаяСтавка                			= СтрокаТовары.СтавкаНДС;		
		НовСтрока.СуммаНалогаДоКорректировки 				= Окр(СтрокаТовары.СуммаНДСДо, 2);
		НовСтрока.СуммаНалога                				= Окр(СтрокаТовары.СуммаНДС, 2);
		НовСтрока.СуммаНалогаУвеличение      				= Окр(СтрокаТовары.РазницаНДСУвеличение, 2);
		НовСтрока.СуммаНалогаУменьшение      				= Окр(СтрокаТовары.РазницаНДСУменьшение, 2);		
		НовСтрока.СтоимостьТоваровСНалогомДоКорректировки 	= Окр(СтрокаТовары.СуммаСНДСДо, 2);
		НовСтрока.СтоимостьТоваровСНалогом                	= Окр(СтрокаТовары.СуммаСНДС, 2);
		НовСтрока.СтоимостьТоваровСНалогомУвеличение      	= Окр(СтрокаТовары.РазницаСНДСУвеличение, 2);
		НовСтрока.СтоимостьТоваровСНалогомУменьшение      	= Окр(СтрокаТовары.РазницаСНДСУменьшение, 2);
	
	КонецЦикла;
	
	ЗаполнитьЗначенияСвойств(СтруктураТовара, ТаблицаТоваров[НомерСтроки]);
	
	Возврат СтруктураТовара;
	
КонецФункции

Функция ПолучитьДанныеКорректировки()
	
	СтруктураОснования = Новый Структура("НаименованиеКорректировки, НомерКорректировки, ДатаКорректировки");
	СтруктураОснования.НаименованиеКорректировки = "Корректировка реализации";
	Если Объект.ДокументыОснования.Количество() > 0 Тогда
		СтрокаОснования = Объект.ДокументыОснования[0];
		СтруктураОснования.НомерКорректировки = СтрокаОснования.ДокументОснование.Номер;
		СтруктураОснования.ДатаКорректировки = Лев(Строка(СтрокаОснования.ДокументОснование.Дата), 10);
	КонецЕсли;
	
	Возврат СтруктураОснования;
	
КонецФункции

Функция ПолучитьДанныеСФОснования()
	
	СтруктураОснования = Новый Структура("InvoiceNumber, InvoiceDate");
	Если Объект.ДокументыОснования.Количество() > 0 Тогда
		СтрокаОснования = Объект.ДокументыОснования[0];
		СтруктураОснования.InvoiceNumber = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(СтрокаОснования.ИсходныйДокумент.Номер, Ложь, Истина);
		СтруктураОснования.InvoiceDate = Лев(Строка(СтрокаОснования.ИсходныйДокумент.Дата), 10);
	КонецЕсли;
	
	Возврат СтруктураОснования;
	
КонецФункции

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

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

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

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

20

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. IsiKosta 732 01.06.18 13:23 Сейчас в теме
А со СБИСом можете пример привести?
2. savostin.alex 41 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 298 08.06.18 09:55 Сейчас в теме
Александр, можете уточнить откуда мы получаем Отпечаток и ПинКод в пункте 2?
6. savostin.alex 41 08.06.18 13:39 Сейчас в теме
В типовой УТ 11 (ERP, БП 3 - там, где есть БСП) есть справочник СертификатыКлючейЭлектроннойПодписиИШифрования, там для пользователя и организации подбираются сертификаты из личного хранилища пользователя ОС, получить нужные данные нужно оттуда. Но можно реализовать и свой аналог этого справочника.
7. AzagTot 36 16.11.18 15:55 Сейчас в теме
Александр, подскажите, пожалуйста, как с помощью COMОбъекта Diadoc.DiadocClient отправить контрагенту приглашение для обмена ЭД.
8. savostin.alex 41 17.11.18 01:01 Сейчас в теме
(7)
//Находим контрагента по ИНН/КПП
CounteragentList = Organization.GetCounteragentListByInnKpp(ИНН, КПП);
Counteragent = CounteragentList.GetItem(0);
//Принимаем запрос или отправляем приглашение
Counteragent.AcquireCounteragent("Приглашаем к партнерству");

//Или если у нас имеется ID контрагента, получаем его по ID
Counteragent = Organization.GetCounteragentById(CounteragentId);
Counteragent.AcquireCounteragent("Приглашаем к партнерству");

Вообще документация тут https://diadocsdk-1c.readthedocs.io
Оставьте свое сообщение