const
  cnCfg_2547_ImpPaymentMode_Name      = 'Вид платежа при загрузке';
  cnCfg_2547_ImpPaymentValue_Name     = 'Значение вида платежа при загрузке';

  cnCfg_2547_ImpPaymentMode_FromDoc   = 'ИЗ ДОКУМЕНТА';
  cnCfg_2547_ImpPaymentMode_FromValue = 'ЗАДАННОЕ ЗНАЧЕНИЕ';

  // возможные значения параметра cnCfg_2547_ImpPaymentMode_FromValue
  // без пробелов в нижнем регистре.
  cnCfg_2547_ImpPaymentMode_FromValue0 = '0-пусто';
  cnCfg_2547_ImpPaymentMode_FromValue1 = '1-электронно';
  cnCfg_2547_ImpPaymentMode_FromValue2 = '2-почтой';
  cnCfg_2547_ImpPaymentMode_FromValue3 = '3-телеграфом';
  cnCfg_2547_ImpPaymentMode_FromValue4 = '4-срочно';


  cnCfg_2547_ExpPaymentMode_Name      = 'Вид платежа при выгрузке';
  cnCfg_2547_ExpPaymentValue_Name     = 'Значение вида платежа при выгрузке';

  cnCfg_2547_ExpPaymentMode_FromDoc   = 'ИЗ ДОКУМЕНТА';
  cnCfg_2547_ExpPaymentMode_FromValue = 'ЗАДАННОЕ ЗНАЧЕНИЕ';


var
  // оптимизация скорости: vCfg_2547_ImpPaymentFromDoc=true, если
  // параметр "Вид платежа при загрузке"=ИЗ ДОКУМЕНТА
  vCfg_2547_ImpPaymentFromDoc: boolean;

  // значение параметра "Значение вида платежа при загрузке" из конфига
  vCfg_2547_ImpPaymentValue: string;
  
  // оптимизация скорости: vCfg_2547_ExpPaymentFromDoc=true, если
  // параметр "Вид платежа при выгрузке"=ИЗ ДОКУМЕНТА
  vCfg_2547_ExpPaymentFromDoc: boolean;

  // значение параметра "Значение вида платежа при выгрузке" из конфига
  vCfg_2547_ExpPaymentValue: string;


{~Initialize_2547
  инициализация задачи через текст Config.Text (ini параметры как текстовая
  строка с переносами строк <CR><LF>)}
procedure Initialize_2547( aConfigText: string);
var
  SL: TStringList;
begin
  try
    SL := TStringList.Create;
    try
      SL.Text := aConfigText;
      Initialize_2547_StringList( SL);
      finally
        SL.Free;
    end;
    except
      raise( 'Сбой Un_Exch2547.Initialize_2547'#13#10 + LastException.Message);
  end;
end;

{~Initialize_2547_CommaText
  инициализация задачи через текст Config.CommaText (ini параметры как текстовая
  строка с переносами строк <CR><LF> или другими разделителями)}
procedure Initialize_2547_CommaText( aConfigText: string);
var
  SL: TStringList;
begin
  try
    SL := TStringList.Create;
    try
      SL.CommaText := aConfigText;
      Initialize_2547_StringList( SL);
      finally
        SL.Free;
    end;
    except
      raise( 'Сбой Un_Exch2547.Initialize_2547'#13#10 + LastException.Message);
  end;
end;

{~Initialize_2547_StringList
  инициализация задачи через объект aConfig как TStringList.}
procedure Initialize_2547_StringList( aConfig: TStringList);
var s: string;
begin
  try
    vCfg_2547_ImpPaymentFromDoc :=
            (UPPERCASE( TRIM( aConfig.Values[ cnCfg_2547_ImpPaymentMode_Name]))
              = cnCfg_2547_ImpPaymentMode_FromDoc);

    // возможные значения из конфигурации подменяются на значения
    // для ЭД в АЦК-Финансах. удаляем все пробелы и проверяем строку
    // в нижнем регистре.
    s := StringReplace(
            LOWERCASE( TRIM( aConfig.Values[ cnCfg_2547_ImpPaymentValue_Name])),
            ' ', '');
    case s of
      // пустая строка считается за начение 0 - пусто
      ''                                  : vCfg_2547_ImpPaymentValue := '';
      cnCfg_2547_ImpPaymentMode_FromValue0: vCfg_2547_ImpPaymentValue := '';
      cnCfg_2547_ImpPaymentMode_FromValue1: vCfg_2547_ImpPaymentValue := '1';
      cnCfg_2547_ImpPaymentMode_FromValue2: vCfg_2547_ImpPaymentValue := '2';
      cnCfg_2547_ImpPaymentMode_FromValue3: vCfg_2547_ImpPaymentValue := '3';
      cnCfg_2547_ImpPaymentMode_FromValue4: vCfg_2547_ImpPaymentValue := '4';
      else raise ( FORMAT( 'Недопустимое значение в параметре конфигурации "%s".',
                           [ cnCfg_2547_ImpPaymentValue_Name]));
    end;//case//

    vCfg_2547_ExpPaymentFromDoc :=
            (UPPERCASE( TRIM( aConfig.Values[ cnCfg_2547_ExpPaymentMode_Name]))
              = cnCfg_2547_ExpPaymentMode_FromDoc);

    // значение "вид платежа" для экспорта берется как есть из параметра,
    // в том же регистре, кроме того, что отсекаются концевые пробелы.
    vCfg_2547_ExpPaymentValue :=
              TRIM( aConfig.Values[ cnCfg_2547_ExpPaymentValue_Name]);
    except
      raise( 'Сбой Un_Exch2547.DoInitialize_2547'#13#10 + LastException.Message);
  end;
end;

{~ImpPayKind_2547
  При установке «из документа» устанавливать в ЭД системы значение вида платежа
  из поля файла «Вид платежа» (учесть, что в поле может прийти не текст,
  а числовое значение, соответствующее значению в системе:
    0 – пусто,
    1 – электронно,
    2 – почтой,
    3 – телеграфом,
    4 – срочно).
  Если поля в файле нет, в системе вид платежа оставлять пустым.
  При установке «заданное значение» открывать для редактирования дополнительное
  поле настройки конфигурации (текстовое, длина – 20 символов),
  устанавливать в ЭД системы значение вида платежа из поля настройки.
  Если установлено «заданное значение» и поле в настройке не заполнено,
  не заполнять поле в системе. По умолчанию в настройке установить значение
  «заданное значение» и значение, которое сейчас устанавливается в системе
  при загрузке по этому формату (учесть, что в поле может быть указан не текст,
  а числовое значение, соответствующее значению в системе:
    0 – пусто,
    1 – электронно,
    2 – почтой,
    3 – телеграфом,
    4 – срочно).

  результат:
    если в параметре конфигурации указан параметр:
      "вид платежа  при загрузке"=из документа, то возвращается значение
      из параметра aPayKindValue (если параметр не указан - возвращается пустая
      строка).
    если в параметре конфигурации указан параметр:
      "вид платежа  при загрузке"=заданное значение,
      то возвращается значение, указанное в параметре
      "Заданное значение вида платежа при загрузке".}
function ImpPayKind_2547( aPayKindValue: string = ''): string;
begin
  try
    if vCfg_2547_ImpPaymentFromDoc
      then begin
        Result := TRIM( aPayKindValue);
        // значение 0 соответствует "пусто".
        if (Result = '0') then Result := '';
      end else begin
        Result := vCfg_2547_ImpPaymentValue
      end;
    // при отладке не мешало бы проверить что на самом деле возвращается!
    {отладка
    if (Result <> '') AND (NOT (Result in ['','1','2','3','4','5']))
      then raise ('Недопустимое значение "вид платежа": ' + result);
    {отладка_конец}
    except
      raise( 'Сбой Un_Exch2547.ImpPayKind_2547'#13#10 + LastException.Message);
  end;
end;

{~ImpPayKind_2547_V1
  здесь значение aPayKindValue указывается строкой вида:
    электронно
    почтой
    телеграф или телеграфом
    срочно
  прчие значения заменяются на "пусто" (пустая строка).
  строки заменяются на:
    электронно  - 1
    почтой      - 2
    телеграф    - 3
    телеграфом  - 3
    срочно      - 4}
function ImpPayKind_2547_V1( aPayKindValue: string): string;
begin
  try
    case UPPERCASE( TRIM( aPayKindValue)) of
      'ЭЛЕКТРОННО': Result := ImpPayKind_2547( '1');
      'ПОЧТОЙ'    : Result := ImpPayKind_2547( '2');
      'ТЕЛЕГРАФ',
      'ТЕЛЕГРАФОМ': Result := ImpPayKind_2547( '3');
      'СРОЧНО'    : Result := ImpPayKind_2547( '4');
      else          Result := ImpPayKind_2547( '');
    end;
    except
      raise( 'Сбой Un_Exch2547.ImpPayKind_2547_V1'#13#10 + LastException.Message);
  end;
end;


{~GetExpPayKind_2547
  выгрузка "Вид платежа"}
function ExpPayKind_2547( aPayKindValue: string): string;
begin
  try
    if vCfg_2547_ExpPaymentFromDoc
      then Result := aPayKindValue
      else Result := vCfg_2547_ExpPaymentValue;
    except
      raise( 'Сбой Un_Exch2547.ExpPayKind_2547'#13#10 + LastException.Message);
  end;
end;

{~GetExpPayKind_2547
  выгрузка "Вид платежа" из aPayKindValue, указанного в виде N:текст.
  если указано выгружать из документа, то строка aPayKindValue разделяется
  на: S1=N, S2=текст.
  причем: N должно обязательно указываться цифрой 0...99!
  если не будет найден разделитель, или параметр N будет вне чиапазона 0...99,
  то строки результата: S1 и S2 будут пустыми.
  например:
    1:электронно
  в результате возвращается:
    S1=1
    S2=электронно}
procedure ExpPayKind_2547_V1( aPayKindValue: string; var S1, S2: string);
var
  s: string;
  xPos: integer;
begin
  try
    if vCfg_2547_ExpPaymentFromDoc
      then s := aPayKindValue
      else s := vCfg_2547_ExpPaymentValue;
    xPos := POS( ':', s);
    if (xPos <= 0) then begin
      S1 := '';
      S2 := '';
      EXIT;
    end;
    S1 := TRIM( COPY( s, 1, xPos - 1));
    S2 := TRIM( COPY( s, xPos + 1, LENGTH( s) - xPos));
    try
      xPos := STRTOINT( S1);
      if ((xPos < 0) OR (xPos > 99)) then begin
        S1 := '';
        S2 := '';
      end;
      except
        S1 := '';
        S2 := '';
    end;
    except
      raise( 'Сбой Un_Exch2547.ExpPayKind_2547_V1'#13#10 + LastException.Message);
  end;
end;

{~ExpPayKind_2547_V2
  преобразует значение aPayKindValue в вид платежа для АЦК-Ф.
  возвращается:
    0(пусто) для входной строки: 0, пустой строки и прочих строк;
    1(электронно) для входной строки 1, электронно;
    2(почтой) для входной строки 2, почтой;
    3(телеграфом) для входной строки 3, телеграфом, телеграф;
    4(срочно) для входной строки 4, срочно.
    при этом так жы выполняется выбор:
      если указано из документа, вовращаются вышеперечисленные значения,
      если указано из значения конфигурации - возвращается из значения
      конфигурации, независимо от aPayKindValue.}
function ImpPayKind_2547_V2( aPayKindValue: string): string;
begin
  try
    case StringReplace( LOWERCASE( TRIM( aPayKindValue)), ' ', '') of
      '0','пусто':
            Result := ImpPayKind_2547( '');
      '1','электронно':
            Result := ImpPayKind_2547( '1');
      '2','почтой':
            Result := ImpPayKind_2547( '2');
      '3','телеграфом','телеграф':
            Result := ImpPayKind_2547( '3');
      '4','срочно':
            Result := ImpPayKind_2547( '4');
      else  Result := ImpPayKind_2547( '');
    end;//case//
    except
      raise( 'Сбой Un_Exch2547.ImpPayKind_2547_V2'#13#10 + LastException.Message);
  end;
end;


begin
end.
