Повторное выполнение последней операции
=======================================

.. code:: abap
    
    *"----------------------------------------------------------------------
    *"*"Локальный интерфейс:
    *"  IMPORTING
    *"     VALUE(IV_RECORD_ID) TYPE  /TRL/XDE_HEADER-RECORD_ID
    *"     VALUE(IV_ONLY_CHECK) TYPE  XFELD OPTIONAL
    *"  EXPORTING
    *"     VALUE(ES_RETURN) TYPE  /TRL/XDE_RETURN
    *"----------------------------------------------------------------------
    
Функциональный модуль ``/TRL/XDE_API_SHIPM_SEND_AGAIN`` выполняет повторно последнюю операцию, завершившуюся с ошибкой. Отправка должна быть в статусе E. Список возможных операций для повторного выполнения:

* подписание/отклонение входящей отправки;
* подтверждение/отклонение запроса на аннулирование;
* исходящая отправка документов;
* создание запроса на аннулирование.

.. table:: Описание интерфейса функционального модуля ``/TRL/XDE_API_SHIPM_SEND_AGAIN``
   :align: center
   :widths: 2 8
    
   +------------------------------------+-------------------------------------------------------------------------------------------------------+
   | Параметр                           | Описание                                                                                              |
   +====================================+=======================================================================================================+
   | ``IMPORTING``                                                                                                                              |
   +------------------------------------+-------------------------------------------------------------------------------------------------------+
   | ``IV_RECORD_ID``                   | Уникальный идентификатор отправки.                                                                    |
   +------------------------------------+-------------------------------------------------------------------------------------------------------+
   | ``IV_ONLY_CHECK``                  | Если равен «X», то выполняется проверка возможности повторного выполнения операции,                   |
   |                                    | завершившейся с ошибкой. При этом повторного выполнения операции не выполняется.                      |
   +------------------------------------+-------------------------------------------------------------------------------------------------------+
   | ``EXPORTING``                                                                                                                              |
   +------------------------------------+-------------------------------------------------------------------------------------------------------+
   | ``ES_RETURN``                      | Код и описание ошибки в случае, если операцию выполнить не удалось.                                   |
   +------------------------------------+-------------------------------------------------------------------------------------------------------+

Если ФМ запущен не в режиме проверки – ставим блокировку по номеру отправления.

* Если блокировка не удалась, то ``es_return-code`` присваивается «1011» (ошибка блокирования записи). Также в ``es_return-text`` записывается текущее системное сообщение, после этого происходит выход из ФМ.

Получаем данные по номеру отправления с помощью ФМ ``/TRL/XDE_GET_SHIPMENTS``.

* Проверка результата работы ФМ ``/TRL/XDE_GET_SHIPMENTS``. Если результат не успешен – ``es_return-code`` заполняется значением «1106» (Не удалось найти отправление).
  Поле ``es_return-text`` заполняется текстом «Внутренняя ошибка. Не удалось найти объект "Отправление"». Снимаем блокировки и выходим из ФМ ``/TRL/XDE_API_SHIPM_SEND_AGAIN``.

Проверяем полномочия на действие «18» (Отправить документ повторно).

* Если результат проверки не успешен – поле ``es_return-code`` заполняется значением «1013» (Проверка не пройдена).
  Поле ``es_return-text`` заполняется сообщением «Нет полномочий на выполнение операции». Снимаем блокировки и выходим из ФМ ``/TRL/XDE_API_SHIPM_SEND_AGAIN``.
  
Вызов метода для определения типа доступа для операции с помощью настроек, сделанных в таблице условий ``/TRL/XDE_CONDIT``.

* Если в результате работы метода получим, что тип доступа 03 (Операция запрещена) или 04 (Операция невозможна) – запишем в ``es_return-code`` «9999» (Критическая ошибка). 
  В ``es_return-text`` попадет «Операция невозможна». Снимаем блокировки и выходим из ФМ ``/TRL/XDE_API_SHIPM_SEND_AGAIN``.
  
  
С помощью множественного вызова метода для получения имени статуса по имени настройки – получаем данные о технических названиях статусов.
Проверяем, что в списке статусов первым стоит подходящий статус (Ожидает отправки контрагенту(подписан), ожидает отправки контрагенту(отклонен), готов к отправке контрагенту(исходящие). 
Либо вторая запись должна быть статусом «готов к отправке контрагенту(исходящие)».

* Во всех остальных случаях заполняем поле ``es_return-code`` значением «9999» (Критическая ошибка). Поле ``es_return-text`` заполняется текстом «В текущем статусе операция невозможна». 
  Снимаем блокировки и выходим из ФМ ``/TRL/XDE_API_SHIPM_SEND_AGAIN``.
  
Если для данного статус стоит флаг «Содержит комментарий» - считываем текст у бизнес-объекта по ключу и идентификатору текста.

Далее, если для данного оператора стоит настройка «обработать весь пакет» - ищем все отправления, ставим на них блокировку и выполняем проверку полномочий.

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

Если код статуса отправки «Аннулирование подтверждено» или «Ожидает отправки контрагенту(подписан)» и ФМ запущен не в режиме проверки – вызывается ФМ ``/TRL/XDE_API_SIGN_IN``.
Этот ФМ подписывает входящую отправку. Внутри ФМ выполняет проверки возможности выполнить необходимую операцию, находит настраиваемые ФМ для отклонения/подтверждения запроса аннулирования,
для согласования входящего документа, для отложенной отправки (только подписание) и в зависимости от условий – вызывает нужный ФМ.

Если код статуса отправки «Ожидает отправки контрагенту(отклонен)» или «Аннулирование отклонено» и ФМ запущен не в режиме проверки – вызывается ФМ ``/TRL/XDE_API_SIGN_IN`` с той разницей,
что в этот раз флаг согласования/отклонения не заполнен. Этот ФМ подписывает входящую отправку. Внутри ФМ выполняет проверки возможности выполнить необходимую операцию, находит настраиваемые 
ФМ для отклонения/подтверждения запроса аннулирования, для согласования входящего документа, для отложенной отправки (только подписание) и в зависимости от условий – вызывает нужный ФМ.


Если код статуса отправки «Ожидает отправки контрагенту (исходящие)», «Готов к отправке контрагенту (исходящие)», «Ожидание ответа от ИМ» и если ФМ запущен не в режиме проверки – 
запускается цикл по отправлениям и для каждого запускается ФМ ``/TRL/XDE_SET_STATUS_FOR_SHIPM``, который добавляет статус для отправки. Внутри выполняются проверки, 
что для данной отправки можно установить такой статус, проверяются уровни статусов, сохраняется комментарий и обновляются таблицы ``/TRL/XDE_HEADER``, ``/TRL/XDE_HDR_ATR``, ``/TRL/XDE_STATUS``, ``/TRL/XDE_SIGN``.

* Если в ходе выполнения ФМ ``/TRL/XDE_SET_STATUS_FOR_SHIPM`` возникли какие-либо особые ситуации – заполняем поле ``es_return-code`` значением «9999» (критическая ошибка). 
  Если текущее системное сообщение имеется – выводим его в поле ``es_return-text``, иначе выводим сообщение «Не удалось обновить статус отправления. Обратитесь в службу поддержки.».
  
  
Если код статуса отправки «Ожидает отправки контрагенту(подписан)» или «Ожидает отправки контрагенту(отклонен)» – получаем отпечаток сертификата, получаем данные по отправлению и 
данные документов для взаимодействия с ИМ. Затем вызывается ФМ ``/TRL/XDE_IM_SEND_IN``, который подписывает/отклоняет входящий документ (в зависимости от настроек работы с ИМ).
Затем, в случае серверного подписания – выбираются данные по отправлению и выполняется поиск настроенного ФМ
для подписания/отклонения и происходит, собственно, вызов ФМ. В случае локального подписания – вызываются ФМ ``/TRL/XDE_AcceptPacLocalSign`` или ``/TRL/XDE_RejectPacLocalSign``.
Если же настроена интеграция через WebAPI – ищем в настройках класс, реализующий интеграцию через WS. Если класс найден – вызываем метод SIGN_IN для серверного подписания или
``SIGN_IN_DOCUMENT_LOC_ACC`` для локального согласования, ``SIGN_IN_DOCUMENT_LOC_REJ`` для локального отклонения.

Затем вызывается ФМ ``/TRL/XDE_SET_STATUS_FOR_SHIPM``, который меняет статус документа.

Если код статуса отправки «Отправлен запрос на аннулирование» и ФМ запущен не в режиме проверки – вызывается ФМ ``/TRL/XDE_API_SHIPM_REVOKE_REQ``. Описание ФМ можно найти в предыдущем пункте.

В конце работы ФМ снимаются блокировки. На этом работа ФМ заканчивается.

Данная API функция предусматривает точки расширения для заказчика.

.. important::

    При использовании явных или неявных операторов ``COMMIT WORK`` и ``ROLLBACK WORK`` в расширениях корректная работа API-функций не гарантируется!

Функциональный модуль сортировки статусов
-----------------------------------------
    
Имя функционального модуля сортировки статусов находится в таблице ``/TRL/XDE_CUST`` по имени настройки ``FM_SORT_STATUS_NEW``.

.. image:: ris21.png
   :scale: 87
   :align: center
   :alt: Настройка ``FM_SORT_STATUS_NEW``

Правила для ФМ из этой настройки касаются интерфейса ФМ, см. в таблице ниже.

.. table:: Параметры модуля сортировки статусов
   :align: center
   :widths: 2 1 4
   
   +----------------------------+-------+------------------------------------+
   | Наименование параметра     | Тип   | Название словарного типа или класс |
   +============================+=======+====================================+
   | ``IMPORTING`` (попадают в ФМ)                                           |
   +----------------------------+-------+------------------------------------+
   | ``I_RECORD_ID``            | Тип   | ``/TRL/XDE_ED_RECORD_ID_EXT``      |
   +----------------------------+-------+------------------------------------+
   | ``I_COMMENT``              | Тип   | ``STRING``                         |
   +----------------------------+-------+------------------------------------+
   | ``IS_CERT``                | Тип   | ``/TRL/XDE_S_SAP_DOC_TYPE_CERT``   |
   +----------------------------+-------+------------------------------------+
   | ``I_ONLY_CHECK``           | Тип   | ``XFELD``                          |
   +----------------------------+-------+------------------------------------+
   | ``I_UNAME``                | Тип   | ``SYUNAME``                        |
   +----------------------------+-------+------------------------------------+
   | ``I_ACCEPT``               | Тип   | ``XFELD``                          |
   +----------------------------+-------+------------------------------------+
   | ``EXPORTING`` (результаты ФМ на выходе)                                 |
   +----------------------------+-------+------------------------------------+
   | ``ES_RETURN``              | Тип   | ``/TRL/XDE_RETURN``                |
   +----------------------------+-------+------------------------------------+
   | ``E_COMMENT``              | Тип   | ``STRING``                         |
   +----------------------------+-------+------------------------------------+

Функциональный модуль может иметь и другие параметры, но они должны быть необязательными.

Функциональный модуль, используемый по умолчанию, содержит внедрение BAdI ``/TRL/XDE_CHECK_BADI`` для выполнения кастомных проверок после проверок,
выполняемых в Продукте, выполняемых в методах ``CHECK_IN_REVOKE_ACCEPT`` и ``CHECK_IN_REVOKE_REJECT``. Кроме того, функциональный модуль, 
используемый по умолчанию, содержит внедрение BAdI ``/TRL/XDE_SHIPMENT_BADI`` для работы с отправлениями, а именно для возможности создания
комментария перед выводом диалогового окна пользователю. Создания комментария выполняется в методе ``SET_COMMENT``.

Функциональный модуль подписания входящих сообщений
---------------------------------------------------

Имя ФМ подписания входящих сообщений хранится в таблице ``/TRL/XDE_CUST`` по имени настройки ``FM_SHIP_IN_SIGN``.

.. image:: ris22.png
   :scale: 100 %
   :align: center
   :alt: Настройка ``FM_SHIP_IN_SIGN``

Правила для ФМ из этой настройки касаются интерфейса ФМ, см. в таблице ниже.

.. table:: Параметры модуля подписания входящих сообщений
   :align: center
   :widths: 2 1 4
   
   +----------------------------+-------+------------------------------------+
   | Наименование параметра     | Тип   | Название словарного типа или класс |
   +============================+=======+====================================+
   | ``IMPORTING`` (попадают в ФМ)                                           |
   +----------------------------+-------+------------------------------------+
   | ``I_RECORD_ID``            | Тип   | ``/TRL/XDE_ED_RECORD_ID_EXT``      |
   +----------------------------+-------+------------------------------------+
   | ``I_COMMENT``              | Тип   | ``STRING``                         |
   +----------------------------+-------+------------------------------------+
   | ``IS_CERT``                | Тип   | ``/TRL/XDE_S_SAP_DOC_TYPE_CERT``   |
   +----------------------------+-------+------------------------------------+
   | ``I_ONLY_CHECK``           | Тип   | ``XFELD``                          |
   +----------------------------+-------+------------------------------------+
   | ``I_UNAME``                | Тип   | ``SYUNAME``                        |
   +----------------------------+-------+------------------------------------+
   | ``I_ACCEPT``               | Тип   | ``XFELD``                          |
   +----------------------------+-------+------------------------------------+
   | ``I_SIGN_ONLY``            | Тип   | ``/TRL/XDE_ED_FLAG_SIGN``          |
   +----------------------------+-------+------------------------------------+
   | ``EXPORTING`` (результаты ФМ на выходе)                                 |
   +----------------------------+-------+------------------------------------+
   | ``ES_RETURN``              | Тип   | ``/TRL/XDE_RETURN``                |
   +----------------------------+-------+------------------------------------+
   | ``E_COMMENT``              | Тип   | ``STRING``                         |
   +----------------------------+-------+------------------------------------+

Функциональный модуль может иметь и другие параметры, но они должны быть необязательными.

Функциональный модуль отложенной отправки
-----------------------------------------

Имя ФМ определения отложенной отправки находится в таблице ``/TRL/XDE_CUST`` по имени настройки ``FM_SHIP_SIGN_ONLY``.
   
.. image:: ris23.png
   :scale: 100 %
   :align: center
   :alt: Настройка ``FM_SHIP_SIGN_ONLY``

Правила для ФМ из этой настройки касаются интерфейса ФМ, см. в таблице ниже.

.. table:: Параметры модуля отложенной отправки
   :align: center
   :widths: 2 1 4
   
   +----------------------------+-------+------------------------------------+
   | Наименование параметра     | Тип   | Название словарного типа или класс |
   +============================+=======+====================================+
   | ``IMPORTING`` (попадают в ФМ)                                           |
   +----------------------------+-------+------------------------------------+
   | ``IS_HEADER``              | Тип   | ``/TRL/XDE_HEADER``                |
   +----------------------------+-------+------------------------------------+
   | ``EXPORTING`` (на выход ФМ)                                             |
   +----------------------------+-------+------------------------------------+
   | ``EV_SIGN_ONLY``           | Тип   | ``/TRL/XDE_ED_FLAG_SIGN``          |
   +----------------------------+-------+------------------------------------+
   
Функциональный модуль может иметь и другие параметры, но они должны быть необязательными.

Функциональный модуль обработки события смены статуса отправления
-----------------------------------------------------------------

Имя ФМ обработки события смены статуса отправления находится в таблице ``/TRL/XDE_CUST`` по имени настройки ``FM_SET_EVENT``.

.. image:: ris24.png
   :scale: 62
   :align: center
   :alt: Настройка ``FM_SET_EVENT``

Правила для ФМ из этой настройки касаются интерфейса ФМ, см. в таблице ниже.

.. table:: Параметры модуля обработки события смены статуса отправления
   :align: center
   :widths: 2 1 4
   
   +----------------------------+-------+------------------------------------+
   | Наименование параметра     | Тип   | Название словарного типа или класс |
   +============================+=======+====================================+
   | ``IMPORTING`` (попадают в ФМ)                                           |
   +----------------------------+-------+------------------------------------+
   | ``IS_HEADER``              | Тип   | ``/TRL/XDE_HEADER``                |
   +----------------------------+-------+------------------------------------+
   | ``IS_STATUS``              | Тип   | ``/TRL/XDE_STATUS``                |
   +----------------------------+-------+------------------------------------+
   | ``TABLES`` (табличные параметры)                                        |
   +----------------------------+-------+------------------------------------+
   | ``IT_DOCUMENTS``           | Тип   | ``/TRL/XDE_T_DOCUMENTS``           |
   +----------------------------+-------+------------------------------------+
   
Функциональный модуль может иметь и другие параметры, но они должны быть необязательными.

Функциональный модуль для обработки после выставления статуса
-------------------------------------------------------------

Имя функционального модуля для обработки после выставления статуса содержится в таблице ``/TRL/XDE_STATE``, поле ``FMAST``.

.. image:: ris25.png
   :scale: 49
   :align: center
   :alt: Поле ``FMAST``


Правила для ФМ из этой настройки касаются интерфейса ФМ, см. в таблице ниже.

.. table:: Параметры модуля для обработки после выставления статуса
   :align: center
   :widths: 2 1 4
   
   +----------------------------+-------+------------------------------------+
   | Наименование параметра     | Тип   | Название словарного типа или класс |
   +============================+=======+====================================+
   | ``IMPORTING`` (попадают в ФМ)                                           |
   +----------------------------+-------+------------------------------------+
   | ``IS_HEADER``              | Тип   | ``/TRL/XDE_HEADER``                |
   +----------------------------+-------+------------------------------------+
   | ``IS_STATUS``              | Тип   | ``/TRL/XDE_STATUS``                |
   +----------------------------+-------+------------------------------------+
 
Функциональный модуль может иметь и другие параметры, но они должны быть необязательными.

Функциональный модуль интеграционного модуля по подписанию/отклонению входящей отправки
---------------------------------------------------------------------------------------

Имя ФМ интеграционного модуля по подписанию/отклонению входящей отправки хранится в таблице ``/TRL/XDE_CUST`` по имени настройки ``IM.FM_I_SIGN``.

.. image:: ris26.png
   :scale: 73
   :align: center
   :alt: Настройка ``IM.FM_I_SIGN``

Правила для ФМ из этой настройки касаются интерфейса ФМ, см. в таблице ниже.

.. table:: Параметры модуля интеграционного модуля по подписанию/отклонению входящей отправки
   :align: center
   :widths: 2 1 4
   
   +----------------------------+-------+------------------------------------+
   | Наименование параметра     | Тип   | Название словарного типа или класс |
   +============================+=======+====================================+
   | ``IMPORTING`` (попадают в ФМ)                                           |
   +----------------------------+-------+------------------------------------+
   | ``IV_DOCUMENT_ID``         | Тип   | ``/TRL/XDE_ED_RECORD_ID_EXT``      |
   +----------------------------+-------+------------------------------------+
   | ``IV_COMMENT``             | Тип   | ``CHAR`` (длиной 2048 символов)    |
   +----------------------------+-------+------------------------------------+
   | ``IV_CERT_NUM``            | Тип   | ``/TRL/XDE_ED_THUMBPRINT``         |
   +----------------------------+-------+------------------------------------+
   | ``IV_ACCEPT``              | Тип   | ``XFELD``                          |
   +----------------------------+-------+------------------------------------+
   | ``IT_SIGNEDDOCUMENTS``     | Тип   | ``/TRL/XDE_T_DOCUMENTS_IM``        |
   +----------------------------+-------+------------------------------------+
   | ``EXPORTING`` (на выход ФМ)                                             |
   +----------------------------+-------+------------------------------------+
   | ``ES_RETURN``              | Тип   | ``/TRL/XDE_RETURN``                |
   +----------------------------+-------+------------------------------------+

   
Функциональный модуль может иметь и другие параметры, но они должны быть необязательными.

Функциональный модуль для реализации интеграции через Web Service
-----------------------------------------------------------------

Имя класса для реализации интеграции через Web Service находится в таблице ``TRL/XDE_CUST`` по имени настройки ``IM.WS.FRM_CLASS``.

.. image:: ris27.png
   :scale: 73
   :align: center
   :alt: Настройка ``IM.WS.FRM_CLASS``



У этого класса вызывается несколько методов. 

Метод ``SIGN_IN_DOCUMENT`` для подписания/отклонения 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
.. table:: Параметры метода ``SIGN_IN_DOCUMENT``
   :align: center
   :widths: 2 1 4
   
   +----------------------------+-------+------------------------------------+
   | Наименование параметра     | Тип   | Название словарного типа или класс |
   +============================+=======+====================================+
   | ``IMPORTING`` (попадают в ФМ)                                           |
   +----------------------------+-------+------------------------------------+
   | ``IV_DOCUMENT_ID``         | Тип   | ``/TRL/XDE_ED_RECORD_ID_EXT``      |
   +----------------------------+-------+------------------------------------+
   | ``IV_COMMENT``             | Тип   | ``CHAR`` (длиной 2048 символов)    |
   +----------------------------+-------+------------------------------------+
   | ``IV_CERT_NUM``            | Тип   | ``/TRL/XDE_ED_THUMBPRINT``         |
   +----------------------------+-------+------------------------------------+
   | ``IV_ACCEPT``              | Тип   | ``XFELD``                          |
   +----------------------------+-------+------------------------------------+
   | ``IT_SIGNEDDOCUMENTS``     | Тип   | ``/TRL/XDE_T_DOCUMENTS_IM``        |
   +----------------------------+-------+------------------------------------+
   | ``RECEIVING`` (возвращается как результат)                              |
   +----------------------------+-------+------------------------------------+
   | ``ES_RETURN``              | Тип   | ``/TRL/XDE_RETURN``                |
   +----------------------------+-------+------------------------------------+

Метод ``SIGN_IN_DOCUMENT_LOC_ACC`` для локального подписания (принять)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. table:: Параметры метода ``SIGN_IN_DOCUMENT_LOC_ACC``
   :align: center
   :widths: 2 1 4
   
   +----------------------------+-------+------------------------------------+
   | Наименование параметра     | Тип   | Название словарного типа или класс |
   +============================+=======+====================================+
   | ``IMPORTING`` (попадают в ФМ)                                           |
   +----------------------------+-------+------------------------------------+
   | ``IV_DOCUMENT_ID``         | Тип   | ``/TRL/XDE_ED_RECORD_ID_EXT``      |
   +----------------------------+-------+------------------------------------+
   | ``IT_SIGNEDDOCUMENTS``     | Тип   | ``/TRL/XDE_T_DOCUMENTS_IM``        |
   +----------------------------+-------+------------------------------------+
   | ``RECEIVING`` (возвращается как результат)                              |
   +----------------------------+-------+------------------------------------+
   | ``ES_RETURN``              | Тип   | ``/TRL/XDE_RETURN``                |
   +----------------------------+-------+------------------------------------+
   
Метод ``SIGN_IN_DOCUMENT_LOC_REJ`` для локального подписания (отклонить)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. table:: Параметры метода ``SIGN_IN_DOCUMENT_LOC_REJ``
   :align: center
   :widths: 2 1 4
   
   +----------------------------+-------+------------------------------------+
   | Наименование параметра     | Тип   | Название словарного типа или класс |
   +============================+=======+====================================+
   | ``IMPORTING`` (попадают в ФМ)                                           |
   +----------------------------+-------+------------------------------------+   
   | ``IIV_DOCUMENT_ID``        | Тип   | ``/TRL/XDE_ED_RECORD_ID_EXT``      |
   +----------------------------+-------+------------------------------------+   
   | ``IIT_SIGNEDDOCUMENTS``    | Тип   | ``/TRL/XDE_T_DOCUMENTS_IM``        |
   +----------------------------+-------+------------------------------------+   
   | ``IRECEIVING`` (возвращается как результат)                             |
   +----------------------------+-------+------------------------------------+   
   | ``IES_RETURN``             | Тип   | ``/TRL/XDE_RETURN``                |
   +----------------------------+-------+------------------------------------+