function CheckIK_Line_2855( aNode: Variant;
                            aLineNo: string;
                             aTopicName: string;
                             aAttr_TYPE_KBK, aAttr_KBK: string;
                             aDocInfo: string): boolean;
begin

    try
      Result := TRUE;
      (*
      // exchange #2952 + exchange #2955
      // проверяем, если в строке есть атрибут игнорирования проверки по
      // exchange #2855 то проверку полей в строке не выполняем,
      // а результат всегда будет =true.
      if (LENGTH( VarToStr( aNode.GetAttribute( '_ignore_2855_'))) > 0) then begin

        EXIT;
      end;
      *)
      // если тип КБК не заполнен, писать сообщение в
      // лог «Строка с неустановленным типом КБК не создана».
      // согласовано с АО - не создавать эд, а не строку.

      if (LENGTH( VarToStr( aNode.GetAttribute( aAttr_TYPE_KBK))) <= 0) then begin
        // в первый раз перед ошибкой отображаем описание эд
        if Result then
          if (LENGTH( aDocInfo) > 0)
            then WriteInfo( aDocInfo);

        WriteInfo( FORMAT( 'Не заполнено поле тип КБК (%s.%s) - ЭД не будет создан',
                            [ aTopicName, aAttr_TYPE_KBK]));
        Result := FALSE;
      end;
      // 5.1.3.	Изменена обязательность поля ZRST.KBK_PAY на Нет.
      // Добавить условие – строку в системе не создавать,
      // если ZRST.KBK_PAY не заполнен,
      // писать сообщение в лог «Строка с незаполненным КБК не создана».
      // согласовано с АО - не создавать эд, а не строку.

      if (LENGTH( VarToStr( aNode.GetAttribute( aAttr_KBK))) <= 0) then begin
        // в первый раз перед ошибкой отображаем описание эд
        if Result then
          if (LENGTH( aDocInfo) > 0)
            then WriteInfo( aDocInfo);

        WriteInfo( FORMAT( 'Не заполнено поле КБК (%s.%s) - ЭД не будет создан',
                            [ aTopicName, aAttr_KBK]));
        Result := FALSE;
      end;
      except
        ExceptionLog( 'Сбой Un_ImpIK_2855.CheckIK_Line_2855');
    end;

end;

{~CheckIK_Lines_2855
  exchange #2855
  проверка строк раздела aTopic с названием раздела aTopicName
  на заполнение полей:
    aTopic.строка.aAttr_TYPE_KBK и aTopic.строка.aAttr_KBK.
  только для тфф16

  aTopic - раздел IK файла (ZR/ZS/ZN).
        подразумевается, что разделы строки будут подэлементами в этом разделе.
  aTopicName - название раздела: ZRST/ZNKBK/ZSCH2

  aDocInfo - описание эд для лога.
              допускается указание пустой строкой. в этом случае в журнале
              эта строка не отображается.
              строка отображается перед первым сообщением в журнале,
              о неправильно заполненной строке ZRST.

  результат:
    =true - строки проверены - эд создавать можно.
    =false - есть ошибки. эд создавать нельзя}
function CheckIK_Lines_2855( aTopic: Variant;
                             aTopicName: string;
                             aAttr_TYPE_KBK, aAttr_KBK: string;
                             aDocInfo: string): boolean;
var
  i: integer;
  xNode: Variant;
begin

    try
      Result := TRUE;
      // exchange #2934
      // добавилась ТФФ 17, поэтому все доработки по ТФФ 16 есть и в ТФФ 17
      // exchange #2996
      // добавилась ТФФ 18 - добавлена обработка как в тфф 17
      // exchange #3040 - к тфф18 и выше
      // поскольку тфф15 уже нет, то здесь тфф уже не проверяется
      {if (IsVersionSupport( cnVersionTFF_16)
          OR IsVersionSupport( cnVersionTFF_17)
          OR IsVersionSupport( cnVersionTFF_18)) then}
        if ( aTopic.ChildNodes.Length <= 0) then begin
          // проверяем наименование раздела с ожидаемым для проверки.
          if ( aTopic.NodeName = aTopicName) then
            if NOT CheckIK_Line_2855( aTopic,
                                      '1',
                                      aTopicName,
                                      aAttr_TYPE_KBK,
                                      aAttr_KBK,
                                      aDocInfo)
              then Result := FALSE;
        end else
          for i := 0 to aTopic.ChildNodes.Length -1 do
            // проверяем вложенные узлы на указанное имя раздела xml
            // проблема в том, что раздел IK.ZS содеоржит внутри
            // подразделы ZSCH1 и ZSCH2 в одной куче, а проверять
            // нужно только ZSCH2. другие подразделы могут быть подобными.
            if ( aTopic.ChildNodes.Item[i].NodeName = aTopicName) then
              if NOT CheckIK_Line_2855( aTopic.ChildNodes.Item[i],
                                        INTTOSTR( i + 1),
                                        aTopicName,
                                        aAttr_TYPE_KBK,
                                        aAttr_KBK,
                                        aDocInfo)
                then Result := FALSE;

      except
        ExceptionLog( 'Сбой Un_ImpIK_2855.CheckIK_Lines_2855');
    end;

end;

{~CheckIK_ZR_ZRST_2855
  exchange #2855
  проверка строк ZR.ZRST на заполнение ZRST.TYPE_KBK_PAY и ZRST.KBK_PAY
  только для тфф16

  aZR - раздел ZR.
        подразумевается, что разделы ZRST будут подэлементами.

  aDocInfo - описание эд для лога.
              допускается указание пустой строкой. в этом случае в журнале
              эта строка не отображается.
              строка отображается перед первым сообщением в журнале,
              о неправильно заполненной строке ZRST.

  результат:
    =true - строки проверены - эд создавать можно.
    =false - есть ошибки. эд создавать нельзя}
function CheckIK_ZR_ZRST_2855( aZR: Variant;
                               aDocInfo: string = ''): boolean;
begin

    try
      Result := CheckIK_Lines_2855( aZR, 'ZRST', 'TYPE_KBK_PAY', 'KBK_PAY', aDocInfo);

      except
        ExceptionLog( 'Сбой Un_ImpIK_2855.CheckIK_ZR_ZRST_2855');
    end;

end;


{~CheckIK_ZS_ZSCH2_2855
  exchange #2855
  проверка строк ZS.ZSCH2 на заполнение ZSCH2.TYPE_KBK и ZSCH2.KBK
  только для тфф16

  aZS - раздел ZS.
        подразумевается, что разделы ZSCH2 будут подэлементами.

  aDocInfo - описание эд для лога.
              допускается указание пустой строкой. в этом случае в журнале
              эта строка не отображается.
              строка отображается перед первым сообщением в журнале,
              о неправильно заполненной строке ZSCH2.

  результат:
    =true - строки проверены - эд создавать можно.
    =false - есть ошибки. эд создавать нельзя}
function CheckIK_ZS_ZSCH2_2855( aZS: Variant;
                                aDocInfo: string = ''): boolean;
begin

    try
      Result := CheckIK_Lines_2855( aZS, 'ZSCH2', 'TYPE_KBK', 'KBK', aDocInfo);

      except
        ExceptionLog( 'Сбой Un_ImpIK_2855.CheckIK_ZS_ZSCH2_2855');
    end;

end;

{~CheckIK_ZS_ZSCH2_2855
  exchange #2855
  проверка строк ZN.ZNKBK на заполнение ZNKBK.TYPE_KBK и ZNKBK.KBK
  только для тфф16

  aZN - раздел ZN.
        подразумевается, что разделы ZNKBK будут подэлементами.

  aDocInfo - описание эд для лога.
              допускается указание пустой строкой. в этом случае в журнале
              эта строка не отображается.
              строка отображается перед первым сообщением в журнале,
              о неправильно заполненной строке ZNKBK.

  результат:
    =true - строки проверены - эд создавать можно.
    =false - есть ошибки. эд создавать нельзя}
function CheckIK_ZN_ZNKBK_2855( aZN: Variant;
                                aDocInfo: string = ''): boolean;
begin

    try
      Result := CheckIK_Lines_2855( aZN, 'ZNKBK', 'TYPE_KBK', 'KBK', aDocInfo);

      except
        ExceptionLog( 'Сбой Un_ImpIK_2855.CheckIK_ZN_ZNKBK_2855');
    end;

end;

{~CheckIK_ZV_ZVDOC_2855
  exchange #2855
  проверка строк ZV.ZVDOC на заполнение ZVDOC.TYPE_KBK и ZVDOC.KBK
  только для тфф16

  aZV - раздел ZV.
        подразумевается, что разделы ZVDOC будут подэлементами.

  aDocInfo - описание эд для лога.
              допускается указание пустой строкой. в этом случае в журнале
              эта строка не отображается.
              строка отображается перед первым сообщением в журнале,
              о неправильно заполненной строке ZVDOC.

  результат:
    =true - строки проверены - эд создавать можно.
    =false - есть ошибки. эд создавать нельзя}
function CheckIK_ZV_ZVDOC_2855( aZV: Variant;
                                aDocInfo: string = ''): boolean;
begin

    try
      Result := CheckIK_Lines_2855( aZV, 'ZVDOC', 'TYPE_KBK', 'KBK', aDocInfo);

      except
        ExceptionLog( 'Сбой Un_ImpIK_2855.CheckIK_ZV_ZVDOC_2855');
    end;

end;

        (*
{~CheckIK_UF_UFPP_UFPP_N_2855
  exchange #2855
  проверка строк UF.UFPP и UF.UFPP_N на заполнение полей TYPE_KBK и KBK
  только для тфф16

  aUF - раздел UF.
        подразумевается, что разделы UFPP/UFPP_N будут подэлементами.
        в данном случае разделы UFPP/UFPP_N должны быть вложены в раздел aUF
        без группировки по подразделам UFPP/UFPP_N.

  aDocInfo - описание эд для лога.
              допускается указание пустой строкой. в этом случае в журнале
              эта строка не отображается.
              строка отображается перед первым сообщением в журнале,
              о неправильно заполненной строке UFPP/UFPP_N.
              успешной считается проверка всех строк: UFPP и UFPP_N.

  результат:
    =true - строки проверены - эд создавать можно.
    =false - есть ошибки. эд создавать нельзя}
function CheckIK_UF_UFPP_UFPP_N_2855( aUF: Variant;
                                       aDocInfo: string = ''): boolean;
begin

    try
      Result := FALSE;
      if CheckIK_Lines_2855( aUF, 'UFPP', 'TYPE_KBK', 'KBK', aDocInfo) then
        if CheckIK_Lines_2855( aUF, 'UFPP_N', 'TYPE_KBK', 'KBK', aDocInfo)
          then Result := TRUE;

      except
        ExceptionLog( 'Сбой Un_ImpIK_2855.CheckIK_UF_UFPP_UFPP_N_2855');
    end;

end;
*)

begin
end.
