{ АЦК-Exchange #2372 - специальное дополнение к ZR. }


function Exch2372_DocumentType( var aSourceXml: Variant): integer;
begin

    try
      Result := 0;

      case aSourceXml.getAttribute('DOCUMENTCLASS_ID') of
        { ЗОР класс 11
          если поле «Тип бланка расходов» соответствует значению (8)
          Бюджетное учреждение, (9) Автономное учреждение,
          и поле  «Тип счета финансирования» соответствует значению
          «Лицевой счет в ФК»
          возвращаем =1}
        11: case GetEstimateType( aSourceXml.getAttribute( 'ESTIMATE_ID')) of
              '8','9':
                  if (GetOrgAccountType(
                                aSourceXml.getAttribute( 'ORGACCOUNT_ID')) = '5')
                    then Result := 1;
            end;//case//

        { «Заявка на списание специальных средств с лицевого счета» (75 класс)
          определяется по признакам: значение поля «Тип счета плательщика»
          равное (5) «Лицевой счет в ФК» и если поле «Тип бланка расходов»
          соответствует значению (8) Бюджетное учреждение, (9) Автономное
          учреждение.
          для этого ЭД тип бланка расходом описывается в строках, но поскольку
          это поле в строках одинаковое, то оно копируется в шапку документа.
          на форме этот параметр не отображается (и в xml по F12 его тоже нет).
          но поле есть в БД.}
        75: case GetEstimateTypeByPayRequest( aSourceXml.getAttribute( 'ID')) of
              '8','9':
                  if (GetOrgAccountType(
                                aSourceXml.getAttribute( 'PAY_ACC_ID')) = '5')
                    then Result := 1;
            end;//case//
      end;//case//

      except
        ExceptionLog( 'Сбой Un_Exch2372.Exch2372_DocumentType');
    end;

end;



function DoDefineDoc2372( var aSourceXml: Variant;
                                       aBudgetID: string;
                                       var aFromBudgLevel: string;
                                       var aFromKodUbp: string;
                                       var aFromNameUbp: string;
                                       var aToKodTofk: string;
                                       var aToNameTofk: string;
                                       var aOrgCode: string): integer;
var
  xAccountXML: Variant;
  xAccountID: string;
  xOrgXML: Variant;
  xOrgID: string;
begin

    try
      Result := -1;

      // дальше возвращаем параметры в зависимости от класса
      case aSourceXml.getAttribute('DOCUMENTCLASS_ID') of
        11: begin
              { Уровень бюджета - Значение 6}
              aFromBudgLevel := '6';
              // получаем описание организации-оператора владельца бланка расходов
              if NOT GetOrgXML_By_EstimateID(
                                        aSourceXml.getAttribute( 'ESTIMATE_ID'),
                                        xOrgXML)
                then EXIT;
              { Код клиента - Значение из поля «Код организации» справочника
                Организаций. Бланк расходов-организация оператор.}
              aOrgCode := GetNodeAttributeValue( xOrgXML, '//*/@NAME');
              { Код клиента - Значение из поля «Код организации» справочника
                Организаций. Бланк расходов-организация оператор. }
              aFromKodUbp := aOrgCode;
              { Наименование клиента - Значение из поля «Официальное название»
                справочника Организаций для Организации-владельца бланка
                расходов, указанного в ЭД.}
              aFromNameUbp := GetNodeAttributeValue( xOrgXML, '//*/@DESCRIPTION');
              aToKodTofk   := QueryField(sqlTofkAcc, [ aSourceXml.getAttribute('ORGACCOUNT_ID')], 'NAME');
              aToNameTofk  := QueryField(sqlTofkAcc, [ aSourceXml.getAttribute('ORGACCOUNT_ID')], 'DESCRIPTION');

            end;

        75: begin
              { Уровень бюджета - Значение 6}
              aFromBudgLevel := '6';
              // код организации
              aOrgCode := GetNodeAttributeValue( aSourceXml, '@PAY_CODE');
              { Значение из поля «Код организации» организации в блоке
                «Плательщик». }
              aFromKodUbp := GetNodeAttributeValue( aSourceXml, '@PAY_CODE');
              { Значение из поля «Официальное название» справочника Организаций
                для Организации, указанной в блоке «Плательщик». }
              aFromNameUbp := GetOrgOfficialName(GetNodeAttributeValue( aSourceXml, '@PAY_ID'));
              aToKodTofk   := QueryField(sqlTofkAcc, [ aSourceXml.getAttribute('PAY_ACC_ID')], 'NAME');
              aToNameTofk  := QueryField(sqlTofkAcc, [ aSourceXml.getAttribute('PAY_ACC_ID')], 'DESCRIPTION');
            end;
      else EXIT;        // прочие классы не заполняем
      end;//case//
      Result := 0;
      except
        ExceptionLog( 'Сбой Un_Exch2372.DoDefineDoc2372');
    end;

end;



function Exch2372_Class75( //aBudgetID: string;
                           var aSourceXml: Variant;
                           var aDataDocument: Variant;
                           var aSchema: Variant;
                           aCfg_param_UFK_TOFK: String): boolean;
var
  i: integer;
  xAccountID: string;
  xAccountNumber: string;
  xAccountXML: Variant;
  xAccType: string;
  xOrgXml: Variant;
  xNode: Variant;
  xDocZRST: Variant;
  s, tmpStr: string;
begin

    try
      Result := FALSE;
      // GUID_FK - Служебное поле, заполняется в ОрФК.	Не выгружается

      // Тип заявки - Значение из поля «Тип заявки»
      aDataDocument.setAttribute('TYPE', aSourceXml.getAttribute('SIGN_VOLUME'));
      // Номер заявки, присвоенный клиентом. - Значение из поля «Номер» ЭД
      aDataDocument.setAttribute( 'NOM_ZR', TRIM( aSourceXml.getAttribute('DOC_NUMBER')));
      // Дата формирования документа.	Значение из поля «Дата» ЭД
      CopyNotEmptyAttrXmlDateTime( aSourceXml, 'DOC_DATE', aDataDocument, 'DATE_ZR');
      // Код клиента - Не выгружается

      // Наименование клиента - Значение поля «Организация» блока «Плательщик»
      aDataDocument.setAttribute( 'NAME_UBP_PAY',
                           aSourceXml.getAttribute( 'PAY_NAME'));
      // описание счета: Значение из поля «Счет» блока «Плательщик»
      // при этом тип счета ожидается только ФК и УФК!
      xAccountID := aSourceXml.getAttribute('PAY_ACC_ID');
      if (GetOrgAccountGetter_ToXML(
                  xAccountXML,
                  FORMAT( 'id=%s'#13#10'where=a.orgacctype_id in (3,5,7,8,9)',
                          [ xAccountID]),
                  NULL) <> 1)
        then begin
          WriteInfo( FORMAT( 'Не найдено описание счета плательщика "%s".',
                            [ xAccountID]));
          EXIT;
        end;
      { Номер лицевого счета клиента.
        Значение из поля «Счет для финансирования»}
      xAccountNumber := GetNodeAttributeValue( xAccountXML, '@ORG_ACCOUNT');
      aDataDocument.setAttribute( 'LS_UBP_PAY', xAccountNumber);
      // ИНН клиента - Не выгружается

      // КПП клиента - Не выгружается

      // Глава по БК - Не выгружается

      // описание организации + вышестоящего ГРБС
      xOrgXml := SearchOrg( #13#10'id='+ aSourceXml.getAttribute('PAY_ID')
                           +#13#10'manager=omanag.name MANAGER_NAME,'
                                   +'omanag.description MANAGER_DESCRIPTION');
      // Наименование ГРБС (ГАИФДБ)
      aDataDocument.setAttribute(
                'NAME_UBP_GRS',
                GetNodeAttributeValue( xOrgXml, '//*/@MANAGER_NAME'));
      // Наименование бюджета - Не выгружается

      // Наименование финансового органа	- Не выгружается

      setTOFKProps(aCfg_param_UFK_TOFK, aDataDocument, xAccountID, 'KOD_TOFK', 'NAME_TOFK');
      // Предельная дата исполнения	- Не выгружается

      { Идентификатор документа «Сведения о принятом бюджетном обязательстве»,
        предоставленного в ОрФК	 - Не выгружается}

      // Номер обязательства	- Не выгружается

      // Код приоритета исполнения	- Не выгружается

      // Приоритет исполнения	- Не выгружается

      // Сумма документа в валюте выплаты
      aDataDocument.setAttribute(
                    'SUM_V',
                    FormatStrAsNumberP2( aSourceXml.getAttribute('AMOUNT')));
      // Код валюты по ОКВ - Выгружается значение 643
      aDataDocument.setAttribute( 'KOD_V', '643');
      // Сумма документа	- Не выгружается

      // Признак авансового платежа
      aDataDocument.setAttribute( 'TYPE_AP',
                                  aSourceXml.getAttribute('ADVANCE_PAYMENT'));
      // Сумма НДС в валюте заявки	- Не выгружается
      // поле SUM_V_NDS убрано в тфф12 и выше (#2616)

      // Очередность платежа
      aDataDocument.setAttribute( 'ORDER_PL',
                                  aSourceXml.getAttribute('QUEUE_KIND'));
      // Вид платежа
      aDataDocument.setAttribute( 'VID_PL',
                                  PayKindSetAsFk(
                                          aSourceXml.getAttribute('PAYKIND')));
      // Назначение платежа
      aDataDocument.setAttribute( 'PURPOSE',
                                  aSourceXml.getAttribute('DESCRIPTION'));
      { Наименование / ФИО контрагента
        Выгружается значение поля «Организация» блока «Получатель» }
      aDataDocument.setAttribute( 'NAME_RCP',
                                  aSourceXml.getAttribute('REC_NAME'));
      { ИНН контрагента - Выгружается значение поля «ИНН» блока «Получатель» }
      aDataDocument.setAttribute( 'INN_RCP',
                                  aSourceXml.getAttribute('REC_TAXCODE'));
      { КПП контрагента	- Выгружается значение поля «КПП» блока «Получатель» }
      aDataDocument.setAttribute( 'KPP_RCP',
                                  aSourceXml.getAttribute('REC_KPP'));

      { exchange #3034:
        Если  в поле КПП в блоке Получатель пусто,
        в блоке KPP_RCP выгружать значение «0».}
      if (LENGTH( GetNodeAttributeEx( aDataDocument, 'KPP_RCP')) <= 0)
        then aDataDocument.SetAttribute( 'KPP_RCP', '0');

      { Лицевой счет контрагента,
        Банковский счет контрагента
      }
      if (GetOrgAccountGetter_ToXML(
              xAccountXML,
              'where=a.id=?',
              [ aSourceXml.getAttribute('REC_ACC_ID')]) <> 1)
        then begin
          { если значение поля «Счет» блока «Получатель», не имеет тип 5,
            то Лицевой счет контрагента не указывается }
          aDataDocument.setAttribute( 'LS_UBP_RCP', '');
          { если л/с получателя отсутствует в справочнике, то
            Банковский счет контрагента = «Счет» закладки «Получатель» }
          aDataDocument.setAttribute( 'BS_RCP',
                                      aSourceXml.getAttribute('REC_ACCOUNT'));
        end else begin
          // тип счета «Получатель»
          xAccType := GetNodeAttributeValue( xAccountXML, '@ORGACCOUNTTYPE');
          { Лицевой счет контрагента- Выгружается значение поля «Счет» блока
            «Получатель», если счет имеет тип 5	}
          if (xAccType = '5')
            then aDataDocument.setAttribute( 'LS_UBP_RCP',
                                      aSourceXml.getAttribute('REC_ACCOUNT'))
            else aDataDocument.setAttribute( 'LS_UBP_RCP', '');
          { Банковский счет контрагента
            Если «Счет» закладки «Получатель» имеет тип 1,5,7,8,9, то:
            заполнять значением банковского счета из поля "Счет УФК" закладки
            «Получатель». Если «Счет» закладки «Получатель» из справочника и
            имеет тип 2,3 или не из справочника, выгружать его.}
          case xAccType of
            1,5,7,8,9:
                aDataDocument.setAttribute(
                            'BS_RCP',
                            aSourceXml.getAttribute('REC_UFK_ACCOUNT'));
            else
                aDataDocument.setAttribute(
                            'BS_RCP',
                            aSourceXml.getAttribute('REC_ACCOUNT'));
          end;//case//
        end;

      { Наименование банка контрагента - Выгружается значение поля «Банк»
        блока «Получатель» }
      aDataDocument.setAttribute( 'NAME_BIC_RCP',
                                  aSourceXml.getAttribute('REC_B_NAME'));
      { БИК банка контрагента	- Выгружается значение поля «БИК»
        блока «Получатель»}
      aDataDocument.setAttribute( 'BIC_RCP',
                                  aSourceXml.getAttribute('REC_BIC'));
      { Корсчет банка контрагента }
      aDataDocument.setAttribute( 'KS_BIC_RCP',
                                  aSourceXml.getAttribute('REC_CORACCOUNT'));
      { Статус налогоплательщика - Выгружается значение из поля "Статус лица,
        оформившего документ" из поля "Идентификатор платежа" }
      s := Trim(aSourceXml.getAttribute('AUTHOR_ID'));
      if ( LENGTH( s) <= 0)
        then aDataDocument.setAttribute( 'PAYSTATUS', '')
        else aDataDocument.setAttribute( 'PAYSTATUS',
                                          Format( '%2s', [ StringReplace(s, ' ', '0')]));
      { Код бюджетной классификации - Выгружается КБК из поля
        "Идентификатор платежа":
            доходы - Гл.АДМ КВД КОСГУ
            расходы - КВСР КФСР КЦСР КВР КОСГУ
            источники - Гл.Адм КВИ КОСГУ}
      aDataDocument.setAttribute( 'KDOH',
                                  aSourceXml.getAttribute('PI_BUDGET_CODE'));
      // exchange #3081
      // проверяем значение ид.платежа на выход за 20 символов
      CheckField_PI_BUDGET_CODE( aDataDocument, 'KDOH');

      // exchange #2791 - проверка КБК в ид.платежа
      DoCheck_2791_LoadKBK0_PI_BUDGET_CODE(
              aDataDocument.getAttribute( 'KDOH'),
              FORMAT( '№ %s от %s на сумму %s',
                    [ VarToStr( aDataDocument.GetAttribute( 'NOM_ZR')),
                      VarToStr( aDataDocument.GetAttribute( 'DATE_ZR')),
                      VarToStr( aDataDocument.GetAttribute( 'SUM_V'))]),
              '75');

      { Код ОКАТО - Выгружается код ОКАТО из поля "Идентификатор платежа"}
      aDataDocument.setAttribute( 'OKATO',
                                  aSourceXml.getAttribute('PAY_OKATO'));
      { Показатель основания платежа - Выгружается показатель основания платежа
        из поля "Идентификатор платежа"}
      aDataDocument.setAttribute( 'OSN_PL',
                                  GetGroundNameByID(
                                      aSourceXml.getAttribute('GROUND_ID')));
      { Показатель налогового периода / кода таможенного органа
        - Выгружается дата из поля "Налоговый период", указанного в поле
        "Идентификатор платежа"}
      aDataDocument.setAttribute( 'NAL_PER',
                                  aSourceXml.getAttribute('TAXPERIOD'));
      { Показатель номера документа - Выгружается значение из поля
        "Номер документа", указанного в поле "Идентификатор платежа"}
      aDataDocument.setAttribute( 'NOM_DOK',
                                  aSourceXml.getAttribute('GRND_DOC_NUMBER'));
      { Показатель даты документа - Выгружается дата из поля "Дата документа",
        указанного в поле "Идентификатор платежа"}
      aDataDocument.setAttribute( 'DATE_DOK',
                                  aSourceXml.getAttribute('GRND_DOC_DATE'));
      { Тип платежа - Выгружается значение из поля "Тип платежа", указанного
        в поле "Идентификатор платежа"}
      aDataDocument.setAttribute( 'TYPE_PL',
                                  GetPayTypeNameByID(
                                    aSourceXml.getAttribute('PAYTYPE_ID')));
      {Должность руководителя (уполномоченного им лица) - Выгружается
        информация из поля «Должность руководителя»}
      aDataDocument.setAttribute( 'DOL_RUK_UBP',
                                  aSourceXml.getAttribute('BOSS_POST'));
      { ФИО руководителя (уполномоченного им лица) - Выгружается информация
        из поля «Руководитель» }
      aDataDocument.setAttribute( 'NAME_RUK_UBP',
                                  aSourceXml.getAttribute('BOSS_FIO'));
      { Должность главного бухгалтера (уполномоченного руководителем лица)
        Выгружается информация из поля «Должность гл. бухгалтера» }
      aDataDocument.setAttribute( 'DOL_BUH_UBP',
                                  aSourceXml.getAttribute('BUHGALT_POST'));
      { ФИО главного бухгалтера (уполномоченного руководителем лица)
        Выгружается информация из поля «Гл. бухгалтер» }
      aDataDocument.setAttribute( 'NAME_BUH_UBP',
                                  aSourceXml.getAttribute('BUHGALT_FIO'));
      { Дата подписания заявки - Выгружается информация
        из поля «Дата подписания» }
      CopyNotEmptyAttrXmlDateTime( aSourceXml, 'SIGN_DATE',
                                   aDataDocument, 'DATE_POD_UBP');
      // Отметка ОрФК о постановке на учет / Номер заявки	- Не выгружается

      // Отметка ОрФК о постановке на учет/Дата постановки на учет - Не выгружается

      // Отметка ОрФК о постановке на учет / Должность ответственного
      // исполнителя	 - Не выгружается

      // Отметка ОрФК о постановке на учет / ФИО ответственного
      // исполнителя	 - Не выгружается

      // Отметка ОрФК о постановке на учет / Телефон ответственного
      // исполнителя	- Не выгружается


      // exchange #2801
      // заполнение поля ФАИП в поле ZR.FAIP_CODE
      ExchExport_FAIP( aSourceXml, aDataDocument, 'FAIP_CODE');

      // цикл по строкам документа
      for i := 0 to aSourceXml.childNodes.length - 1 do begin
        xNode := aSourceXml.childNodes.items[ i];

        // расшифровка строк
        try
          // exchange #3096
          // создаем раздел ZRST но не выгружаем его
{          xDocZRST := aDataDocument.ParentNode.appendChild(
                                  FillElementBySchemaEx( aSchema, 'ZRST', NULL));}
          xDocZRST := FillElementBySchemaEx( aSchema, 'ZRST', NULL);

          except
            ExceptionLog( 'Сбой добавления раздела ZRST');
        end;
        // Источник средств - Выгружать значение 6
        xDocZRST.setAttribute( 'KOD_IST_KBK', '6');
        // Тип КБК плательщика - Выгружается тип бюджетной классификации.
        // Для ЭД Заявки на списание спецсредств - 20
        xDocZRST.setAttribute( 'TYPE_KBK_PAY', '20');
        { Код по БК плательщика:
          Указывается КБК из соответствующих строк ЭД "Заявка на списание
          спецсредств" в порядке: Гл.администратор, в 1-17 разрядах
          значением «0», в 18-20 разрядах значением КОСГУ строки
          exchange #3062
          поле косгу исключается. вместо него выгружается последние 3 цифры
          из КВД. поправлена ошибка - раньше поле выгружалось KESR и это странно.}
        xDocZRST.setAttribute( 'KBK_PAY',
                               GetRuleKBKLine_D(  '0',
                                                  xNode.getAttribute( 'KD_CODE'),
                                                  '0',
                                                  aSourceXml.getAttribute('BUDGET_ID'),
                                                  //aBudgetID,
                                                  FALSE,
                                                  '00000000000000000---'));
          {
        xDocZRST.setAttribute( 'KBK_PAY',
                  AppendStringLeft( xNode.getAttribute( 'KESR_CODE'), 20, '0'));
                  }
        { Тип КБК получателя - Не выгружается}

        // Код по БК получателя	 - Не выгружается

        //Код цели субсидии / субвенции плательщика - Выгружается из поля Доп.ФК
        xDocZRST.setAttribute( 'ADD_KLASS_PAY',
                               xNode.getAttribute( 'KDF_CODE'));
        // Код цели субсидии / субвенции получателя - Не выгружается

        { Сумма в валюте заявки	}
        xDocZRST.setAttribute( 'SUM_V_KBK',
                                FormatStrAsNumberP2( xNode.getAttribute('AMOUNT')));
        // Сумма в рублях	- Не выгружается

        { Назначение платежа - Значение поля «Назначение платежа строки» }
        xDocZRST.setAttribute( 'PURPOSE_KBK',
                               xNode.getAttribute( 'DESCRIPTION_LINES'));
        // Примечание	- Не выгружается

        // exchange #3096
        // выгружаем раздел ZRTS
        DoAppendZRST_( aDataDocument.ParentNode, xDocZRST);
      end;//for//
      Result := TRUE;
      except
        ExceptionLog( 'Сбой Un_Exch2372.Exch2372_Class75');
    end;

end;


function Exch2372_Class11( //aBudgetID: string;
                           var aSourceXml: Variant;
                           var aDataDocument: Variant;
                           var aSchema: Variant;
                           aCfg_param_UFK_TOFK: String): boolean;
var
  i: integer;
  xAccountID: string;
  xAccountNumber: string;
  xAccountXML: Variant;
  xAccType: string;
  xOrgXml: Variant;
  xNode: Variant;
  xDocZRST: Variant;
  s, tmpStr: string;
  xZR_TYPE: string;     // exchange #2616
begin

    try
      Result := FALSE;
      // GUID_FK - Служебное поле, заполняется в ОрФК.	Не выгружается

      // Тип заявки - Значение из поля «Тип заявки»
      aDataDocument.setAttribute( 'TYPE',
                                  aSourceXml.getAttribute('SIGN_VOLUME'));
      // Номер заявки, присвоенный клиентом. - Значение из поля «Номер» ЭД
      aDataDocument.setAttribute( 'NOM_ZR',
                                  TRIM( aSourceXml.getAttribute('DOC_NUMBER')));
      // Дата формирования документа.	Значение из поля «Дата» ЭД
      CopyNotEmptyAttrXmlDateTime( aSourceXml, 'DOC_DATE',
                                   aDataDocument, 'DATE_ZR');
      // Код клиента - Не выгружается
      aDataDocument.setAttribute( 'KOD_UBP_PAY', '');
      // получаем описание организации-оператора владельца бланка расходов
      if NOT GetOrgXML_By_EstimateID( aSourceXml.getAttribute( 'ESTIMATE_ID'),
                                      xOrgXML)
        then EXIT;
      // Наименование клиента - Значение из поля «Официальное название»
      // справочника Организаций Владелец определяется Организация-оператор.
      aDataDocument.setAttribute(
                    'NAME_UBP_PAY',
                    GetNodeAttributeValue( xOrgXML, '//*/@DESCRIPTION'));
      // описание счета: Значение из поля «Счет для финансирования»
      // ожидается тип счета ФК и УФК
      xAccountID := aSourceXml.getAttribute('ORGACCOUNT_ID');
      if (GetOrgAccountGetter_ToXML(xAccountXML, FORMAT( 'id=%s'#13#10'where=a.orgacctype_id in (3,5,7,8,9)', [ xAccountID]), NULL) <> 1)
        then begin
          WriteInfo( FORMAT( 'Не найден счет «Счет для финансирования» "%s".',
                            [ xAccountID]));
          EXIT;
        end;
      { Номер лицевого счета клиента.
        Значение из поля «Счет для финансирования»}
      xAccountNumber := GetNodeAttributeValue( xAccountXML, '@ORG_ACCOUNT');
      aDataDocument.setAttribute( 'LS_UBP_PAY', xAccountNumber);
      // ИНН клиента - Не выгружается

      // КПП клиента - Не выгружается

      // Глава по БК - Не выгружается

      // Наименование ГРБС (ГАИФДБ) - выгружается значение поля
      // "Код вышестоящего ГРБС" из карточки организации указанной в блоке
      // Плательщик. здесь берем значение из описания организации (см.выше)
      aDataDocument.setAttribute('NAME_UBP_GRS', GetNodeAttributeValue( xOrgXml, '//*/@MANAGER_NAME'));
      // Наименование бюджета

      // Наименование финансового органа	- Не выгружается


      setTOFKProps(aCfg_param_UFK_TOFK, aDataDocument, xAccountID, 'KOD_TOFK', 'NAME_TOFK');
      // Предельная дата исполнения	- Не выгружается

      { Идентификатор документа «Сведения о принятом бюджетном обязательстве»,
        предоставленного в ОрФК	 - Не выгружается}

      // Номер обязательства	- Не выгружается

      // Код приоритета исполнения	- Не выгружается

      // Приоритет исполнения	- Не выгружается

      // Сумма документа в валюте выплаты
      aDataDocument.setAttribute(
                    'SUM_V',
                    FormatStrAsNumberP2( aSourceXml.getAttribute('AMOUNT')));
      // Код валюты по ОКВ - Выгружается значение 643
      aDataDocument.setAttribute( 'KOD_V', '643');
      // Сумма документа	- Не выгружается

      // Признак авансового платежа
      aDataDocument.setAttribute( 'TYPE_AP',
                                  aSourceXml.getAttribute('ADVANCE_PAYMENT'));
      // Сумма НДС в валюте заявки	- Не выгружается
//
      // Очередность платежа
      aDataDocument.setAttribute( 'ORDER_PL',
                                  aSourceXml.getAttribute('QUEUE_KIND'));
      // Вид платежа
      aDataDocument.setAttribute( 'VID_PL',
                                  PayKindSetAsFk(
                                          aSourceXml.getAttribute('PAYKIND')));
      // Назначение платежа
      aDataDocument.setAttribute( 'PURPOSE',
                                  aSourceXml.getAttribute('DESCRIPTION'));
      { Наименование / ФИО контрагента
        Выгружается значение поля «Организация» блока «Получатель» }
      aDataDocument.setAttribute( 'NAME_RCP',
                                  aSourceXml.getAttribute('REC_NAME'));
      { ИНН контрагента - Выгружается значение поля «ИНН» блока «Получатель» }
      aDataDocument.setAttribute( 'INN_RCP',
                                  aSourceXml.getAttribute('REC_TAXCODE'));
      { КПП контрагента	- Выгружается значение поля «КПП» блока «Получатель» }
      aDataDocument.setAttribute( 'KPP_RCP',
                                  aSourceXml.getAttribute('REC_KPP'));

      { exchange #3034:
        Если  в поле КПП в блоке Получатель пусто,
        в блоке KPP_RCP выгружать значение «0».}
      if (LENGTH( GetNodeAttributeEx( aDataDocument, 'KPP_RCP')) <= 0)
        then aDataDocument.SetAttribute( 'KPP_RCP', '0');

      { Лицевой счет контрагента,
        Банковский счет контрагента
      }
      if (GetOrgAccountGetter_ToXML(
              xAccountXML,
              'where=a.id=?',
              [ aSourceXml.getAttribute('REC_ACC_ID')]) <> 1)
        then begin
          { если значение поля «Счет» блока «Расходование», не имеет тип 5,
            то Лицевой счет контрагента не указывается }
          aDataDocument.setAttribute( 'LS_UBP_RCP', '');
          { если л/с получателя отсутствует в справочнике, то
            Банковский счет контрагента = «Счет» закладки «Расходование» }
          aDataDocument.setAttribute( 'BS_RCP',
                                      aSourceXml.getAttribute('REC_ACCOUNT'));
        end else begin
          // тип счета «Получатель»
          xAccType := GetNodeAttributeValue( xAccountXML, '@ORGACCOUNTTYPE');
          { Лицевой счет контрагента- Выгружается значение поля «Счет» блока
            «Расходование», если счет имеет тип 5	}
          if (xAccType = '5')
            then aDataDocument.setAttribute( 'LS_UBP_RCP',
                                      aSourceXml.getAttribute('REC_ACCOUNT'))
            else aDataDocument.setAttribute( 'LS_UBP_RCP', '');
          { Банковский счет контрагента
            Если «Счет» закладки «Расходование» имеет тип 1,5,7,8,9, то:
            заполнять значением банковского счета из поля "Счет УФК" закладки
            «Расходование». Если «Счет» закладки «Расходование» из справочника и
            имеет тип 2,3 или не из справочника, выгружать его.}
          case xAccType of
            1,5,7,8,9:
                aDataDocument.setAttribute(
                            'BS_RCP',
                            GetNodeAttributeValue( xAccountXML,
                                                   '@ORG_UFK_ACCOUNT'));
            else
                aDataDocument.setAttribute(
                            'BS_RCP',
                            aSourceXml.getAttribute('REC_ACCOUNT'));
          end;//case//
        end;

      { Наименование банка контрагента - Выгружается значение поля «Банк»
        блока «Получатель» }
      aDataDocument.setAttribute( 'NAME_BIC_RCP',
                                  aSourceXml.getAttribute('REC_B_NAME'));
      { БИК банка контрагента	- Выгружается значение поля «БИК»
        блока «Получатель»}
      aDataDocument.setAttribute( 'BIC_RCP',
                                  aSourceXml.getAttribute('REC_BIC'));
      { Корсчет банка контрагента - Выгружается значение поля «Коррсчет» }
      aDataDocument.setAttribute( 'KS_BIC_RCP',
                                  aSourceXml.getAttribute('REC_CORACCOUNT'));
      { Статус налогоплательщика - Выгружается значение из поля "Статус лица,
        оформившего документ" из поля "Идентификатор платежа" }
      s := Trim(aSourceXml.getAttribute('AUTHOR_ID'));
      if ( LENGTH( s) <= 0)
        then aDataDocument.setAttribute( 'PAYSTATUS', '')
        else aDataDocument.setAttribute( 'PAYSTATUS',
                                          Format( '%2s', [ StringReplace(s, ' ', '0')]));
      { Код бюджетной классификации - Выгружается КБК из поля
        "Идентификатор платежа":
            доходы - Гл.АДМ КВД КОСГУ
            расходы - КВСР КФСР КЦСР КВР КОСГУ
            источники - Гл.Адм КВИ КОСГУ}
      aDataDocument.setAttribute( 'KDOH',
                                  aSourceXml.getAttribute('PI_BUDGET_CODE'));
      // exchange #3081
      // проверяем значение ид.платежа на выход за 20 символов
      CheckField_PI_BUDGET_CODE( aDataDocument, 'KDOH');

      // exchange #2791 - проверка КБК в ид.платежа
      DoCheck_2791_LoadKBK0_PI_BUDGET_CODE(
              aDataDocument.getAttribute( 'KDOH'),
              FORMAT( '№ %s от %s на сумму %s',
                    [ VarToStr( aDataDocument.GetAttribute( 'NOM_ZR')),
                      VarToStr( aDataDocument.GetAttribute( 'DATE_ZR')),
                      VarToStr( aDataDocument.GetAttribute( 'SUM_V'))]),
              '11');

      { Код ОКАТО - Выгружается код ОКАТО из поля "Идентификатор платежа"}
      aDataDocument.setAttribute( 'OKATO',
                                  aSourceXml.getAttribute('PAY_OKATO'));
      { Показатель основания платежа - Выгружается показатель основания платежа
        из поля "Идентификатор платежа"}
      aDataDocument.setAttribute( 'OSN_PL',
                                  GetGroundNameByID(
                                      aSourceXml.getAttribute('GROUND_ID')));
      { Показатель налогового периода / кода таможенного органа
        - Выгружается дата из поля "Налоговый период", указанного в поле
        "Идентификатор платежа"}
      aDataDocument.setAttribute( 'NAL_PER',
                                  aSourceXml.getAttribute('TAXPERIOD'));
      { Показатель номера документа - Выгружается значение из поля
        "Номер документа", указанного в поле "Идентификатор платежа"}
      aDataDocument.setAttribute( 'NOM_DOK',
                                  aSourceXml.getAttribute('GRND_DOC_NUMBER'));
      { Показатель даты документа - Выгружается дата из поля "Дата документа",
        указанного в поле "Идентификатор платежа"}
      aDataDocument.setAttribute( 'DATE_DOK',
                                  aSourceXml.getAttribute('GRND_DOC_DATE'));
      { Тип платежа - Выгружается значение из поля "Тип платежа", указанного
        в поле "Идентификатор платежа"}
      aDataDocument.setAttribute( 'TYPE_PL',
                                  GetPayTypeNameByID(
                                    aSourceXml.getAttribute('PAYTYPE_ID')));
      {Должность руководителя (уполномоченного им лица) - Выгружается
        информация из поля «Должность руководителя»}
      aDataDocument.setAttribute( 'DOL_RUK_UBP',
                                  aSourceXml.getAttribute('CHEQUE_BOSS_POST'));
      { ФИО руководителя (уполномоченного им лица) - Выгружается информация
        из поля «Руководитель» }
      aDataDocument.setAttribute( 'NAME_RUK_UBP',
                                  aSourceXml.getAttribute('CHEQUE_FIO_BOSS_STR'));
      { Должность главного бухгалтера (уполномоченного руководителем лица)
        Выгружается информация из поля «Должность гл. бухгалтера» }
      aDataDocument.setAttribute( 'DOL_BUH_UBP',
                                  aSourceXml.getAttribute('CHEQUE_BUHGALT_POST'));
      { ФИО главного бухгалтера (уполномоченного руководителем лица)
        Выгружается информация из поля «Гл. бухгалтер» }
      aDataDocument.setAttribute( 'NAME_BUH_UBP',
                                  aSourceXml.getAttribute('CHEQUE_FIO_BUHGALT_STR'));
      { Дата подписания заявки - Выгружается информация
        из поля «Дата подписания» }
      CopyNotEmptyAttrXmlDateTime( aSourceXml, 'RESPPERSON_SIG_DATE',
                                   aDataDocument, 'DATE_POD_UBP');
      // Отметка ОрФК о постановке на учет / Номер заявки	- Не выгружается

      // Отметка ОрФК о постановке на учет/Дата постановки на учет - Не выгружается

      // Отметка ОрФК о постановке на учет / Должность ответственного
      // исполнителя	 - Не выгружается

      // Отметка ОрФК о постановке на учет / ФИО ответственного
      // исполнителя	 - Не выгружается

      // Отметка ОрФК о постановке на учет / Телефон ответственного
      // исполнителя	- Не выгружается


      // exchange #2616 - ТФФ 12 - заполнение поля ZR.OKPO_FO
      DoFill2616_ZR_OKPO_FO( aSourceXml, aDataDocument);

      // exchange #2616 - сохраняем значение поля ZR.TYPE
      xZR_TYPE := VarToStr( aDataDocument.GetAttribute( 'TYPE'));

      // exchange #2801
      // заполнение поля ФАИП в поле ZR.FAIP_CODE
      ExchExport_FAIP( aSourceXml, aDataDocument, 'FAIP_CODE');

      // цикл по строкам документа
      for i := 0 to aSourceXml.childNodes.Length - 1 do begin
        xNode := aSourceXml.childNodes.items[ i];

        // расшифровка строк
        try
          // exchange #3096
          // создаем раздел ZRST но не выгружаем его
{          xDocZRST := aDataDocument.ParentNode.appendChild(
                                  FillElementBySchemaEx( aSchema, 'ZRST', NULL));}
          xDocZRST := FillElementBySchemaEx( aSchema, 'ZRST', NULL);

          except
            ExceptionLog( 'Сбой добавления раздела ZRST');
        end;
        // Источник средств - Выгружать значение 6
        xDocZRST.setAttribute( 'KOD_IST_KBK', '6');
        // Тип КБК плательщика - Выгружается тип бюджетной классификации.
        // Для ЭД Заявка на оплату расходов - 10
        xDocZRST.setAttribute( 'TYPE_KBK_PAY', '10');
        { Код по БК плательщика:
          В позициях с 1-7 нули с 18 по 20 указывается КОСГУ.
          exchange #3062
          поле косгу исключается. вместо него выгружается последние 3 цифры
          из КВР.}
        xDocZRST.setAttribute( 'KBK_PAY',
                               GetRuleKBKLine_R( '0',
                                                 '0',
                                                 '0',
                                                 xNode.getAttribute( 'KVR_CODE'),
                                                 '0',
                                                 aSourceXml.getAttribute('BUDGET_ID'),
                                                 //aBudgetID,
                                                 FALSE,
                                                 '00000000000000000---'));
                                      {
        xDocZRST.setAttribute( 'KBK_PAY',
                  AppendStringLeft( xNode.getAttribute( 'KESR_CODE'), 20, '0'));
                  }
        { Тип КБК получателя - Не выгружается}

        // Код по БК получателя	 - Не выгружается

        //Код цели субсидии / субвенции плательщика - Выгружается из поля Доп.ФК
        xDocZRST.setAttribute( 'ADD_KLASS_PAY',
                               xNode.getAttribute( 'KDF_CODE'));
        // Код цели субсидии / субвенции получателя - Не выгружается

        { Сумма в валюте заявки	}
        xDocZRST.setAttribute( 'SUM_V_KBK',
                                FormatStrAsNumberP2( xNode.getAttribute('AMOUNT')));
        // Сумма в рублях	- Не выгружается

        { Назначение платежа - Значение поля «Назначение платежа строки» }
        xDocZRST.setAttribute( 'PURPOSE_KBK',
                               xNode.getAttribute( 'DESCRIPTION_LINES'));
        // Примечание	- Не выгружается


        // exchange #2616 - ТФФ 12
        DoFill2616_ZRST_KBK_RCP( xZR_TYPE, xNode, xDocZRST);
        // exchange #3096
        // выгружаем раздел ZRTS
        DoAppendZRST_( aDataDocument.ParentNode, xDocZRST);
      end;//for//


      Result := TRUE;
      except
        ExceptionLog( 'Сбой Un_Exch2372.Exch2372_Class11');
    end;

end;



function Exch2372_Prepare( var aSourceXml: Variant;
                           var aDocsGroups: Variant;
                           var aGroups: TStringList): integer;
var
  i: integer;
  xCount: integer;
  xNode: Variant;
  xDocType: integer;
  xFromBudgLevel: string;
  xFromKodUbp: string;
  xFromNameUbp: string;
  xToKodTofk: string;
  xToNameTofk: string;
  xOrgCode: string;
  xResultCode: integer;
  xCheckDocType0: boolean;
  xCheckDocType1: boolean;
  xDocTypeHash: integer;
  xDocInfo: string;
  xCheckVer2_28: boolean;
  xCheckVer2_27: boolean;
begin

    try
      xCount := aSourceXml.childNodes.Length;

      Result := xCount;
      WriteLog( 'Выполняется группировка ЭД перед экспортом...', TRUE);
      SetProgress( 0, xCount);
      // флаги проверки документов разных типов
      xCheckDocType0 := FALSE;
      xCheckDocType1 := FALSE;
      xCheckVer2_27 := TRUE;
      xCheckVer2_28 := TRUE;
      for i := 0 to xCount - 1 do begin
        ShowProgress( i);
        xNode := aSourceXml.childNodes.Item[i];

        // название ЭД по номеру класса вида: "[префикс] "название" номер дата"
        // при этом префикс строки не указывается. он будет разный для
        // предварительного сообщения и для ошибок экспорта.
        xDocInfo := GetDocumentInfo( xNode);
        // описание ЭД в журнал
        WriteLog( 'Экспорт ЭД:' + xDocInfo, FALSE);

        { определяем тип документа.
          по типу документа формируем флаг для хэш кода документа.
          для каждого типа документа выполняется проверка версии АЦК-финансы}
        xDocType := Exch2372_DocumentType( xNode);
        case xDocType of
          { документ относится к выгрузке по старому варианту ZR.
            поэтому проверяем версию АЦК-финансы на 2.28 и выше.}
          0: begin
                xDocTypeHash := 0;           // $0000000
                if NOT xCheckDocType0 then begin
                  xCheckDocType0 := TRUE;
                  xCheckVer2_28 := CompareVersionAZK_Finance(
                            'Выгрузка ЭД с параметром "Выгрузка БУ/АУ" по старой схеме',
                            '2.28',
                            FALSE);
                end;
                if NOT xCheckVer2_28
                  then xResultCode := -1
                  else
                { получаем описание этого документа (адресная информация о
                  получателе и отправителе, для формирования заголовка
                  документа экспорта в разделах FROM и TO для классов 11 и 75.
                  прочие классы считаем недопустимыми для экспорта в этом
                  режиме}
                xResultCode := DoDefineDoc2344_TFF9(
                                                xNode,
                                                xNode.getAttribute( 'BUDGET_ID'),
                                                xFromBudgLevel,
                                                xFromKodUbp,
                                                xFromNameUbp,
                                                xToKodTofk,
                                                xToNameTofk,
                                                xOrgCode);
              end;

          { документ относится к выгрузке по новому варианту ZR.
            поэтому проверяем версию АЦК-финансы на 2.27 и выше.}
          1,2: begin
                xDocTypeHash := 16777216;    // $1000000
                if NOT xCheckDocType1 then begin
                  xCheckDocType1 := TRUE;
                  xCheckVer2_27 := CompareVersionAZK_Finance(
                            'Выгрузка ЭД с параметром "Выгрузка БУ/АУ" по новой схеме',
                            '2.27.6',
                            FALSE);
                end;
                { получаем описание этого документа (адресная информация о
                  получателе и отправителе, для формирования заголовка
                  документа экспорта в разделах FROM и TO по Exchange #2372.}
                if NOT xCheckVer2_27
                  then xResultCode := -1
                  else
                xResultCode := DoDefineDoc2372( xNode,
                                                xNode.getAttribute( 'BUDGET_ID'),
                                                xFromBudgLevel,
                                                xFromKodUbp,
                                                xFromNameUbp,
                                                xToKodTofk,
                                                xToNameTofk,
                                                xOrgCode);
              end;

          else xResultCode := -1;
        end;//case//

        { если по документу информация об отправителе и получетеле не получена,
          то документ не экспортируется.
          если документ не экспортируется - уменьшаем счетчик экспортируемых
          документов на 1.}
        if (xResultCode <> 0) then begin
          WriteInfo( 'ЭД не выгружается:' + xDocInfo, FALSE);
          DEC( Result);
        end else
          { формируем группу экспортируемого ЭД, если по документу получена
            информация об отправителе и получателе.
            если документ не экспортируется - уменьшаем счетчик экспортируемых
            документов на 1.}
          if NOT Export_DocumentGroup( i,
                                       aDocsGroups,
                                       aGroups,
                                       xDocInfo,
                                       xResultCode,
                                       xDocTypeHash,
                                       xFromBudgLevel,
                                       xFromKodUbp,
                                       xFromNameUbp,
                                       xToKodTofk,
                                       xToNameTofk,
                                       xOrgCode)
            then begin
              WriteInfo( 'ЭД не выгружается:' + xDocInfo, FALSE);
              DEC( Result);
            end;
      end;//for//

      except
        ExceptionLog( 'Сбой Un_Exch2372.Exch2372_Prepare');
    end;

end;


begin
end.
