// постановка exchange #2547
// реализована по #2409. все параметры конфигурации, функции и прочее
// взяты оттуда.
// здесь реализуется только сам ответ.
{~Exch2547_GenerateAnswerED244OnED243
  формирует ответ на документ aDocED243.
  параметры
    aDocED243 - объект OCX ED243;
    aDocPP - узел описания ЭД ПП.
  результат
    =true - функция отработана по exchange #2409.
            этот результат должен быть независимо от найденных ЭД ПП.
    =false - задача по #2409 не выполняется.
             этот результат формируется, если значение глобальной переменной
             vExch2409_GenerateAnswerOnED243=false.}
function Exch2547_GenerateAnswerED244OnED243( aED243: Variant;
                                              aDocPP_ID: string;
                                              aBudgetID: string;
                                              aExch_Name: string
                         //                     aDirIni: string;
                                              {aExchNumber: string}): boolean;



var
//  xSQL: string;
  i: Integer;
  xED243: Variant;
  xED244: Variant;
  xDocPPInfo: string;
  xXML: Variant;
  xXML_DocPP: variant;
//  xXml_DocLine: variant;
  s: string;
//  xFoundNumber: boolean;
  xFileIni: TIniFile;
//  xDate: TDateTime;
  xNow: TDateTime;
  xPacked: Variant;
  xFileED244: string;
  xFileED244_S: string;
  xFileED244_M: string;
  xFieldItem: Variant;
  xED244_EDNo: string;
//  SL: tstringlist;   // отладка
begin
  try
    if NOT vExch2409_GenerateAnswerOnED243 then begin
      // задача #2409 не должна выполняться и код должен работать по старому
      Result := FALSE;
      EXIT;
    end;

    Result := TRUE;   // ответ на ЭД 243



    // если ПП не найдено среди выгруженных:
    // сообщаем об ошибке и отправляем файл запроса к ошибкам
    if (LENGTH(aDocPP_ID) <= 0) then begin
      MoveToError('ЭД не найден в базе');
      EXIT;
    end;

    // полное описание ЭД по ID
    xXml := QueryXml( 'select * from PayOrder where ID=?', [ aDocPP_ID]);
    xXML_DocPP := xXml.documentElement.ChildNodes.Item[0];

    xDocPPInfo := FORMAT( 'Ответ на запрос по платежному документу № %s Дата: %s '
                          +' Сумма: %.2f ',
                          [ Trim( xXML_DocPP.getAttribute('DOC_NUMBER')),
                            FormatDateTime(
                                  'dd.mm.yyyy',
                                  XmlToDateTime(
                                          xXML_DocPP.getAttribute('DOC_DATE'))),
                            StrToCurr( xXML_DocPP.getAttribute('AMOUNT'))]);

    // ответ формируем только если версия форматов не ниже нужной
    if NOT vExch_2409_VersionCorrect then begin
      MoveToError( xDocPPInfo
                    + ' не сформирован. Необходима версия форматов не ниже 2.5.7');
      EXIT;
    end;

    // ФТ-6: проверяем номер запроса
    // запрос на проверку дублей =03 игнорируем, как и =00.
    if NOT (aED243.EDDefineRequestCode in [1,2,4,5,6,7,8]) then begin
      // на коды 0,3 ответ не формируем, но это не ошибка - ОТ
      if (aED243.EDDefineRequestCode in [0,3])
        then WriteInfo(
                      xDocPPInfo
                    + FORMAT( ' не сформирован. Код запроса в ЭС ED243 %s не предусматривает ответ ED244.',
                              // здесь номер кода расшифровываем
                              [ scRequestCode[
                                    StrToInt( aED243.EDDefineRequestCode)]]))
        else MoveToError(
                      xDocPPInfo
                    + FORMAT( ' не сформирован. Код запроса в ЭС ED243 имеет непредусмотренное значение: %s.',
                // поскольку заранее номер кода неизвестен, а таблица имеет только
                // определенное описание кодов, то вместо строковой расшифровки
                // даем только номер кода.
                              [ aED243.EDDefineRequestCode]));
      EXIT;
    end;

//writeinfo('xXML_DocPP:'+#13#10+xXML_DocPP.xml);

    // фиксируем текущую системную дату
    xNOW := NOW;

    // файлы не созданы
    xFileED244 := '';
    xFileED244_S := '';
    xFileED244_M := '';
    try
      // создание пакета
      try
        xED244 := CreateOleObject('Ufebs.ED244');
        // заголовок пакета
        xED244.FormatVer := vExch_2409_FormatVersion;
        xED244.DirSchems := vExch_2409_DirSchems;
        xED244.NSType[0] := 'ed';
        // параметры шифрования пакета
        xED244.EnvelopeCrypted    := vExch_2409_EnvelopeCrypted;
        xED244.OIDEncrypt         := vExch_2409_OIDEncrypt;
        xED244.EnvelopeCompessed  := vExch_2409_EnvelopeCompessed;
    //    xED244.SystemCode         := vExch_2409_SystemCode;//'01';// FSystemCode;
        except
          ExceptionLog( 'Сбой создания ED244.');
      end;

      //отладка
      //  xED244.DirSchems := 'd:\work\AzkScript\aED244\ufebsSchems\2.5.7';

      { Номер электронного документа.
        этот номер будем вести в отдельном ini файле. он будет уникальным
        для пакетов ответов в течении одного дня.
        файл такой:
          [ПАКЕТЫ]
          ДАТА=yyyy/mm/dd
          НОМЕР=N
        где:
          ДАТА - дата последнего формируемого ответа.
          НОМЕР - номер последнего сформированного пакета.
        если файл пустой или текущая дата не совпадает с указанной в параметре
        ДАТА, то новый номер начинается с единицы. после каждого формирования
        пакета ответа номер инкрементируется и файл перезаписывается, а поле
        ДАТА подставляется текущая системная дата.}
      try
      (*
        xFileIni:= TIniFile.Create( vExch_2409_FileDatED244);
        try
          xED244.EDNo := 1;
          // ожидается строка: yyyyXmmXdd
          // где: X - любой разделитель ("/" или "-" или ".")
          // если строка содержит 10 символов, выделяем подстроки гггг,мм,дд и
          // сравниваем их со значением текущей системной даты.
          // в случае любых ошибок (преобразований строка->число), неверный формат
          // строки в поле ДАТА, перехватываем исключение и номер пакета начинаем
          // с единицы. если дата совпадает с системной, считываем номер последнего
          // пакета из поля НОМЕР, инкрементируем его и это и будет номер нового
          // пакета ответа.
          s := TRIM( xFileIni.ReadString( 'ПАКЕТЫ', 'ДАТА', ''));
          if (LENGTH(s) >= 10) then
            try
{
showmessage( 'дата = "'+s+'"'
            +#13#10'день='+inttostr(DayOf( xNOW))+' - файл:"'+inttostr(STRTOINT( COPY( s, 9, 2)))+'"'
            +#13#10'мес='+inttostr(MonthOf( xNOW))+' - файл:"'+inttostr(STRTOINT( COPY( s, 6, 2)))+'"'
            +#13#10'год='+inttostr(YearOf( xNOW))+' - файл:"'+inttostr(STRTOINT( COPY( s, 1, 4)))+'"'
            );
}
              if (( DayOf( xNOW) = STRTOINT( COPY( s, 9, 2)))
                  AND (MonthOf( xNOW) = STRTOINT( COPY( s, 6, 2)))
                  AND (YearOf( xNOW) = STRTOINT( COPY( s, 1, 4)))) then
                try
                  xED244.EDNo := (xFileIni.ReadInteger( 'ПАКЕТЫ', 'НОМЕР', 0) + 1);
//showmessage('инкремент нумерации: '+inttostr(xED244.EDNo));
                  except
                end;
              except
            end;
          // перезаписываем файл с новыми параметрами
          xFileIni.WriteInteger( 'ПАКЕТЫ', 'НОМЕР', xED244.EDNo);
          xFileIni.WriteString ( 'ПАКЕТЫ', 'ДАТА', FormatDateTime( 'yyyy/mm/dd', xNOW));
          xFileIni.UpdateFile;
          finally
            xFileIni.Free;
        end;
        *)
        // exchange #3033
        // теперь номер ED244 должен быть синхронизирован с номерами выгружаемых
        // ЭД через эксч. т.е. для получения номера нужно запрашивать сервер
        // АЦК-Ф на каждый формируемый ED244.
        // дата для генерация номера ED244 определяется по системной дате
        // генерации ответа ED244
        xED244.EDNo := Get_EDNo_for_ED244( aBudgetID, aExch_Name, xNOW);

        // exchange #3033
        // ведение номера ЭД244 в имени файла.
        // это нужно для того, что когда приходит пакет ED243, ответ ED244
        // формируется в отдельном файле, и чтобы эти файлы не перезатирали
        // друг друга, к имени файла ED244 добавляется номер ED
        xED244_EDNo := INTTOSTR( xED244.EDNo);
        except
          ExceptionLog( 'Сбой описания полей номера и даты пакета ED244.');
      end;

      try
        // Текущая рабочая дата
        xED244.EDDate := xNOW;

        { «Уникальный идентификатор получателя ЭД – УИС
         (EDReceiver)» шапки ed 243, в ответ на который формируем данный ed244 }
        xED244.EDAuthor := aED243.EDReceiver;

        { Уникальный идентификатор получателя ЭД (EDReceiver)	Идентификатор.
        	Заполняем из поля «Уникальный идентификатор составителя ЭД – УИС»
          (EDAuthor) шапки ed 243, в ответ на который формируем данный ed244}
        xED244.EDReceiver := aED243.EDAuthor;


    //showmessage( 'vExch_2409_SystemCode = "'+vExch_2409_SystemCode+'".');
    //    xED244.SystemCode := '01';// + vExch_2409_SystemCode;//'01';// FSystemCode;

        // Значение кода из ED 243
        xED244.EDDefineRequestCode  := aED243.EDDefineRequestCode;

{отладка
showmessage( 'отладка (Exch2547_GenerateAnswerED244OnED243): xED244.EDReceiver = '
              + xED244.EDReceiver);
showmessage( 'отладка (Exch2547_GenerateAnswerED244OnED243): xED244.EDDefineRequestCode = '
              + xED244.EDDefineRequestCode);
{отладка_конец}


        // код ответа - Значение согласно условиям описанным в ФТ -  4, ФТ – 5.
        case aED243.EDDefineRequestCode of
          // ФТ-4
          1,2,6: xED244.EDDefineAnswerCode := '01';
          // ФТ-5
          4,5,7,8: xED244.EDDefineAnswerCode := aED243.EDDefineRequestCode;
        end;//case//

        // Значение поля «Номер» платежного поручения.
        // если номер документа не будет цифровым - будет сбой!
        xED244.OriginalEpd.EDNo :=
                            StrToInt( TRIM( xXML_DocPP.getAttribute('DOC_NUMBER')));
        // Значение поля «Дата» платежного поручения
        xED244.OriginalEpd.EDDate :=
                XMLToDateTime( VarToStr( xXML_DocPP.getAttribute('DOC_DATE')));

        { УИС - Заполняем из поля «Уникальный идентификатор составителя ЭД
                – УИС (EDAuthor)» блока (ed:OriginalEPD) ed 243, в ответ
                на который формируем данный ed244}
                //vExch_2409_UIS;
        xED244.OriginalEpd.EDAuthor := aED243.OriginalEpd.EDAuthor;

        // Дата выписки по которой прошло Платежное поручение.
        // соответствует дате формирования документа.
        // exchange 2547:
        // Если заполнено в ed 243 в поле (AccDocDate) блока (ed:EDDefineRequestInfo),
        // запонять из него. Если нет, из «Даты по банку» ПП.
        // Если нет даты в поле, из Даты документа ПП.
        // поскольку поле не строковое, проверку заполнения даты проверяем
        // по диапазону целой части числа - это дни.
        // если число >1 значит там что то есть, поэтому так и возвращаем.
        if ( ABS( aED243.EDDefineRequestInfo.AccDocDate) > 1)
          then xED244.EdDefineAnswerInfo.AccDocDate :=
                          aED243.EDDefineRequestInfo.AccDocDate
          else xED244.EdDefineAnswerInfo.AccDocDate :=
                          XMLToDateTime(
                                VarToStr( xXML_DocPP.getAttribute('DOC_DATE')));

        // Номер платежного поручения – значение поля «Номер»
        // исправлено 2013/03/01 без задания: если номер ЭД больше 3-х
        // символов - беруться последние три символа.
        // если номер ЭД будет пустым - он не пройдет контроль валидности!
        // нужно 1...3 символа.
        s := TRIM( xED244.OriginalEpd.EDNo);
        if (LENGTH( s) <= 3)
          then xED244.EdDefineAnswerInfo.AccDocNo := s
          else xED244.EdDefineAnswerInfo.AccDocNo := COPY( s, LENGTH(s) - 2, 3);
{
    // отладка
showmessage('отладка: xED244.EdDefineAnswerInfo.AccDocNo="'
+xED244.EdDefineAnswerInfo.AccDocNo+'"');
}

        // Значение поля «Счет» блока «Плательщик»
        xED244.EdDefineAnswerInfo.PayerAcc :=
                                  VarToStr( xXML_DocPP.GetAttribute( 'PAY_ACCOUNT'));

    // отладка
    //showmessage('отладка - замена счета PAY_ACCOUNT');
    //xED244.EdDefineAnswerInfo.PayerAcc := VarToStr( xXML_DocPP.GetAttribute( 'REC_ACCOUNT'));


        // Значение поля «Счет» блока «Получатель»
        xED244.EdDefineAnswerInfo.PayeeAcc :=
                                  VarToStr( xXML_DocPP.GetAttribute( 'REC_ACCOUNT'));

        // Значение поля «ИНН» блока «Плательщик»
        xED244.EdDefineAnswerInfo.PayerInn :=
                                  VarToStr( xXML_DocPP.GetAttribute( 'PAY_TAXCODE'));

        // Значение поля «ИНН» блока «Получатель»
        xED244.EdDefineAnswerInfo.PayeeInn :=
                                  VarToStr( xXML_DocPP.GetAttribute( 'REC_TAXCODE'));

        // Значение поля «Сумма» в шапке Платежного поручения.
        xED244.EdDefineAnswerInfo.Sum :=
                          StrToCurr( VarToStr( xXML_DocPP.GetAttribute( 'AMOUNT')));

        // Значение поля «Организация» блока «Плательщик»
        xED244.EdDefineAnswerInfo.PayerLongName :=
                                  VarToStr( xXML_DocPP.GetAttribute( 'PAY_NAME'));

        // Значение поля «Организация» блока «Получатель»
        xED244.EdDefineAnswerInfo.PayeeLongName :=
                                  VarToStr( xXML_DocPP.GetAttribute( 'REC_NAME'));

        // Значение поля «Назначение платежа» вкладки «Общее» ЭД Платежное поручение
        xED244.EdDefineAnswerInfo.Purpose :=
                                  VarToStr( xXML_DocPP.GetAttribute( 'DESCRIPTION'));

        // Значение поля «Назначение платежа» - не заполнять
        // поскольку в задании указано то же поле для выгрузки что и для
        // xED244.EdDefineAnswerInfo.Purpose. при этом это поле в ED244 короче!
        // поэтому АО утвердило, что это поле не выгружается.
        //xED244.EdDefineAnswerInfo.Address := '';

        { Дата зачисления средств на счет Получателя (EnterDate). Формат CCYY-MM-DD.
          Из «Даты по банку» ПП. Если нет даты в поле, из Даты документа ПП.}
        if (VarToStr( xXML_DocPP.GetAttribute( 'CARRY_DATE')) <> '')
          then xED244.EdDefineAnswerInfo.EnterDate :=
                        XMLToDateTime(
                                VarToStr( xXML_DocPP.getAttribute('CARRY_DATE')))
          else xED244.EdDefineAnswerInfo.EnterDate :=
                        XMLToDateTime(
                                VarToStr( xXML_DocPP.getAttribute('DOC_DATE')));

        { Номер корреспондентского счета банка Получателя (PayeeCorrAcc).
          Из поля «Коррсчет» блока «Получатель» ПП }
        xED244.EdDefineAnswerInfo.PayeeCorrAcc :=
                    TRIM( VarToStr( xXML_DocPP.getAttribute( 'REC_CORACCOUNT')));


        { БИК банка получателя (PayeeBIC)	Идентификатор.
          Банковский идентификационный код; БИК. [БИК РФ].
          Из поля «БИК» блока «Получатель» ПП }
        xED244.EdDefineAnswerInfo.PayeeBIC :=
                    TRIM( VarToStr( xXML_DocPP.getAttribute( 'REC_BIC')));

        { 2.5 Текст ответа (EDDefineAnswerText)
          В случае если в систему пришел ED 243  с кодом значения ЭСИД  равным:
          •	04 - в поле (EDDefineAnswerText) вставлять наименование плательщика
                  указанное в поле «Организация» блока «Плательщик» выгруженного
                  платежного поручения.
          •	05 - в поле (EDDefineAnswerText) вставлять наименование получателя
                  указанное в поле «Организация» блока «Получатель» платежного
                  поручения.
          •	07 - в поле (EDDefineAnswerText) вставлять значение из поля
                  «Назначение платежа» платежного поручения.
          для прочих кодо поле не заполняется. }
        case aED243.EDDefineRequestCode of
          4: xED244.EDDefineAnswerInfo.EDDefineAnswerText :=
                          VarToStr( xXML_DocPP.GetAttribute( 'PAY_NAME'));
          5: xED244.EDDefineAnswerInfo.EDDefineAnswerText :=
                          VarToStr( xXML_DocPP.GetAttribute( 'REC_NAME'));
          7: xED244.EDDefineAnswerInfo.EDDefineAnswerText :=
                          VarToStr( xXML_DocPP.GetAttribute( 'DESCRIPTION'));
        end;//case//

        { если в систему пришел ED 243  с кодом значения ЭСИД  равным 08
          – Подтвердите значение поля (полей) расчетного документа с указанным
          номером (номерами).
          Номер поля может принимать значения: 60, 61, 101 – 110.
          формировать Ответ с кодом 08. Заполнение поля (ed:FieldValue):
            Значение в поле (ed:FieldNo)	Заполнение поля (ed:FieldValue)
            60	ИНН блока Плательщик ПП
            61	ИНН блока Получатель ПП
            101	Идентификатор платежа ПП: Статус лица, оформившего документ
            102	КПП блока Плательщик ПП
            103	КПП блока Получатель ПП
            104	Идентификатор платежа ПП: КБК
            105	Идентификатор платежа ПП: ОКАТО
            106	Идентификатор платежа ПП: Показатель основания платежа
            107	Идентификатор платежа ПП: Налоговый период
            108	Идентификатор платежа ПП: Номер документа
            109	Идентификатор платежа ПП: Дата документа
            110	Идентификатор платежа ПП: Тип платежа }
        if (aED243.EDDefineRequestCode = 8) then
          for i := 0 to aED243.EDDefineRequestInfo.EDFieldListCount - 1 do
            case aED243.EDDefineRequestInfo.EDFieldList[i].FieldNo of
              60: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 60;
                    xFieldItem.FieldValue :=
                            VarToStr( xXML_DocPP.GetAttribute( 'PAY_TAXCODE'));
                  end;
              61: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 61;
                    xFieldItem.FieldValue :=
                            VarToStr( xXML_DocPP.GetAttribute( 'REC_TAXCODE'));
                  end;
             101: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 101;
                    xFieldItem.FieldValue :=
                            VarToStr( xXML_DocPP.GetAttribute( 'AUTHOR_ID'));
                  end;
             102: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 102;
                    xFieldItem.FieldValue :=
                            VarToStr( xXML_DocPP.GetAttribute( 'PAY_KPP'));
                  end;
             103: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 103;
                    xFieldItem.FieldValue :=
                            VarToStr( xXML_DocPP.GetAttribute( 'REC_KPP'));
                  end;
             104: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 104;
                    xFieldItem.FieldValue :=
                            VarToStr( xXML_DocPP.GetAttribute( 'PI_BUDGET_CODE'));
                  end;
             105: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 105;
                    xFieldItem.FieldValue :=
                            VarToStr( xXML_DocPP.GetAttribute( 'PAY_OKATO'));
                  end;
             106: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 106;

                    // Значение поля «Показатель основания платежа»
                    // идентификатора платежа платежного поручения.
                    s := VarToStr( xXML_DocPP.GetAttribute( 'GROUND_ID'));
                    if (LENGTH( s) <= 0)
                      then xFieldItem.FieldValue :=''
                      else xFieldItem.FieldValue :=
                                        QueryField( 'select NAME from payground where id=?',
                                                    [ s],
                                                    'NAME');
                  end;
             107: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 107;

                    { Значение поля «Налоговый период» идентификатора платежа
                      платежного поручения.
                    { по закону 106н вот такое указание допустимо:
                      1) Первые два знака показателя налогового периода предназначены для
                          определения периодичности уплаты налога (сбора), установленной
                          законодательством о налогах и сборах, которая указывается следующим
                          образом:
                      "МС" - месячные платежи;
                      "КВ" - квартальные платежи;
                      "ПЛ" - полугодовые платежи;
                      "ГД" - годовые платежи.
                      В 4-м и 5-м знаках показателя налогового периода для месячных платежей
                      проставляется номер месяца текущего отчетного года, для квартальных
                      платежей - номер квартала, для полугодовых - номер полугодия.
                      Номер месяца может принимать значения от 01 до 12,
                      номер квартала - от 01 до 04, номер полугодия - 01 или 02.
                      В 3-м и 6-м знаках показателя налогового периода в качестве
                      разделительных знаков проставляются точки (".").
                      В 7 - 10 знаках показателя налогового периода указывается год,
                      за который производится уплата налога.
                      При уплате налога один раз в год 4-й и 5-й знаки показателя
                      налогового периода заполняются нулями.
                      Если законодательством о налогах и сборах по годовому платежу
                      предусматривается более одного срока уплаты налога (сбора)
                      и установлены конкретные даты уплаты налога (сбора) для каждого срока,
                      то в показателе налогового периода указываются эти даты.
                      Образцы заполнения показателя налогового периода:
                      "МС.02.2003"; "КВ.01.2003"; "ПЛ.02.2003"; "ГД.00.2003".
                    поэтому дату не проверяем}
                    xFieldItem.FieldValue :=
                              VarToStr( xXML_DocPP.GetAttribute( 'TAXPERIOD'));
                  end;
             108: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 108;
                    // Значение поля «Номер документа» идентификатора
                    // назначения платежа платежного поручения.
                    xFieldItem.FieldValue :=
                          TRIM( VarToStr(
                                  xXML_DocPP.GetAttribute( 'GRND_DOC_NUMBER')));
                  end;
             109: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 109;
                    // Значение поля «Дата документа» идетификатора назначения
                    // платежа платежного поручения.
                    // дата передается без преобразования и проверок.
                    //showmessage('отладка: дата не указана');
                    xFieldItem.FieldValue :=
                            VarToStr( xXML_DocPP.GetAttribute( 'GRND_DOC_DATE'));
                  end;
             110: begin
                    xFieldItem := xED244.EDDefineAnswerInfo.AppendToEDFieldList;
                    xFieldItem.FieldNo    := 110;

                    // Значение поля «Тип платежа» идентификатора назначения
                    // платежа платежного поручения.
                    s := VarToStr( xXML_DocPP.GetAttribute( 'PAYTYPE_ID'));
                    if (LENGTH( s) <= 0)
                      then xFieldItem.FieldValue := ''
                      else xFieldItem.FieldValue :=
                              QueryField( 'select NAME from paytype where id=?',
                                          [ s],
                                          'NAME');
                  end;
            end;//case//

        // 2.6 Список уточняемых реквизитов в ранее направленном распоряжении.
        // Может быть заполнен для кода запроса = "08","09"(ed:EDFieldList)
        // Заполнять блок с полями, если только в поле (ed:FieldNo) ed 243
        // пришло знаxtние 60, 61 или 101-110

        // Номер ED 243 на который отправляется Ответ
        xED244.InitialEd.EDNo     := aED243.OriginalEpd.EDNo;
        // Дата ED 243 на который отправляется Ответ
        xED244.InitialEd.EDDate   := aED243.OriginalEpd.EDDate;
        // УИС ED 243  на который отправляется ответ.
        xED244.InitialEd.EDAuthor := aED243.OriginalEpd.EDAuthor;
        except
          ExceptionLog( 'Сбой формирования полей ED244.');
      end;

  //    MakeFileName(Xml);

  //    if xED244.SignType in [stED, stPacket] then
     { if (Ufebs.SignType <> stNone) or (FSigEnvelope and FVerifySigEnvelope) or
        (FEnvelope and Ufebs.EnvelopeCrypted) then}

      xED244.NSType[nstEd     ] := vExch_2409_v1;
      xED244.NSType[nstDsig   ] := vExch_2409_v2;
      xED244.NSType[nstDsigEnv] := vExch_2409_v3;
      xED244.NSType[nstSoap   ] := vExch_2409_v4;
      xED244.NSType[nstMsg    ] := vExch_2409_v5;
  {
      xED244.NSType[nstEd     ] := Trim(aConfig.Values['urn:cbr-ru:ed:v1.1']);
      xED244.NSType[nstDsig   ] := Trim(aConfig.Values['urn:cbr-ru:dsig:v1.1']);
      xED244.NSType[nstDsigEnv] := Trim(aConfig.Values['urn:cbr-ru:dsig:env:v1.1']);
      xED244.NSType[nstSoap   ] := Trim(aConfig.Values['http://www.w3.org/2003/05/soap-envelope']);
      xED244.NSType[nstMsg    ] := Trim(aConfig.Values['urn:cbr-ru:msg:props:v1.1']);
  }
  //    if ((xED244.SignType in [stED, stPacket]) or FSigEnvelope) then begin

      try
        WriteLog( xDocPPInfo + ' - Формирование XML.');
        xED244.MakeXML;

{отладка
showmessage('отладка (Exch2547_GenerateAnswerED244OnED243): xED244.XML:'#13#10+xED244.XMLText);
{отладка_конец}

        if vExch_2409_FormatXml then begin
          WriteLog( xDocPPInfo + ' - Форматирование XML.');
          xED244.FormatXML;
        end;

        // формирование ЭЦП в ответе
        if vExch_2409_Sign then begin
          WriteLog('Инициализация "СКАД Сигнатура"', True);
          xED244.VCERTLocalPath := vExch_2409_VCERTLocalPath;
          xED244.VCERTInitialize;
          WriteLog( xDocPPInfo + ' - Установка ЭЦП(ЗК)');
          xED244.SignType := stED;
          xED244.Sign;
        end;
        // проверяется пакет ответа
        if NOT xED244.Validate then begin
          MoveToError( xDocPPInfo
                        + 'не сформирован. Не прошёл контроль валидности.'
                        + #13#10'Причина: ' + xED244.ValidateError.reason
                        + #13#10'XML: ' + xED244.ValidateError.srcText);
          Exit;
        end;

        // каталог результата будет с подкаталогом даты
        if NOT SaveToEx_2409( xED244,
                              xDocPPInfo,
                              FormatDateTime( 'yyyy-mm-dd\', xNOW),
                              xED244_EDNo,
                              s)
          then EXIT
          else xFileED244 := s;
        except
          ExceptionLog( 'Сбой формирования пакета ED244.');
      end;

      // формирование конверта и служебного конверта
      if (vExch_2409_SigEnvelope OR vExch_2409_Envelope) then begin
        try
          // для служебного конферта необходим объект конверта, поэтому независимо
          // от опции формирования конверта, объект конверта будем всегда создавать,
          // но если конверт выгружать не нужно - его не проверяем и не сохраняем.

          WriteLog('<Конверт ЭЦП(КА)> - Создание', True);
          // здесь формируется объект конверта - это объект из которого затем
          // будет формироваться служебный конверт
          xPacked := xED244.makeSigEnvelope;

          WriteLog('<Конверт ЭЦП(КА)> - Формирование', True);
          xPacked.makeXML;

          WriteLog('<Конверт ЭЦП(КА)> - Установка ЭЦП(КА)', True);
          xPacked.Sign;

          if vExch_2409_FormatXml then begin
            WriteLog('<Конверт ЭЦП(КА)> - Форматирование', True);
            xPacked.FormatXML;
          end;

          if vExch_2409_SigEnvelope then
            try
              WriteLog('<Конверт ЭЦП(КА)> - Контроль валидности', True);
              if not xPacked.Validate then begin
                MoveToError( '<Конверт ЭЦП(КА)> - Не прошёл контроль валидности'
                            + #13#10'Причина: ' + xPacked.ValidateError.reason
                            + #13#10'XML: ' + xPacked.ValidateError.srcText);
                EXIT;
              end;
              // каталог результата будет с подкаталогом даты
              if NOT SaveToEx_2409( xPacked,
                                    xDocPPInfo,
                                    FormatDateTime( 'yyyy-mm-dd\Конверт\', xNOW),
                                    xED244_EDNo,
                                    s)
                then EXIT
                else xFileED244_S := s;
              except
                ExceptionLog( 'Сбой проверки и сохранения конверта.');
            end;
          except
            ExceptionLog( 'Сбой формирования конверта.');
        end;

        // формирование служебного конверта
        // он формируется из объекта конверта.
        if vExch_2409_Envelope then
          try
            WriteLog('<Служебный конверт> - Создание', True);
            xPacked := xPacked.makeEnvelope;
            WriteLog('<Служебный конверт> - Формирование', True);
            xPacked.DirSchems                 := vExch_2409_DirSchems;
            xPacked.MessageInfo.SendTo        := vExch_2409_EnvelopeTo;
            xPacked.MessageInfo.SendFrom      := vExch_2409_EnvelopeFrom;
            xPacked.MessageInfo.MessageType   := vExch_2409_EnvelopeMessageType;
            xPacked.MessageInfo.Priority      := vExch_2409_EnvelopePriority;

            //DocInfo
            xPacked.DocInfo.DocFormat := 1; //Всегда 1 - УФЭБС
      {      if not FOneED then
              Ufebs.DocInfo.DocType := 'PacketEPD';}
            xPacked.DocInfo.EDRefID.EDNo := xED244.EDNo;
            xPacked.DocInfo.EDRefID.EDDate := xNOW;
            xPacked.DocInfo.EDRefID.EDAuthor := vExch_2409_UIS;

            if vExch_2409_EnvelopeTransportFileName
              then xPacked.MessageInfo.LegacyTransportFileName := ExtractFileName(FileIn);//ExtractFileName(FileOut);
            if vExch_2409_EnvelopeMessageID
              then xPacked.MessageInfo.MessageID := 'guid:' + xPacked.genGuid;
            if vExch_2409_EnvelopeAppMessageID
              then xPacked.MessageInfo.AppMessageID := 'guid:' + xPacked.genGuid;

            xPacked.makeXML;
            if vExch_2409_FormatXml then begin
              WriteLog('<Служебный конверт> - Форматирование', True);
              xPacked.FormatXML;
            end;
            WriteLog('<Служебный конверт> - Контроль валидности', True);

  //showmessage('отладка - xPacked.Validate');
  //xPacked.SaveToFile('c:\temp\debug_exch2409_file1.xml');
  {SL:= tstringlist.create;
  sl.text:= xPacked.xml;
  sl.savetofile('c:\temp\xPacked.xml');
  sl.free;}

            if not xPacked.Validate then begin
      //        with xPacked.ValidateError do
              MoveToError(
                    '<Служебный конверт> - Не прошёл контроль валидности'
                  + #13#10'Причина: ' + xPacked.ValidateError.reason
                  + #13#10'XML: ' + xPacked.ValidateError.srcText);
              EXIT;
            end;
            // каталог результата будет с подкаталогом даты
            if NOT SaveToEx_2409( xPacked,
                                  xDocPPInfo,
                                  FormatDateTime( 'yyyy-mm-dd\Служебный_Конверт\', xNOW),
                                  xED244_EDNo,
                                  s)
              then EXIT
              else xFileED244_M := s;
            except
              ExceptionLog( 'Сбой формирования служебного конверта.');
          end;
      end;

      // результат создан успешно. конечные файлы удалять не нужно!
      xFileED244   := '';
      xFileED244_S := '';
      xFileED244_M := '';
      finally
        // если выход из процедуры выполнен досрочно (т.е. с ошибками)
        // то все созданные файлы ответов удаляем (те которые создались успешно)
        if ( LENGTH( xFileED244  ) > 0) then DeleteFile( xFileED244);
        if ( LENGTH( xFileED244_S) > 0) then DeleteFile( xFileED244_S);
        if ( LENGTH( xFileED244_M) > 0) then DeleteFile( xFileED244_M);
    end;
    {
    // каталог результата будет с подкаталогом даты
    s := vExch_2409_DirOut + FormatDateTime( 'yyyy-mm-dd\', xNOW);
    ForceDirectories( s);
    if not DirectoryExists( s) then begin
      MoveToError(
                    + 'не сформирован.'
                    + FORMAT( #13#10'Ошибка при создании каталога результата: "%s".',
                              [ s]));
      EXIT;
    end;

    // имя файла будет соответствовать входному файлу
    FileOut := s + ExtractFileName(FileIn);
//showmessage('отладка: FileOut="'+FileOut+'".');
    xED244.SaveToFile( FileOut);
    }
    except
      ExceptionLog( 'Сбой Un_Exch2547.Exch2547_GenerateAnswerED244OnED243');
  end;
end;


begin
end.
