Работа со счетом-фактурой

Порядок обмена СФ описан на странице Документооборот счетов-фактур. Базовый алгоритм работы с формализованными документами приведен в разделе Работа с формализованными документами. Особенности сценариев работы с документом зависит от вида документооборота для его формата.

Примечание

Методы и подходы, описанные ниже, можно использовать для работы со счетами-фактурами (СФ), корректировочными счетами-фактурами (КСФ), исправлениями счета-фактуры (ИСФ) и исправлениями корректировочных счетов-фактур (ИКСФ).

Сценарий работы со счетом-фактурой включает следующие шаги:

Генерация счета-фактуры

Для генерации СФ, ИСФ, КСФ, ИКСФ используйте метод GenerateTitleXml. Инструкция о генерации приведена в разделе Генерация титула отправителя.

Чтобы сгенерировать документ, нужно получить необходимую информацию из метода GetDocumentTypes (V2). Инструкция о получении данных для титула из метода GetDocumentTypes приведена в разделе Данные для генерации титула.

Из ответа метода GetDocumentTypes для счета-фактуры возьмем следующие значения для параметров метода GenerateTitleXml:

  • documentTypeNamedId = Invoice

  • documentFunction = default

  • documentVersion = utd970_05_03_01

  • titleIndex = 0

Документы СФ, ИСФ, КСФ, ИКСФ — однотитульные, поэтому значение titleIndex для них всегда будет равно нулю.

Кроме этого нужно подготовить содержимое документа — упрощенный XML-файл UserDataXml.

С помощью полученных данных можно сгенерировать документ методом GenerateTitleXml.

Пример HTTP-запроса метода GenerateTitleXml:

POST GenerateTitleXml?boxId={{boxId}}&documentTypeNamedId=Invoice&documentFunction=default&documentVersion=utd970_05_03_01&titleIndex=0 HTTP/1.1
Host: diadoc-api.kontur.ru
Authorization: Bearer {{access_token}}
Content-Type: application/xml; charset=utf-8

Пример тела запроса метода GenerateTitleXml (UserDataXml):

<?xml version="1.0" encoding="utf-8"?>
<UniversalTransferDocument DocumentDate="01.03.2025" DocumentNumber="123456" Currency="643" Function="СЧФ" SenderFnsParticipantId="2BM-6125600311-732644811-202407101103418496883" RecipientFnsParticipantId="2BM-9147414342-757645784-202407101104400484330" DocumentCreator="Организация-отправитель, ИНН 6125600311, КПП 732644811" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <Sellers>
    <Seller>
      <OrganizationDetails FnsParticipantId="2BM-6125600311-732644811-202407101103418496883" OrgType="2" OrgName="Организация-отправитель" Inn="6125600311" Kpp="732644811">
        <Address>
          <GarAddress AddressCode="03510210-e5f3-4bc6-bbd2-24d7fe25b3ed" Region="72" ZipCode="450133" LandPlot="ЗемелУчасток">
            <MunicipalTerritory Type="1" NameOrNumber="МуниципРайон-Наим"/>
            <UrbanSettlement Type="1" NameOrNumber="ГородСелПоселен-Наим"/>
            <Locality Type="НаселенПункт" NameOrNumber="НаселенПункт-Наим"/>
            <ElementPlanningStructure Type="ЭлПланСтруктур" NameOrNumber="ЭлПланСтруктур-Наим"/>
            <ElementRoadNetwork Type="ЭлУлДорСети" NameOrNumber="ЭлУлДорСети-Наим"/>
            <Buildings>
              <Building Type="Здание" NameOrNumber="Здание-Номер"/>
            </Buildings>
            <RoomBuilding Type="ПомещЗдания" NameOrNumber="ПомещЗдания-Номер"/>
            <RoomApartment Type="ПомещКвартиры" NameOrNumber="ПомещКвартиры-Номер"/>
          </GarAddress>
        </Address>
      </OrganizationDetails>
    </Seller>
  </Sellers>
  <PaymentDocuments>
    <Document Number="123456" Date="01.03.2025" />
  </PaymentDocuments>
  <DocumentShipments>
    <DocumentShipment DocumentName="Документ об отгрузке" DocumentNumber="123" DocumentDate="01.03.2025" />
  </DocumentShipments>
  <Buyers>
    <Buyer>
      <OrganizationDetails FnsParticipantId="2BM-9147414342-757645784-202407101104400484330" OrgType="2" OrgName="Организация-отправитель" Inn="6125600311" Kpp="732644811">
        <Address>
          <RussianAddress Region="66" ZipCode="987654" City="Екатеринбург" Street="Павлодарская" Building="17" />
        </Address>
      </OrganizationDetails>
    </Buyer>
  </Buyers>
  <Table TotalWithVatExcluded="1230.00" Vat="246.00" Total="1476.00">
    <Item TaxRate="TwentyPercent" Product="Позиция" Quantity="10" Price="123.00" SubtotalWithVatExcluded="1230.00" Vat="246.00" Subtotal="1476.00" />
  </Table>
  <Signers>
    <Signer SignerPowersConfirmationMethod="6">
      <Fio FirstName="Имя" LastName="Фамилия" MiddleName="Отчество" />
      <Position PositionSource="Manual">Должность</Position>
    </Signer>
  </Signers>
</UniversalTransferDocument>

Пример тела ответа метода GenerateTitleXml:

<?xml version="1.0" encoding="windows-1251"?>
<Файл ИдФайл="ON_NSCHFDOPPR_2BM-9147414342-757645784-202407101104400484330_2BM-6125600311-732644811-202407101103418496883_20250829_654bf61c-1e92-4094-95ae-a2f153aef4f6_0_0_0_0_0_00" ВерсФорм="5.03" ВерсПрог="Diadoc 1.0">
  <Документ КНД="1115131" ВремИнфПр="16.34.17" ДатаИнфПр="29.08.2025" Функция="СЧФ" НаимЭконСубСост="Организация-отправитель, ИНН 6125600311, КПП 732644811">
    <СвСчФакт НомерДок="123456" ДатаДок="01.03.2025">
      <СвПрод>
        <ИдСв>
          <СвЮЛУч НаимОрг="Организация-отправитель" ИННЮЛ="6125600311" КПП="732644811" />
        </ИдСв>
        <Адрес>
          <АдрГАР ИдНом="03510210-e5f3-4bc6-bbd2-24d7fe25b3ed" Индекс="450133">
            <Регион>72</Регион>
            <НаимРегион>Тюменская область</НаимРегион>
            <МуниципРайон ВидКод="1" Наим="МуниципРайон-Наим" />
            <ГородСелПоселен ВидКод="1" Наим="ГородСелПоселен-Наим" />
            <НаселенПункт Вид="НаселенПункт" Наим="НаселенПункт-Наим" />
            <ЭлПланСтруктур Тип="ЭлПланСтруктур" Наим="ЭлПланСтруктур-Наим" />
            <ЭлУлДорСети Тип="ЭлУлДорСети" Наим="ЭлУлДорСети-Наим" />
            <ЗемелУчасток>ЗемелУчасток</ЗемелУчасток>
            <Здание Тип="Здание" Номер="Здание-Номер" />
            <ПомещЗдания Тип="ПомещЗдания" Номер="ПомещЗдания-Номер" />
            <ПомещКвартиры Тип="ПомещКвартиры" Номер="ПомещКвартиры-Номер" />
          </АдрГАР>
        </Адрес>
      </СвПрод>
      <СвПРД НомерПРД="123456" ДатаПРД="01.03.2025" />
      <ДокПодтвОтгрНом РеквНаимДок="Документ об отгрузке" РеквНомерДок="123" РеквДатаДок="01.03.2025" />
      <СвПокуп>
        <ИдСв>
          <СвЮЛУч НаимОрг="Организация-отправитель" ИННЮЛ="6125600311" КПП="732644811" />
        </ИдСв>
        <Адрес>
          <АдрРФ КодРегион="66" НаимРегион="Свердловская область" Индекс="987654" Город="Екатеринбург" Улица="Павлодарская" Дом="17" />
        </Адрес>
      </СвПокуп>
      <ДенИзм КодОКВ="643" НаимОКВ="Российский рубль" />
    </СвСчФакт>
    <ТаблСчФакт>
      <СведТов НомСтр="1" НалСт="20%" НаимТов="Позиция" КолТов="10" ЦенаТов="123.00" СтТовБезНДС="1230.00" СтТовУчНал="1476.00">
        <ДопСведТов />
        <Акциз>
          <БезАкциз>без акциза</БезАкциз>
        </Акциз>
        <СумНал>
          <СумНал>246.00</СумНал>
        </СумНал>
      </СведТов>
      <ВсегоОпл СтТовБезНДСВсего="1230.00" СтТовУчНалВсего="1476.00">
        <СумНалВсего>
          <СумНал>246.00</СумНал>
        </СумНалВсего>
      </ВсегоОпл>
    </ТаблСчФакт>
    <Подписант СпосПодтПолном="6" Должн="Должность">
      <ФИО Фамилия="Фамилия" Имя="Имя" Отчество="Отчество" />
    </Подписант>
  </Документ>
</Файл>

Отправка счета-фактуры

Сформированный счет-фактуру можно подписать и отправить покупателю с помощью метода PostMessage (V3), передав его в поле DocumentAttachment структуры MessageToPost. Инструкция об отправке документа приведена в разделе Отправка документа.

Обратите внимание, что в документе должны быть заполнены данные подписанта. Указать их можно либо сразу при генерации счета-фактуры, либо с помощью процедуры подготовки к подписанию.

В структуре DocumentAttachment укажите значения, которые были получены для генерации методом GetDocumentTypes (V2):

  • TypeNamedId = Invoice

  • Function = default

  • Version = utd970_05_03_01

Пример тела запроса метода PostMessage:

{
    "FromBoxId": "{{boxId_sender}}",
    "ToBoxId": "{{boxId_recipient}}",
    "DocumentAttachments": [
        {
            "SignedContent": {
                "Content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0...NC50Ls+",        // содержимое XML-файла в кодировке base-64
                "Signature": "MIIN5QYJKoZIhvcNAQcCoIIN1jCCDdIA...kA9MJfsplqgW"         // содержимое файла подписи в кодировке base-64
            },
            "TypeNamedId": "Invoice",
            "Function": "default",
            "Version": "utd970_05_03_01"
        }
    ]
}

После отправки документа:

  • Диадок автоматически сформирует подтверждение оператора о дате получения документа и отправит его продавцу и покупателю. Получить его можно по инструкции Получение подтверждения оператора.

  • Покупатель должен сформировать извещение о получении документа и отправить его продавцу. Получить его можно по инструкции Получение извещения о получении.

Получение счета-фактуры в ящике покупателя

Покупатель может найти входящий счет-фактуру в своем ящике с помощью чтения ленты событий или с помощью поиска. Инструкция о получении документов приведена на странице Получение документов.

Чтобы найти СФ, ИСФ, КСФ или ИКСФ в ящике покупателя через поиск, передайте в метод GetDocuments (V3) значения параметров:

  • boxId — идентификатор ящика покупателя,

  • filterCategory = Invoice.InboundNotFinished — для СФ,

  • filterCategory = InvoiceRevision.InboundNotFinished — для ИСФ,

  • filterCategory = InvoiceCorrection.InboundNotFinished — для КСФ,

  • filterCategory = InvoiceCorrectionRevision.InboundNotFinished — для ИКСФ.

Пример HTTP-запроса метода GetDocuments:

GET /V3/GetDocuments?filterCategory=Invoice.InboundNotFinished&boxId={{boxId}} HTTP/1.1
Host: diadoc-api.kontur.ru
Authorization: Bearer {{access_token}}
Accept: application/json
Content-Type: application/json charset=utf-8

Из полученного в ответе метода списка DocumentList можно получить информацию о каждом документе. Инструкция приведена в разделе Получение информации о найденных документах.

После того как покупатель получил счет-фактуру, он должен сформировать и отправить извещение о получении.

Генерация и отправка извещения о получении счета-фактуры

На полученный счет-фактуру покупатель должен сгенерировать и отправить в ответ подписанное извещение о получении (ИоП) счета-фактуры.

Сгенерировать ИоП можно с помощью метода GenerateReceiptXml (V2), а отправить с помощью метода PostMessagePatch (V3) или PostMessagePatch (V4). Инструкция о генерации и отправке ИоП приведена в разделе Генерация и отправка извещения о получении.

После того как покупатель отправит ИоП, Диадок автоматически сформирует подтверждение оператора о дате получения ИоП и отправит его продавцу и покупателю. О том, как получить подтверждение оператора, написано в разделе Получение подтверждения оператора.

После этого документооборот счета-фактуры считается завершенным, никакие действия по документу больше не требуются.

Парсинг счета-фактуры

Чтобы получить данные из полученного счета-фактуры, используйте метод ParseTitleXml. Инструкция о парсинге приведена на странице Парсинг формализованного документа.

В теле запроса метода ParseTitleXml нужно передать XML-файл полученного документа.

Пример HTTP-запроса метода ParseTitleXml:

POST /ParseTitleXml?boxId={{boxId}}&documentTypeNamedId=Invoice&documentFunction=default&documentVersion=utd970_05_03_01&titleIndex=0 HTTP/1.1
Host: diadoc-api.kontur.ru
Authorization: Bearer {{access_token}}
Content-Type: application/xml; charset=utf-8

Пример тела запроса метода ParseTitleXml:

<?xml version="1.0" encoding="windows-1251"?>
<Файл ИдФайл="ON_NSCHFDOPPR_2BM-9147414342-757645784-202407101104400484330_2BM-6125600311-732644811-202407101103418496883_20250829_654bf61c-1e92-4094-95ae-a2f153aef4f6_0_0_0_0_0_00" ВерсФорм="5.03" ВерсПрог="Diadoc 1.0">
  <Документ КНД="1115131" ВремИнфПр="16.34.17" ДатаИнфПр="29.08.2025" Функция="СЧФ" НаимЭконСубСост="Организация-отправитель, ИНН 6125600311, КПП 732644811">
    <СвСчФакт НомерДок="123456" ДатаДок="01.03.2025">
      <СвПрод>
        <ИдСв>
          <СвЮЛУч НаимОрг="Организация-отправитель" ИННЮЛ="6125600311" КПП="732644811" />
        </ИдСв>
        <Адрес>
          <АдрГАР ИдНом="03510210-e5f3-4bc6-bbd2-24d7fe25b3ed" Индекс="450133">
            <Регион>72</Регион>
            <НаимРегион>Тюменская область</НаимРегион>
            <МуниципРайон ВидКод="1" Наим="МуниципРайон-Наим" />
            <ГородСелПоселен ВидКод="1" Наим="ГородСелПоселен-Наим" />
            <НаселенПункт Вид="НаселенПункт" Наим="НаселенПункт-Наим" />
            <ЭлПланСтруктур Тип="ЭлПланСтруктур" Наим="ЭлПланСтруктур-Наим" />
            <ЭлУлДорСети Тип="ЭлУлДорСети" Наим="ЭлУлДорСети-Наим" />
            <ЗемелУчасток>ЗемелУчасток</ЗемелУчасток>
            <Здание Тип="Здание" Номер="Здание-Номер" />
            <ПомещЗдания Тип="ПомещЗдания" Номер="ПомещЗдания-Номер" />
            <ПомещКвартиры Тип="ПомещКвартиры" Номер="ПомещКвартиры-Номер" />
          </АдрГАР>
        </Адрес>
      </СвПрод>
      <СвПРД НомерПРД="123456" ДатаПРД="01.03.2025" />
      <ДокПодтвОтгрНом РеквНаимДок="Документ об отгрузке" РеквНомерДок="123" РеквДатаДок="01.03.2025" />
      <СвПокуп>
        <ИдСв>
          <СвЮЛУч НаимОрг="Организация-отправитель" ИННЮЛ="6125600311" КПП="732644811" />
        </ИдСв>
        <Адрес>
          <АдрРФ КодРегион="66" НаимРегион="Свердловская область" Индекс="987654" Город="Екатеринбург" Улица="Павлодарская" Дом="17" />
        </Адрес>
      </СвПокуп>
      <ДенИзм КодОКВ="643" НаимОКВ="Российский рубль" />
    </СвСчФакт>
    <ТаблСчФакт>
      <СведТов НомСтр="1" НалСт="20%" НаимТов="Позиция" КолТов="10" ЦенаТов="123.00" СтТовБезНДС="1230.00" СтТовУчНал="1476.00">
        <ДопСведТов />
        <Акциз>
          <БезАкциз>без акциза</БезАкциз>
        </Акциз>
        <СумНал>
          <СумНал>246.00</СумНал>
        </СумНал>
      </СведТов>
      <ВсегоОпл СтТовБезНДСВсего="1230.00" СтТовУчНалВсего="1476.00">
        <СумНалВсего>
          <СумНал>246.00</СумНал>
        </СумНалВсего>
      </ВсегоОпл>
    </ТаблСчФакт>
    <Подписант СпосПодтПолном="6" Должн="Должность">
      <ФИО Фамилия="Фамилия" Имя="Имя" Отчество="Отчество" />
    </Подписант>
  </Документ>
</Файл>

Пример тела ответа метода ParseTitleXml:

<?xml version="1.0" encoding="utf-8"?>
<UniversalTransferDocument DocumentDate="01.03.2025" DocumentNumber="123456" Currency="643" Function="СЧФ" SenderFnsParticipantId="2BM-6125600311-732644811-202407101103418496883" RecipientFnsParticipantId="2BM-9147414342-757645784-202407101104400484330" DocumentCreator="Организация-отправитель, ИНН 6125600311, КПП 732644811" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <Sellers>
    <Seller>
      <OrganizationDetails FnsParticipantId="2BM-6125600311-732644811-202407101103418496883" OrgType="2" OrgName="Организация-отправитель" Inn="6125600311" Kpp="732644811">
        <Address>
          <GarAddress AddressCode="03510210-e5f3-4bc6-bbd2-24d7fe25b3ed" Region="72" ZipCode="450133" LandPlot="ЗемелУчасток">
            <MunicipalTerritory Type="1" NameOrNumber="МуниципРайон-Наим" />
            <UrbanSettlement Type="1" NameOrNumber="ГородСелПоселен-Наим" />
            <Locality Type="НаселенПункт" NameOrNumber="НаселенПункт-Наим" />
            <ElementPlanningStructure Type="ЭлПланСтруктур" NameOrNumber="ЭлПланСтруктур-Наим" />
            <ElementRoadNetwork Type="ЭлУлДорСети" NameOrNumber="ЭлУлДорСети-Наим" />
            <Buildings>
              <Building Type="Здание" NameOrNumber="Здание-Номер" />
            </Buildings>
            <RoomBuilding Type="ПомещЗдания" NameOrNumber="ПомещЗдания-Номер" />
            <RoomApartment Type="ПомещКвартиры" NameOrNumber="ПомещКвартиры-Номер" />
          </GarAddress>
        </Address>
      </OrganizationDetails>
    </Seller>
  </Sellers>
  <PaymentDocuments>
    <Document Number="123456" Date="01.03.2025" />
  </PaymentDocuments>
  <DocumentShipments>
    <DocumentShipment DocumentName="Документ об отгрузке" DocumentNumber="123" DocumentDate="01.03.2025" />
  </DocumentShipments>
  <Buyers>
    <Buyer>
      <OrganizationDetails FnsParticipantId="2BM-9147414342-757645784-202407101104400484330" OrgType="2" OrgName="Организация-отправитель" Inn="6125600311" Kpp="732644811">
        <Address>
          <RussianAddress Region="66" ZipCode="987654" City="Екатеринбург" Street="Павлодарская" Building="17" />
        </Address>
      </OrganizationDetails>
    </Buyer>
  </Buyers>
  <Table TotalWithVatExcluded="1230.00" Vat="246.00" Total="1476.00">
    <Item TaxRate="TwentyPercent" Product="Позиция" Quantity="10" Price="123.00" SubtotalWithVatExcluded="1230.00" Vat="246.00" Subtotal="1476.00" />
  </Table>
  <Signers>
    <Signer SignerPowersConfirmationMethod="6">
      <Fio FirstName="Имя" LastName="Фамилия" MiddleName="Отчество" />
      <Position PositionSource="Manual">Должность</Position>
    </Signer>
  </Signers>
</UniversalTransferDocument>

Отправка уведомления об уточнении счета-фактуры

Если покупатель обнаружил в полученном счете-фактуре ошибку, он может запросить его исправление или корректировку.

Чтобы создать запрос на исправление или корректировку счета-фактуры, нужно сформировать уведомление об уточнении с помощью метода GenerateInvoiceCorrectionRequestXml (V2) и отправить его с помощью метода PostMessagePatch (V3) или PostMessagePatch (V4). Инструкция о генерации уведомления об уточнении приведена в разделе Генерация уведомления об уточнении.

После отправки уведомления об уточнении Диадок автоматически сформирует подтверждение оператора о дате получения документа и отправит его продавцу и покупателю. Получить его можно по инструкции Получение подтверждения оператора.

Пример использования C# SDK

Ниже приведены примеры кода на C# с использованием SDK для работы со счетом-фактурой.

Отправка счета-фактуры

// Для работы с документами в Диадоке нужен авторизационный токен. Информация о нем приведена на странице «Авторизация».
public static string AuthTokenCert;

public static string BoxId = "идентификатор ящика отправителя";

// Генерация счета-фактуры
public static GeneratedFile GenerateInvoiceXml()
{
    var content = new InvoiceInfo();
    return Api.GenerateInvoiceXml(AuthTokenCert, content);
}

// Отправка счета-фактуры
public static Message SendInvoiceXml()
{
    var invoice = GenerateInvoiceXml();
    var messageAttachment = new XmlDocumentAttachment
    {
        SignedContent = new SignedContent
        {
            Content = invoice.Content,
            // Подпись отправителя
            Signature = Crypt.Sign(invoice.Content, ReadCertContent("путь к сертификату"))
        }
    };
    var messageToPost = new MessageToPost
    {
        FromBoxId = BoxId,
        ToBoxId = "идентификатор ящика получателя",
        Invoices =
        {
            messageAttachment
        }
    };
    return Api.PostMessage(AuthTokenCert, messageToPost);
}

// Получение извещения о получении счета-фактуры
public static byte[] GetInvoiceReceipt(Message invoiceMessage)
{
    var receiptEntityId = "";
    foreach (var entity in invoiceMessage.Entities)
    {
        if (entity.AttachmentType == AttachmentType.InvoiceReceipt && entity.ParentEntityId == invoiceMessage.Entities[0].EntityId)
        {
            receiptEntityId = entity.EntityId;
        }
    }

    return Api.GetEntityContent(AuthTokenCert, BoxId, invoiceMessage.MessageId, receiptEntityId);
}

public static void Main()
{
    var invoiceMessage = SendInvoiceXml();

    // Оператор формирует подтверждение в течение нескольких секунд
    // Для получения сообщения с подтверждением нужно вызвать метод GetMessage()
    var invoiceMessageWithConfirmation = Api.GetMessage(AuthTokenCert, BoxId, invoiceMessage.MessageId);

    // Технический документ можно получить в виде массива байтов
    // Для получения сообщения с новыми вложениями нужно снова вызвать метод GetMessage()
    var invoiceMessageWithReceipt = Api.GetMessage(AuthTokenCert, BoxId, invoiceMessage.MessageId);

    // Технический документ можно получить в виде массива байтов
    var invoiceReceipt = GetInvoiceReceipt(invoiceMessageWithReceipt);
}

Получение счета-фактуры

// Для работы с документами в Диадоке нужен авторизационный токен. Информация о нем приведена на странице «Авторизация».
public static string AuthTokenCert;

// Для работы с документом необходимо знать его уникальный идентификатор. Узнать его можно, например, выполнив поиск документов по заданным параметрам.
public static string BoxId = "идентификатор ящика получателя";

// Получение списка всех счетов-фактур, по которым не завершен документооборот
public static DocumentList SearchInboundInvoicesDocumentsWithNotFinishedDocflow()
{
    // Параметры, по которым осуществляется фильтрация
    var filterCategory = "Invoice.InboundNotFinished";
    var counteragentBoxId = "идентификатор ящика отправителя";

    return Api.GetDocuments(
    AuthTokenCert,
    new DocumentsFilter
    {
        BoxId = BoxId,
        CounteragentBoxId = counteragentBoxId,
        FilterCategory = filterCategory
    });
}

// Получение сообщения, содержащего счет-фактуру
public static Message GetInvoice()
{
    // Выбираем конкретный документ из полученного ранее списка, например, самый первый.
    var document = SearchInboundInvoicesDocumentsWithNotFinishedDocflow().Documents[0];

    // Получение счета-фактуры
    return Api.GetMessage(AuthTokenCert, BoxId, document.MessageId, document.EntityId);
}

// Формирование и отправка извещения о получении счета-фактуры
public static void SendInvoiceReceipt(Entity invoiceDocument)
{
    var receipt = Api.GenerateReceiptXml(
        AuthTokenCert,
        BoxId,
        invoiceDocument.DocumentInfo.MessageId,
        invoiceDocument.EntityId,
        new Signer
        {
            // Подпись получателя
            SignerCertificate = ReadCertContent("путь к сертификату"),
            SignerDetails = new SignerDetails()
        }
    );

    var receiptAttachment = new ReceiptAttachment
    {
        ParentEntityId = invoiceDocument.EntityId,
        SignedContent = new SignedContent
        {
            Content = receipt.Content,
            // Подпись получателя
            Signature = Crypt.Sign(receipt.Content, ReadCertContent("путь к сертификату"))
        }
    };

    var receiptPatch = new MessagePatchToPost
    {
        BoxId = BoxId,
        MessageId = invoiceDocument.DocumentInfo.MessageId,
        Receipts =
        {
            receiptAttachment
        }
    };

    Api.PostMessagePatch(AuthTokenCert, receiptPatch);
}

public static void Main()
{
    var invoiceMessage = GetInvoice();
    var invoiceDocument = invoiceMessage.Entities.First(entity => entity.AttachmentType == AttachmentType.Invoice);

    // Отправка извещения о получении счета-фактуры
    SendInvoiceReceipt(invoiceDocument);
}

Отправка уведомления об уточнении счета-фактуры

// Формирование уведомления об уточнении счета-фактуры
public static GeneratedFile GetInvoiceCorrectionRequest(Document invoiceDocument)
{
    var invoiceCorrectionRequestInfo = new InvoiceCorrectionRequestInfo()
    {
        ErrorMessage = "Текст уведомления об уточнении",
        Signer = new Signer()
        {
            // Подпись отправителя
            SignerCertificate = ReadCertContent("путь к сертификату"),
            SignerDetails = new SignerDetails()
            {
                //Заполняется согласно структуре SignerDetails
            }
        }
    };
    return Api.GenerateInvoiceCorrectionRequestXml(AuthTokenCert, BoxId, invoiceDocument.MessageId, invoiceDocument.EntityId, invoiceCorrectionRequestInfo);
}

// Отправка уведомления об уточнении счета-фактуры
public static void SendInvoiceCorrectionRequest(Document invoiceDocument)
{
    var invoiceCorrectionRequest = GetInvoiceCorrectionRequest(invoiceDocument);

    var messagePatchToPost = new MessagePatchToPost
    {
        MessageId = invoiceDocument.MessageId,
        CorrectionRequests =
        {
            new CorrectionRequestAttachment
            {
                ParentEntityId = invoiceDocument.EntityId,
                SignedContent = new SignedContent // файл подписи
                {
                    Content = invoiceCorrectionRequest.Content,
                    // Подпись получателя
                    Signature = Crypt.Sign(invoiceCorrectionRequest.Content, ReadCertContent("путь к сертификату"))
                }
            }
        }
    };
    Api.PostMessagePatch(AuthTokenCert, messagePatchToPost);
}

public static void Main()
{
    var invoiceDocument = GetInvoice().Entities.First(entity => entity.AttachmentType == AttachmentType.Invoice);;
    SendInvoiceCorrectionRequest(invoiceDocument);
}