const
  sqlOrgAccount = 'Select A.Id, A.Account_Number, A.Org_id, B.Id Budget_Id' +
    ', B.Caption Budget_Name, O.Description, O.TaxCode, O.Kpp' +
    ' From OrgAccount A ' +
    ' Left Join Budget B On (B.Org_Id = A.Org_Id And B.BudgKind = 2 And B.Finyear = ?)' +
    ' Left Join Org O On (O.Id = A.Org_id)' +
    ' Where B.Id Is Not Null And A.Close_Date Is Null And A.Account_Number = ?';

  // Exchange #2354
  // поиск счета в настройках счетов (Бухгалтерия - Настройка счетов - Счета ФО
  // - группа полей Счета бюджета) с типом "Счет для учета операций БУ/АУ".
  // с учетом фин.года
  // exchange #2670
  // отключена проверка типа счета (проверяется в обоих типах счета)
  // при поиске счета в Бухгалтерия - Настройка счетов - Счета ФО
  sqlBuchFO_Account = 'select distinct B.Id Budget_Id, oa.Id, oa.Account_Number,'
   +' oa.org_id, B.Caption Budget_Name, O.Description, O.TaxCode, O.Kpp'
   +' from budgetorgaccount boa'
   +' join orgaccount oa on oa.id = boa.orgaccount_id'
   +' Join Budget B On (B.id = boa.budget_id And B.Finyear = ?)'
  // по exchange #2519 убран из связи бюджет-счет оператор left из Join Budget B On...
//   +' Left Join Budget B On (B.id = boa.budget_id And B.Finyear = ?)'
   +' Left Join Org O On (O.Id = oa.Org_id)'
   +' where oa.Close_Date Is Null ' //and boa.budgetorgaccounttype_id=1'
   +' and oa.Account_Number = ?';

  // Exchange #2439
  // к запросу #2354
  // поиск счета в настройках счетов (Бухгалтерия - Настройка счетов - Счета ФО
  // - группа полей Счета бюджета) с типом "Счет для учета операций БУ/АУ".
  // с учетом фин.года
  // добавлена проверка БИК для типа счета - банковский.
  // exchange #2670
  // отключена проверка типа счета (проверяется в обоих типах счета)
  // при поиске счета в Бухгалтерия - Настройка счетов - Счета ФО
  sqlBuchFO_Account_2439 =
    'select distinct B.Id Budget_Id, oa.Id, oa.Account_Number,'
   +' oa.org_id, B.Caption Budget_Name, O.Description, O.TaxCode, O.Kpp'
   +' from budgetorgaccount boa'
   +' join orgaccount oa on oa.id = boa.orgaccount_id'
  // по exchange #2519 убран из связи бюджет-счет оператор left из Join Budget B On...
  // здесь это дает то, что возвратится только одна организация, которая имеет
  // счет, который связан с бюджетом через список счетов: Бухгалтерия - Настройка
  // счетов - Счета ФО. в случае с left возвращалась организация, в которой
  // присутсвал нужный счет, но этот счет отсутствовал в списке счетов:
  // Бухгалтерия - Настройка счетов - Счета ФО.
   +' Join Budget B On (B.id = boa.budget_id And B.Finyear = ?)'
//   +' Left Join Budget B On (B.id = boa.budget_id And B.Finyear = ?)'
   +' Left Join Org O On (O.Id = oa.Org_id)'
   +' join bank bn on bn.id=oa.bank_id and bn.BIC=?'
   +' where oa.Close_Date Is Null '//and boa.budgetorgaccounttype_id=1'
   +' and oa.Account_Number = ? and oa.orgacctype_id=2';

  // Exchange #2376
  // По номеру счета Плательщика  (Асс)  определять бюджет, в котором находится
  // ПП (13): по таблице Счета Бюджета (Бухгалтерия/Настройка счетов/Счета ФО)
  // этим запросом проверяем количество бюджетов для указанного счета
  // Exchange #2435
  // в запрос добавлен параметр финансового года.
  sqlBuchFO_2376 = 'select count(*) BUDGCOUNT from ('
   +' select distinct boa.budget_id'
   +' from budgetorgaccount boa'
   +' join budget b on b.id=boa.budget_id and b.finyear=?'
   +' join orgaccount oa on oa.id = boa.orgaccount_id'
   +' where oa.Account_Number = ?)';

  // Exchange #2435
  // в запрос добавлен параметр финансового года.
  sqlBuchFO_2376_Budget =
    ' select boa.budget_id ID'
   +' from budgetorgaccount boa'
   +' join budget b on b.id=boa.budget_id and b.finyear=?'
   +' join orgaccount oa on oa.id = boa.orgaccount_id'
   +' where oa.Account_Number = ?';

  // Exchange #2439
  // По номеру счета Плательщика  (Асс)  определять бюджет, в котором находится
  // ПП (13): по таблице Счета Бюджета (Бухгалтерия/Настройка счетов/Счета ФО)
  // этим запросом проверяем количество бюджетов для указанного счета
  // в запрос добавлен параметр финансового года.
  // но еще учитываем что счет банковский и БИК
  sqlBuchFO_2439 = 'select count(*) BUDGCOUNT from ('
   +' select distinct boa.budget_id'
   +' from budgetorgaccount boa'
   +' join budget b on b.id=boa.budget_id and b.finyear=?'
   +' join orgaccount oa on oa.id = boa.orgaccount_id'
   +' join bank bn on bn.id=oa.bank_id and bn.BIC=?'
   +' where oa.Account_Number = ? and oa.orgacctype_id=2)';

  // Exchange #2439
  // в запрос добавлен параметр финансового года.
  // но еще учитываем что счет банковский и БИК
  sqlBuchFO_2439_Budget =
    ' select boa.budget_id ID'
   +' from budgetorgaccount boa'
   +' join budget b on b.id=boa.budget_id and b.finyear=?'
   +' join orgaccount oa on oa.id = boa.orgaccount_id'
   +' join bank bn on bn.id=oa.bank_id and bn.BIC=?'
   +' where oa.Account_Number = ? and oa.orgacctype_id=2';

var
  // exchange #2538 - параметр "Учитывать счет Плательщика"
  vCfgPayerAccountConsider: boolean;
  // exchange #2383 - параметр "В 24 классе заполнять дату по банку из EDDate при загрузке ed 108"
  vCfgDateBank2583: boolean;

  // exchange #2696 - параметр перевода времени в UTC
  vCfgConvertTimeToUTC: boolean;

  // exchange #2696 - параметр перевода времени в UTC для шаблоков excel
  vReportConvertTimeToUTC: string;

  // exchange #2769 - параметр: "Формировать одно Приложение к выписке
  // кредитовое по ed108"
  vCfgLoadED108by2769: boolean;



procedure FillOrgAttribute(Xml: Variant; Budget_Id: String);
var
  XmlOrg: Variant;
begin
  if Trim(Xml.getAttribute('ORG_TAXCODE')) = '' then
    Exit;
  sql := 'Select O.Id' +
    ' From Org O' +
    ' Join Contractor C On C.Org_Id = O.Id' +
    ' Join Budget B On B.Org_Id = C.Inspector_Id' +
    ' Where O.Close_Date Is Null And B.Id = ? And O.TaxCode = ?';
  XmlOrg := QueryXml(sql, [Budget_Id, Trim(Xml.getAttribute('ORG_TAXCODE'))]);
  XmlOrg := XmlOrg.documentElement.childNodes;
  if XmlOrg.length  = 0 then
    Exit;
  if XmlOrg.length  = 1 then
  begin
    if Xml.getAttribute('REC_ID') = XmlOrg.items[0].getAttribute('ID') then
      Exit;
    Xml.setAttribute('ORG_ID', XmlOrg.items[0].getAttribute('ID'));
    Exit;
  end;
  if VarIsNull(Xml.getAttribute('ORG_KPP')) then
    Exit;
  sql := sql + ' And Kpp = ?';
  XmlOrg := QueryXml(sql, [Budget_Id, Xml.getAttribute('ORG_TAXCODE'), Xml.getAttribute('ORG_KPP')]);
  XmlOrg := XmlOrg.documentElement.childNodes;
  if XmlOrg.length  = 0 then
    Exit;
  if (XmlOrg.length  = 1) and (Xml.getAttribute('REC_ID') <> XmlOrg.items[0].getAttribute('ID'))  then
    Xml.setAttribute('ORG_ID', XmlOrg.items[0].getAttribute('ID'));
end; {End FillOrgAttribute}

// Заполнение Xml - задания в (Element) на вставку в АЦК
// информацией из идентификатора платежа (DepartmentalInfo) ЭД (ED)
procedure FillDepartmentalInfo(ED, Element: Variant; Budget_Id: String);
var
  xFlagFill: boolean;
  xKBK: string;
begin

    try
      // Если это Акредитив (ED102) или Платёжное требование (ED103) -
      // они не содержат блока (DepartmentalInfo)
      // или не заполненн статус лица, оформившего платёжь - выходим
      if (ED.EDType in [edtED102, edtED103]) then Exit;
      ED.DepartmentalInfo.DrawerStatus := Trim(ED.DepartmentalInfo.DrawerStatus);
      // Проверка показателя статуса лица, оформившего платёжь
      if ED.DepartmentalInfo.DrawerStatus <> '' then
      begin
        // Ищем запросом по базе АЦК, не стал заводить TClientDataSet на этот справочник,
        // в банковских платёжах не часто заполняют для ФО идентификатор платежа.
        // основные платежи по налогам проходять через УФК
        VarValue := QueryField('Select Id From PayDocAuthor Where Id = ?',
          [ED.DepartmentalInfo.DrawerStatus], 'ID');
        if VarValue = Null then
          WriteInfo(Msg + ' - Не найден в АЦК статус лица, оформившего платёж: ' +
            ED.DepartmentalInfo.DrawerStatus)
          else
        Element.setAttribute('AUTHOR_ID', VarValue);
      end;
      { exchange #2791
        доработать проверку, возникающую при 0 (разрешить вставлять ровно 20
        знаков либо 0, больше ничего) в КБК ИДП при создании 24 класса}
      xKBK := Trim(ED.DepartmentalInfo.CBC);
      ED.DepartmentalInfo.CBC := xKBK;

      { exchange #3061
        Значения для полей кодов классификации  с типом "Доходы" (поле 104)
        требуется вычислять из значения реквизита ed:DepartmentalInfo.CBC:
          - Администатор = значению CBC с 1 по 3 знак (начиная слева);
          - КВД - значению CBC с 4 по 20 знак (начиная слева)
          - КОСГУ - не заполнять.
        Всегда делаем доходную строку, начиная с кода главного администратора,
        нет теперь у нас КОСГУ.
        это должно работать только для бюджета с годом 2016 и выше.}

      // Если заполнена бюджетная классификация (полностью - 20 знаков),
      // проверяем составляющие
      if Length( ED.DepartmentalInfo.CBC) = 20 then begin
        if vBudgetYear2016andAbove then begin

          Element.setAttribute('PI_ANAL_KIND', '1');

          // Все типы c 1 позиции (3 символа) - Код администратора
          sql := 'Select Code From Kadm Where Budget_Id = ? And Code = ?';
          VarValue := QueryField(sql, [Budget_Id, Copy(ED.DepartmentalInfo.CBC, 1, 3)], 'CODE');
          if varValue = Null then
            // Для доходов и источников это  - Классификатор
            // администраторов поступлений и выбытий
              WriteInfo(Msg + ' - Не найден в АЦК классификатор администраторов' +
                ' поступлений и выбытий: ' + Copy(ED.DepartmentalInfo.CBC, 1, 3) +
                ' (' + ED.DepartmentalInfo.CBC + ')');

          // Для доходов c 4 позиции (14 символа) - Классификатор видов доходов
          sql := 'Select Code From Kd Where Budget_Id = ? And Code = ?';
          VarValue := QueryField(sql, [Budget_Id, Copy(ED.DepartmentalInfo.CBC, 4, 17)], 'CODE');
          if varValue = Null then
            WriteInfo(Msg + ' - Не найден в АЦК классификатор видов доходов: ' +
              Copy(ED.DepartmentalInfo.CBC, 4, 17) +
              ' (' + ED.DepartmentalInfo.CBC + ')');
        end else begin

          // Если не найден КЭС, остальное проверять бесмысленно
          sql := 'Select Anal_Kind From Kes Where Budget_Id = ? And Code = ?';
          VarValue := QueryField(sql, [Budget_Id, Copy(ED.DepartmentalInfo.CBC, 18, 3)], 'ANAL_KIND');

          if (VarValue = null) then
            WriteInfo(Msg + ' - Не найден в АЦК экономический классификатор: ' +
              Copy(ED.DepartmentalInfo.CBC, 18, 3) +
              ' (' + ED.DepartmentalInfo.CBC + ')')
          else
          begin
            // На основании КЭС определяем тип классификации (доходы, расходы, источники)
            Element.setAttribute('PI_ANAL_KIND', VarValue);
            // Все типы c 1 позиции (3 символа) - Код администратора
            if Element.getAttribute('PI_ANAL_KIND') in [1, 2, 3] then
            begin
              sql := 'Select Code From Kadm Where Budget_Id = ? And Code = ?';
              VarValue := QueryField(sql, [Budget_Id, Copy(ED.DepartmentalInfo.CBC, 1, 3)], 'CODE');
              if varValue = Null then
                // Для доходов и источников это  - Классификатор
                // администраторов поступлений и выбытий
                if Element.getAttribute('PI_ANAL_KIND') in [1, 3] then
                  WriteInfo(Msg + ' - Не найден в АЦК классификатор администраторов' +
                    ' поступлений и выбытий: ' + Copy(ED.DepartmentalInfo.CBC, 1, 3) +
                    ' (' + ED.DepartmentalInfo.CBC + ')')
                // Для расходов это  - Ведомственный классификатор расходов
                else
                  WriteInfo(Msg + ' - Не найден в АЦК ведоственный классификатор расходов:' +
                    Copy(ED.DepartmentalInfo.CBC, 1, 3) +
                    ' (' + ED.DepartmentalInfo.CBC + ')');
            end;
            // Для доходов c 4 позиции (14 символа) - Классификатор видов доходов
            if Element.getAttribute('PI_ANAL_KIND') in [1] then
            begin
              sql := 'Select Code From Kd Where Budget_Id = ? And Code = ?';
              VarValue := QueryField(sql, [Budget_Id, Copy(ED.DepartmentalInfo.CBC, 4, 14)], 'CODE');
              if varValue = Null then
                WriteInfo(Msg + ' - Не найден в АЦК классификатор видов доходов: ' +
                  Copy(ED.DepartmentalInfo.CBC, 4, 14) +
                  ' (' + ED.DepartmentalInfo.CBC + ')');
            end;
            // Для источников c 4 позиции (14 символа) - Классификатор видов источников
            if Element.getAttribute('PI_ANAL_KIND') in [3] then
            begin
              sql := 'Select Code From Ki Where Budget_Id = ? And Code = ?';
              VarValue := QueryField(sql, [Budget_Id, Copy(ED.DepartmentalInfo.CBC, 4, 14)], 'CODE');
              if varValue = Null then
                WriteInfo(Msg + ' - Не найден в АЦК классификатор видов источников: ' +
                  Copy(ED.DepartmentalInfo.CBC, 4, 14) +
                  ' (' + ED.DepartmentalInfo.CBC + ')');
            end;
            // Для расходов
            if Element.getAttribute('PI_ANAL_KIND') in [2] then
            begin
              // c 4 позиции (4 символа) - Функциональный классификатор расходов
              sql := 'Select Code From Kfsr Where Budget_Id = ? And Code = ?';
              VarValue := QueryField(sql, [Budget_Id, Copy(ED.DepartmentalInfo.CBC, 4, 4)], 'CODE');
              if varValue = Null then
                WriteInfo(Msg + ' - Не найден в АЦК функциональный классификатор расходов: ' +
                  Copy(ED.DepartmentalInfo.CBC, 4, 4) +
                  ' (' + ED.DepartmentalInfo.CBC + ')');
              // c 8 позиции (7 символа) - Классификатор целевой статьи расходов
              sql := 'Select Code From Kcsr Where Budget_Id = ? And Code = ?';
              VarValue := QueryField(sql, [Budget_Id, Copy(ED.DepartmentalInfo.CBC, 8, 7)], 'CODE');
              if varValue = Null then
                WriteInfo(Msg + ' - Не найден в АЦК классификатор целевой статьи расходов: ' +
                  Copy(ED.DepartmentalInfo.CBC, 8, 7) +
                  ' (' + ED.DepartmentalInfo.CBC + ')');
              // c 15 позиции (3 символа) - Классификатор видов расходо
              sql := 'Select Code From Kvr Where Budget_Id = ? And Code = ?';
              VarValue := QueryField(sql, [Budget_Id, Copy(ED.DepartmentalInfo.CBC, 15, 3)], 'CODE');
              if varValue = Null then
                WriteInfo(Msg + ' - Не найден в АЦК классификатор видов расходов: ' +
                  Copy(ED.DepartmentalInfo.CBC, 15, 3) +
                  ' (' + ED.DepartmentalInfo.CBC + ')');
            end;
          end;
        end;
      end else
        // exchange #2791 - допускается указание кбк=0
        // при этом никаких сообщений в лог писать не будем
        if (ED.DepartmentalInfo.CBC <> '0') then
          // Если заполнена бюджетная классификация (не полностью - 20 знаков),
          if Length(ED.DepartmentalInfo.CBC) <> 0 then begin
            WriteInfo(Msg + ' - Не корректное значение кода бюджетной классификации' +
              ' (' + ED.DepartmentalInfo.CBC + ')');
            // exchange #2791
            // если КБК <>20 символов и <>'0' тогда в 24м классе кбк не заполняем
            xKBK := '';
          end;

    try
      // В любом случае заполняем кредитовое приложение бюджетной классификацией
      // АЦК при вставке не ругается, пусть будет как есть.
      Element.setAttribute('PI_BUDGET_CODE', xKBK);//ED.DepartmentalInfo.CBC);
      // ОКАТО
      Trim(ED.DepartmentalInfo.OKATO);
      if (ED.DepartmentalInfo.OKATO <> '') and (ED.DepartmentalInfo.OKATO <> '0')then
        Element.setAttribute('PAY_OKATO', ED.DepartmentalInfo.OKATO);
      // Основание налогового платежа, ищется запросом по базе АЦК
      ED.DepartmentalInfo.PaytReason := Trim(ED.DepartmentalInfo.PaytReason);
      if ValidInt(ED.DepartmentalInfo.PaytReason) then
        ED.DepartmentalInfo.PaytReason := StrToInt(ED.DepartmentalInfo.PaytReason);
      if ED.DepartmentalInfo.PaytReason <> '' then
      begin
        VarValue := QueryField('Select Id From PayGround Where Name = ?',
          [ED.DepartmentalInfo.PaytReason], 'ID');
        if VarValue = Null then
          WriteInfo(Msg + ' - Не найден в АЦК показатель основания платежа: ' +
            ED.DepartmentalInfo.PaytReason)
        else
          Element.setAttribute('GROUND_ID', VarValue);
      end;
      // exchange #2448
      // для ED101 убрана проверка на 0 для полей: Налоговый период,
      // Номер налогового платежа, Дата налогового платежа и Тип налогового платежа
      // Налоговый период
      ED.DepartmentalInfo.TaxPeriod := Trim(ED.DepartmentalInfo.TaxPeriod);
      xFlagFill := FALSE;
      if (ED.EDType = edtED101) then begin
        if (ED.DepartmentalInfo.TaxPeriod <> '')
          then xFlagFill := TRUE;
      end else begin
        if (ED.DepartmentalInfo.TaxPeriod <> '') and (ED.DepartmentalInfo.TaxPeriod <> '0')
          then xFlagFill := TRUE;
      end;
      if xFlagFill
        then Element.setAttribute('TAXPERIOD', ED.DepartmentalInfo.TaxPeriod);
      // Номер налогового платежа
      ED.DepartmentalInfo.DocNo := Trim(ED.DepartmentalInfo.DocNo);
      xFlagFill := FALSE;
      if (ED.EDType = edtED101) then begin
        if (ED.DepartmentalInfo.DocNo <> '')
          then xFlagFill := TRUE;
      end else begin
        if (ED.DepartmentalInfo.DocNo <> '') and (ED.DepartmentalInfo.DocNo <> '0')
          then xFlagFill := TRUE;
      end;
      if xFlagFill
        then Element.setAttribute('GRND_DOC_NUMBER', ED.DepartmentalInfo.DocNo);
      // Дата налогового платежа
      ED.DepartmentalInfo.DocDate := Trim(ED.DepartmentalInfo.DocDate);
      xFlagFill := FALSE;
      if (ED.EDType = edtED101) then begin
        if (ED.DepartmentalInfo.DocDate <> '')
          then xFlagFill := TRUE;
      end else begin
        if (ED.DepartmentalInfo.DocDate <> '') and (ED.DepartmentalInfo.DocDate <> '0')
          then xFlagFill := TRUE;
      end;
      // exchange #2879
      // поле 109 переносим в ацк-ф как есть
      if xFlagFill
        then Element.setAttribute( 'GRND_DOC_DATE',
                                   ED.DepartmentalInfo.DocDate);

      // Тип налогового платежа, ищется запросом по базе АЦК
      ED.DepartmentalInfo.TaxPaytKind := Trim(ED.DepartmentalInfo.TaxPaytKind);
      // exchange #2448
      // для ED101 убрана проверка на 0.
      // теперь если Тип налогового платежа не пустая строка (включая 0)
      // будет выполнен поиск в справочнике. для прочих ED проверка осталась как была.
      xFlagFill := FALSE;
      if (ED.EDType = edtED101) then begin
        if (ED.DepartmentalInfo.TaxPaytKind <> '')
          then xFlagFill := TRUE;
      end else begin
        if (ED.DepartmentalInfo.TaxPaytKind <> '') and (ED.DepartmentalInfo.TaxPaytKind <> '0')
          then xFlagFill := TRUE;
      end;
      if xFlagFill then
      begin
        VarValue := QueryField('Select Id From PayType Where Name = ?',
          [ED.DepartmentalInfo.TaxPaytKind], 'ID');
        if VarValue = Null then
          WriteInfo(Msg + ' - Не найден в АЦК тип платежа: ' +
            ED.DepartmentalInfo.TaxPaytKind)
        else
          Element.setAttribute('PAYTYPE_ID', VarValue);
      end;
    except
      ExceptionLog( 'Сбой 1: поля идентификатора платежа');
    end;

      except
        ExceptionLog( 'Сбой FillDepartmentalInfo');
    end;

end; {End FillDepartmentalInfo}

{ exchange #2547
  доработка заполнения поля "вид платежа":
-------------------------------------------------------------------------------
  ED                   | Вид платежа           |  Значение реквизита
                       |(PaytKind)             |в расчетном документе
                       |                       |    (PAYKIND)
-----------------------+-----------------------+-------------------------------
  ED101,ED103,ED104,   |                       |
  ED105,ED110,         |   не заполнено ( =-1) |  не заполнять
  ED206,ED217,         |                       |
  ED108                |                       |
-----------------------+-----------------------+-------------------------------
  ED101,ED103,ED104,   |                       |
  ED105,ED110,         |   0 (исключен из ED)  |  ошибка
  ED206,ED217          |                       |
-----------------------+-----------------------+-------------------------------
  ED101,ED103,ED104,   |                       |
  ED105,ED110,         |   1 (исключен из ED)  |  ошибка
  ED206,ED217          |                       |
-----------------------+-----------------------+-------------------------------
  ED101,ED103,ED104,   |                       |
  ED105,ED110,         |   2			             |  почтой**
  ED206,ED217,         |                       |
  ED108                |                       |
-----------------------+-----------------------+-------------------------------
  ED101,ED103,ED104,   |                       |
  ED105,ED110,         |   3			             |  телеграфом**
  ED206,ED217,         |                       |
  ED108                |                       |
-----------------------+-----------------------+-------------------------------
  ED101,ED103,ED104,   |   4                   |  срочный*
  ED217                |                       |
-----------------------+-----------------------+-------------------------------
  ED105,ED110,         |   4                   |  ошибка
  ED206                |                       |
-----------------------+-----------------------+-------------------------------
  ED101,ED103,ED104,   |   5			             |    экстренный* - нет в АЦК-Ф
  ED105,ED110,         |                       |    не заполнять
  ED217                |                       |
-----------------------+-----------------------+-------------------------------
  ED206                |   5                   |    ошибка
-----------------------+-----------------------+-------------------------------
  ED102                |   x                   |   электронно (=1) (как было)
-----------------------+-----------------------+-------------------------------
  ED222                |   x                   |   пусто
-------------------------------------------------------------------------------
  функция проверяет возможное значение "вида платежа" в ED, и возвращает
  код "вида платежа" для документа в АЦК-Ф.
  функция проверяет совместимость с предыдущими версиями.
  результат:
    строка "?" - если код вида платежа не совместим с возможным значением ED;
    пустая строка или код "вида платежа" для АЦК-Ф.
  оказалось что в схемах значение поля не контролируется (только допустимость цифры),
  поэтому контроль допустимых значений контролируем в скрипте.
  если возвращается символ "?" - нужно выдать сообщение о несовестимости
  вида платежа для выгрузки.}
function GetPayKindByValue( aEDType, aEDPaytKind: integer): string;
begin
  try
{отладка
writelog('-----------------------------------------------------------');
writelog('Выполняется GetPayKindByValue( EDType='+inttostr(aEDType)
                            +', aEDPaytKind='+aEDPaytKind+')');
{отладка_конец}
    // для версия до 2.5.9 всегда вид платежа был =1 (электронно)
    // все что >= 2.5.9 - по новому.
    if (Version_CompareEx( Ufebs.FormatVer, '2.5.9') >= 0) then begin
{отладка
writelog('-----------------------------------------------------------');
writelog('   Версия = 2.5.9 и выше');
case aED.EDType of
  edtED101,
  edtED103,
  edtED104,
  edtED105,
  edtED110,
  edtED206,
  edtED217: writelog('   aED.PaytKind = "'+inttostr(aED.PaytKind)+'".');
  else writelog('   aED.PaytKind = не проверяется.');
end;
{отладка_конец}
      case aEDType of
        edtED101,
        edtED103,
        edtED104:
              case aEDPaytKind of
                   -1: Result := '';
                    5: Result := '';
                2,3,4: Result := INTTOSTR( aEDPaytKind);
                else   Result := '?';
              end;//case//

        { exchange #2583
          Может принимать значения в файле, соответствующие значениям системы:
            2 – почтой
            3 – телеграфом
            Отсутствует в файле – не заполнено. }
        edtED108:
              case aEDPaytKind of
                 -1: Result := '';
                2,3: Result := INTTOSTR( aEDPaytKind);
                else Result := '?';
              end;//case//

        edtED217:
              case aEDPaytKind of
                   -1: Result := '';
                    5: Result := '';
                2,3,4: Result := INTTOSTR( aEDPaytKind);
                else   Result := '?';
              end;//case//

        edtED105,
        edtED110:
              case aEDPaytKind of
                   -1: Result := '';
                    5: Result := '';
                  2,3: Result := INTTOSTR( aEDPaytKind);
                else   Result := '?';
              end;//case//

        edtED206:
              case aEDPaytKind of
                   -1: Result := '';
                  2,3: Result := INTTOSTR( aEDPaytKind);
                else   Result := '?';
              end;//case//

        edtED222: Result := '';

        // для прочих ЕD - осталется "электронно"
        edtED102: Result := '1';

        // остальные ED - ошибка
        else Result := '?';
      end;//case//
      EXIT;
    end;
    Result := '1';
    finally
{отладка
writelog('    результат = "'+result+'".');
writelog('-----------------------------------------------------------');
{отладка_конец}
  end;
end;


function GetPayKindByED( aED: Variant): string;
begin
  try
{отладка
writelog('-----------------------------------------------------------');
writelog('Выполняется GetPayKindByED( ED.Type='+inttostr(aED.EDType)+')');
{отладка_конец}
    // для версия до 2.5.9 всегда вид платежа был =1 (электронно).
    // все что >= 2.5.9 - по новому.
    if (Version_CompareEx( Ufebs.FormatVer, '2.5.9') >= 0) then begin
{отладка
writelog('-----------------------------------------------------------');
writelog('   Версия = 2.5.9 и выше');
case aED.EDType of
  edtED101,
  edtED103,
  edtED104,
  edtED105,
  edtED110,
  edtED206,
  edtED217: writelog('   aED.PaytKind = "'+inttostr(aED.PaytKind)+'".');
  else writelog('   aED.PaytKind = не проверяется.');
end;
{отладка_конец}
      case aED.EDType of
        edtED101,
        edtED103,
        edtED104: Result := GetPayKindByValue( aED.EDType, aED.PaytKind);
        edtED217: Result := '?';//GetPayKindByValue( aED.EDType, aED.CreditInfo.AccDocInfo.PaytKind);

        // exchange #2583
        edtED108: Result := GetPayKindByValue( aED.EDType, aED.PaytKind);

        edtED105,
        edtED110: Result := GetPayKindByValue( aED.EDType, aED.PaytKind);

        edtED206: Result := GetPayKindByValue( aED.EDType, aED.PaytKind);

        edtED222: Result := '';

        // для прочих ЕD - осталется "электронно"
        edtED102: Result := '1';

        // остальные ED - ошибка
        else Result := '?';
      end;//case//
      EXIT;
    end;
    Result := '1';
    finally
{отладка
writelog('    результат = "'+result+'".');
writelog('-----------------------------------------------------------');
{отладка_конец}
  end;
end;


begin
end.
