{ exchange #3117
  обновление xml, на основе которого будет создан файл экспорта в ФК.

  Добавить настройку «Выгружать КБК для 30 ЛС ФК » с выпадающим списком
  значений:
    - "Да";
    - "Нет" (по умолчанию).
  в следующие  конфигурационные файлы:
    - Выгрузка заявок БУ/АУ на кассовый расход - Exp_FK_AubuZR.cfg,
    - Выгрузка заявок БУ/АУ на получение наличных - Exp_FK_AubuZS.cfg,
    - Выгрузка заявок АУ по формату платёжного поручения - Exp_FK_AubuPP.cfg,
    - Выгрузка заявок БУ/АУ на получение наличных  с типом карта - Exp_FK_AubuZN.cfg
    - Расшифровка сумм неиспользованных средств  Exp_FK_RN.cfg
    - Справка-Уведомление об уточнении операций БУ/АУ Exp_FK_UK.cfg

  Если в параметре установлено значение «Нет» :
    1. ZR в блоке ZRST .KBK_PAY выгружать значение «Пусто»,
        если первые два знака  LS_UBP_PAY равны «30».
    2. ZS в блоке ZSCH2.KBK выгружать значение «Пусто» ,
        если первые два знака  LS_PAY равны «30».
    3. ZN в блоке ZNKBK.KBK выгружать значение «Пусто» ,
        если первые два знака блока  LS  равны «30».
    4. PPT в  блоке PPST.KBK выгружать значение «Пусто»,
        если первые два знака  LS_PAY равны «30».
    5. RN  в блоке RN.KBK выгружать  значение «Пусто»,
        если первые два знака  LS  равны «30».
    6. UK в блоке UKPP.KBK и UKPP_N.KBK  выгружать  значение «Пусто» ,
        если первые два знака  LS_NUBP  равны «30».

  Если в параметре установлено значение «Да» выгружать КБК
  в соответствии с текущей реализацией.


  собрано в одном модуле с целью унификации кода.
  идея в том, что в конце формирования xml по которой формируется файл в ФК,
  выполнить обновление. поскольку у всех файлов принцип одинаковый,
  то решено реализовать весь код в одном месте.
  таким образом обработка будет немного медленнее, но зато без дублей кода.

  особенность такой реализации заключается в том, что нельзя одновременно
  выгружать эд ау/бу и не ау/бу, поскольку класс эд в файле не указывается,
  а распознавать по счету нельзя.
  поэтому, если в конфиге признак указан, только для этих выгрузок
  будет работать чистка кбк.}
{------------------------------------------------------------------------------}
var
  vCfg_ExpKBKforLS30: boolean;
{------------------------------------------------------------------------------}
{~InitializeExportBy3117
  инициализация параметра из конфига}
procedure InitializeExportBy3117( aCfg: TStringList);
begin

    try
      case aCfg.Values[ 'Выгружать КБК для 30 ЛС ФК'] of
        'Да':   vCfg_ExpKBKforLS30 := TRUE;
        'Нет':  vCfg_ExpKBKforLS30 := FALSE;
        // в случае если параметра нет - чистку кбк не выполняем
        else    vCfg_ExpKBKforLS30 := TRUE;
      end;//case//
      except
        ExceptionProc( 'InitializeExportBy3117');
    end;

end;
{------------------------------------------------------------------------------}
{~UpdateXmlOutBy3117
  предобработка xml перед выгрузкой в файл.
  aXml - ссылка на xml ole variant, а не xml.documentElement!
  в крайнем случае: xml.OwnerDocument;
  поскольку алгоритм общий, структура xml может быть линейной, а может быть
  вложенной, поэтому учитываем оба варианта.}
procedure UpdateXmlOutBy3117( aXml: Variant);
{-----------------------------------------------------------------------------}
  procedure DoClearKBK_( aXmlNode: Variant; aIndexFrom, aIndexTo: integer);
  var
    i: integer;
    xNode: Variant;
  begin
  
      try
        for i := aIndexFrom to aIndexTo do begin
          xNode := aXmlNode.childNodes.Items[ i];
          case xNode.NodeName of
            // как только находим коррневые разделы - прерываем чистку
            // додразделов. это из-за того, что есть вложенные подразделы
            // которые не обновляются, например для ZR есть ZROSN и ZRST,
            // а обновлять нужно поля в разделе ZRST до первого ближайшего ZR.
            'ZR','ZN','ZS','PPT','RN','UK': BREAK;
            // подразделы, для которых чистим кбк
            'ZRST': xNode.SetAttribute( 'KBK_PAY', '');
            'ZSCH2': xNode.SetAttribute( 'KBK', '');
            'ZNKBK': xNode.SetAttribute( 'KBK', '');
            'PPST': xNode.SetAttribute( 'KBK', '');
            'RNKBK': xNode.SetAttribute( 'KBK', '');
            'UKPP': xNode.SetAttribute( 'KBK', '');
            'UKPP_N': xNode.SetAttribute( 'KBK', '');
          end;//case//
        end;//for//
        except
          ExceptionProc( 'DoClearKBK_');
      end;
  
  end;
{-----------------------------------------------------------------------------}
var
  xXmlDoc: Variant;
  i: integer;
  xNode: Variant;
  xLS: string;
begin

    try
      if vCfg_ExpKBKforLS30 then begin

        EXIT;
      end;

      xXmlDoc := aXml.DocumentElement;
      for i := 0 to xXmlDoc.childNodes.length - 1 do begin
        xNode := xXmlDoc.childNodes.Items[ i];
        case xNode.NodeName of
          'ZR': xLS := GetNodeAttributeEx( xNode, 'LS_UBP_PAY');
          'ZN': xLS := GetNodeAttributeEx( xNode, 'LS');
          'ZS': xLS := GetNodeAttributeEx( xNode, 'LS_PAY');
          'PPT': xLS := GetNodeAttributeEx( xNode, 'LS_PAY');
          'RN': xLS := GetNodeAttributeEx( xNode, 'LS');
          'UK': xLS := GetNodeAttributeEx( xNode, 'LS_NUBP');
          // прочие узлы игнорируем
          else CONTINUE;
        end;//case//



        if (COPY( xLS, 1, 2) <> '30')
          then CONTINUE;

        // чистим кбк во всех вложенных узлах
        if (xNode.childNodes.length > 0)
          then DoClearKBK_( xNode, 0, xNode.childNodes.length - 1);

        // чистим кбк во всех линейных узлах
        DoClearKBK_( xXmlDoc, i + 1, xXmlDoc.childNodes.length - 1);
      end;//for//
      except
        ExceptionProc( 'UpdateXmlOutBy3117');
    end;

end;
{------------------------------------------------------------------------------}
begin
end.
