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

Пример использования компоненты 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, подключились по отпечатку сертификата организации (должен быть доступен закрытый ключ — на токене, в реестре и т.д.), заполнили документ, оправка совмещается с подписанием.

8 Comments

  1. IsiKosta

    А со СБИСом можете пример привести?

    Reply
  2. savostin.alex

    Нет, только с Контур. Но СБИС предлагает свое решение для интеграции, примеры (если решение не подойдет к вашей конфигурации) можно взять оттуда

    https://sbis.ru/help/integration/1C_set/modul/download.

    Reply
  3. _Z1

    (2) У Сбиса есть аналогичный инструмент — но он сложнее потому , что объектая модель

    у диадок-контур очень хорошая.

    Мы со сбис для исходящих работаем через коннектор.

    Reply
  4. user612295_death4321

    У сбиса документация тоже вполне понятная .

    У меня тоже построено много логики на этой компоненте.

    Reply
  5. NN2P

    Александр, можете уточнить откуда мы получаем Отпечаток и ПинКод в пункте 2?

    Reply
  6. savostin.alex

    В типовой УТ 11 (ERP, БП 3 — там, где есть БСП) есть справочник СертификатыКлючейЭлектроннойПодписиИШифрования, там для пользователя и организации подбираются сертификаты из личного хранилища пользователя ОС, получить нужные данные нужно оттуда. Но можно реализовать и свой аналог этого справочника.

    Reply
  7. AzagTot

    Александр, подскажите, пожалуйста, как с помощью COMОбъекта Diadoc.DiadocClient отправить контрагенту приглашение для обмена ЭД.

    Reply
  8. savostin.alex

    (7)

    //Находим контрагента по ИНН/КПП

    CounteragentList = Organization.GetCounteragentListByInnKpp(ИНН, КПП);

    Counteragent = CounteragentList.GetItem(0);

    //Принимаем запрос или отправляем приглашение

    Counteragent.AcquireCounteragent(«Приглашаем к партнерству»);

    //Или если у нас имеется ID контрагента, получаем его по ID

    Counteragent = Organization.GetCounteragentById(CounteragentId);

    Counteragent.AcquireCounteragent(«Приглашаем к партнерству»);

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

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *