-- Шаблон создан мастером бланков
-- 09.09.1998 11:57:51     -- Егоров М.О.
--
БланкСШаблоном "Процедуры работы с документами";
--USES ИНФО.ОИ;
--- Перечень особо значимых с точки зрения систем картотек
CrdGoods  : S = "ТМЦ";     -- Товарно-материальные ценности
CrdPoruch : S = "Поруч";   -- Платежные поручения
CrdSotr   : S = "Сотрудники"; -- Физические лица



------------------------------------------------------
-- Служебные поля для PROC ImportDocs
          Наим[] : S;
          Кол[]  : N;
          Цена[] : N;
          НДС[]  : N;
          Страна[] : S;
          ГТД[]    : S;
          ImpNum : I;  -- Кол-во записей в данной РО
------------------------------------------------------
Func CheckImport(РО:I;Fil:S):L;
         SetFilter(РО,Fil);
        If Records(РО) = 0 :
                  Message("Нет таких документов!");
                 ^False;
        |  Records(РО) > 1 :
                  Message("Таких документов несколько!");
                 ^False;
        |  True :
                 ^True;
        Fi;
END; -- CheckImport

Proc ImportDocs_Find(НаимТМЦ :S; I:I);
Var W, N :Integer;

  W = OpenWorkArea("ТМЦ", "Коммент", "Коммент = '" + НаимТМЦ+ "'");
  Try
    N = Records(W);
    If N=1:
      Страна[I] = GetFieldS(W, 1, "Страна");
      ГТД[I] = GetFieldS(W, 1, "ГТД");
    Else
      Страна[I]="";
      ГТД[I]="";
    Fi;
  Finally
    CloseWorkArea(W);
  End;
Corp;

2PROC 0ImportDocs (Crd:Integer;StrField:String;Nacl:Logical);
-- Процедура передачи данных между документами Счет/Счет-фактура/Накладная
-- Crd           - РО основной картотеки (открывается в самом документе)
-- StrField  - Имя структурного поля
-- Nacl          - True - если картотека-источник - Накладная

var РМ    :Integer;  -- РО подтаблицы Состав документа (табличная часть)
var I     :Integer;  -- Счетчик цикла
var ТМЦObl:Integer;  -- РО Картотеки ТМЦ

 РМ=OpenArray(Crd,1,StrField,"");
 ImpNum=Records(РМ);

 If Nacl :
        ТМЦObl = OpenWorkArea(CrdGoods,"Признак","");
        For I = 1..ImpNum DO
          Наим[I] =GetFieldS(РМ,I,"ТМЦС");
          Кол[I]  =GetFieldN(РМ,I,"Колич");
          Цена[I] =GetFieldN(РМ,I,"Цена");
          НДС[I]  =GetFieldN(РМ,I,"НДС");
          ImportDocs_Find(Наим[I], I);
        Od;
          CloseWorkArea(ТМЦObl);
          CloseWorkArea(РМ);
 | True :
         For I = 1..ImpNum DO
          Наим[I] =GetFieldS(РМ,I,"Наим");
          Кол[I]  =GetFieldN(РМ,I,"Колич");
          Цена[I] =GetFieldN(РМ,I,"Цена");
          НДС[I]  =GetFieldN(РМ,I,"НДС");
          ImportDocs_Find(Наим[I], I);
         OD;
         CloseWorkArea(РМ);
 Fi;
END; -- ImportDocs

PROC NNN(Robl:I;Сумма:N;Рекв:Record;РеквП:Record;Банк:Record;БанкП:Record;П1:S;П2:S;П3:S;П4:S;П5:S;П6:S;П7:S;П8:S;Т:S;Цель:S;ДатаО:S;Нр:I;ДатаДок:D;Приз:S;Признаки:S;ВидОП:S;Бюджет:L);
-- Процедура записи в картотеку Платежных поручений
-- Robl   -- Рабочая область картотеки Поруч
-- Сумма  --
-- Рекв         |
-- РеквП        |
-- Т            |
-- Цель         |-      Поля картотеки
-- ДатаО        |
-- Нр           |
-- ДатаДок      |
-- Приз   --
-- Признаки --
-- ВидОП

        Var NN:Integer; -- Номер вставляемой записи

        NN=InsertRecord(Robl);
           NN=PutFieldN(Robl,NN,"Сумма",     Сумма);
           NN=PutFieldR(Robl,NN,"Рекв",      Рекв);
           NN=PutFieldR(Robl,NN,"РеквП",     РеквП);
           NN=PutFieldR(Robl,NN,"Банк",      Банк);
           NN=PutFieldR(Robl,NN,"БанкП",     БанкП);
           NN=PutFieldS(Robl,NN,"П1",        П1);
           NN=PutFieldS(Robl,NN,"П2",        П2);
           NN=PutFieldS(Robl,NN,"П3",        П3);
           NN=PutFieldS(Robl,NN,"П4",        П4);
           NN=PutFieldS(Robl,NN,"П5",        П5);
           NN=PutFieldS(Robl,NN,"П6",        П6);
           NN=PutFieldS(Robl,NN,"П7",        П7);
           NN=PutFieldS(Robl,NN,"П8",        П8);
           NN=PutFieldS(Robl,NN,"Т",         Т);
           NN=PutFieldS(Robl,NN,"Цель",      Цель);
           NN=PutFieldS(Robl,NN,"Кре",       "51");
           NN=PutFieldS(Robl,NN,"Призн",     Приз);
           NN=PutFieldS(Robl,NN,"Признаки",  Признаки);
           NN=PutFieldS(Robl,NN,"ДатаО",     ДатаО);
           NN=PutFieldS(Robl,NN,"ВидПл",     "электронно");
           NN=PutFieldS(Robl,NN,"НомерБум",  Str(Нр));
           NN=PutFieldI(Robl,NN,"Номер",     Нр);
           NN=PutFieldL(Robl,NN,"Проводить", True);
           NN=PutFieldD(Robl,NN,"Дата",      ДатаДок);
           NN=PutFieldD(Robl,NN,"ДатОпер",   ДатаДок);
           NN=PutFieldS(Robl,NN,"ВидОП",     ВидОП);
           NN=PutFieldL(Robl,NN,"Бюджет",    Бюджет);
КОНЕЦ; -- NNN


------------------------------------------------------
-- Служебные поля для PROC TMselect
         НаимТМЦ   : S;
         НДСТМЦ    : N;
         ЕдИзмТМЦ  : S;
         ПризнакТМЦ: S;
         СтранаТМЦ : S;
         ГТДТМЦ    : S;
         ОКДП      : S;
         КодТМЦ    : S;

------------------------------------------------------
2PROC0 TMselect (fil:Record);
var RObl:Integer;

  RObl=OpenWorkArea("ТМЦ","","UKEY="+RecordToString(fil));
  Try
    if records(Robl)>0:
      НаимТМЦ = GetFieldS(RObl,1,"Коммент");
      НДСТМЦ  = GetFieldN(RObl,1,"НДС");
      ЕдИзмТМЦ= GetFieldS(RObl,1,"ЕдИзм");
      ПризнакТМЦ=CARDFILERECSIGN('ТМЦ','ПРИЗНАК','ТМЦ',fil);
      СтранаТМЦ= GetFieldS(RObl,1,"Страна");
      ГТДТМЦ= GetFieldS(RObl,1,"ГТД");
      ОКДП= GetFieldS(RObl,1,"ОКДП");
      КодТМЦ= GetFieldS(RObl,1,"Признак");
    fi;
  Finally
    CloseWorkArea(RObl);
  end;
2END;0 -- TMselect

НаимОС   : S;

2PROC0 OCselect (fil:Record);
  Var RObl,RecNum:Integer;

         RObl    = OpenWorkArea("УчетКарточкаОС","");
         RecNum  = GetRecordNumber(RObl,fil);
         НаимОС  = GetFieldS(RObl,RecNum,"Наименование");
         CloseWorkArea(RObl);

2END;0 -- TMselect


------------------------------------------------------
-- Служебные поля для PROC FisSelect
         ФИО       : S;
         Признак   : S;
         Адрес     : S;
         Должность : S;
         ТипДок    : S;
         Серия     : S;
         НомерПас  : S;
         Паспорт   : S;
         ДРождения : D;
         Фамилия   : S;
         Имя       : S;
         Отчество  : S;
         ИНН       : S;
         КД        : S;
         Статус    : S;
         Город     : S;
         Наспункт  : S;
         Улица     : S;
         Дом       : S;
         Корп      : S;
         Кварт     : S;
         Кодстраны : S;
         Индекс    : S;
         Кодрег    : S;
         Район     : S;
         Мраб      : S;
         ЧМ        : N;
------------------------------------------------------

PROC FisSelect(fil:String);
-- Процедура выбора информации из картотеки ФизЛиц

   Var RObl:Integer;
   Var j   :Integer;
   Var Rc  :Record;

   Rc=ОткрытьКартотеку(CrdSotr,fil);
        if Rc<>nil:
          RObl  = OpenWorkArea(CrdSotr,"");
         j         = GetRecordNumber(RObl,Rc);
         ФИО       = GetFieldS(RObl,j,"ФИОТ");
         Признак   = GetFieldS(RObl,j,"Признак");
         Адрес     = GetFieldS(RObl,j,"Адрес");
         Должность = GetFieldS(RObl,j,"Должность");
         ТипДок    = GetFieldS(RObl,j,"ТипДокум");
         Серия     = GetFieldS(RObl,j,"Серия");
         НомерПас  = GetFieldS(RObl,j,"Номер");
         Паспорт   = GetFieldS(RObl,j,"Паспорт");
         ДРождения = GetFieldD(RObl,j,"Рожд");

         КД        = GetFieldS(RObl,j,"КД");
         ИНН       = GetFieldS(RObl,j,"ИННФ");
--         Статус    = GetFieldS(RObl,j,"Статус");
         Город     = GetFieldS(RObl,j,"Город");
         Наспункт  = GetFieldS(RObl,j,"Наспункт");
         Улица     = GetFieldS(RObl,j,"Улица");
         Дом       = GetFieldS(RObl,j,"Дом");
         Корп      = GetFieldS(RObl,j,"Корп");
         Кварт     = GetFieldS(RObl,j,"Кварт");
         Кодстраны = GetFieldS(RObl,j,"Кодстраны");
         Индекс    = GetFieldS(RObl,j,"Индекс");
         Кодрег    = "";
         Район     = GetFieldS(RObl,j,"Район");
         Мраб      = GetFieldS(RObl,j,"Мраб");
         ЧМ        = GetFieldN(RObl,j,"ЧМ");
         CloseWorkArea(RObl);
   fi;
END; -- FisSelect

2Func0 СреднеСпис(Парам:Ц):Ц;
  -- Примерный среднесписочный состав
  -- Парам -- Задает какой список нужен (зависит от совокупного дохода)
  Перем Rep:Report;
  Перем Iter1,Iter2,Iter3:Integer;

        Iter1 = 0;
        Iter2 = 0;
        Iter3 = 0;
        Rep = RepOpen ("Зарплата (бланки)","","",B.S,B.F);
        While RepNext(Rep) Do
           Iter1 = Iter1 + 1;
           If КРЕ(RepTurn(Rep,0)) < 20000       :
          Iter2 = Iter2 + 1;
           |  КРЕ(RepTurn(Rep,0)) < 100000 :
          Iter3 = Iter3 + 1;
           Fi;
        Od;
        Rep = RepClose(Rep);
        If Парам = 1 : ^Iter1;
        |  Парам = 2 : ^Iter2;
        |  Парам = 3 : ^Iter3;
        Fi;
2END;0 -- СреднеСпис




------------------------------------------------------
--      Для процедуры сохранения собств. реквизитов
РСчет   :S;  ОКПО    :S; Адрес   :S; ПолнИмя1 :S;
ОКОНХ   :S;  Телефон :S; РСчет   :S; НаимНал  :S;
КорИмя  :S;  Факс    :S; Банк    :S; КодНал   :S;
ЮрАдр   :S;  НалКод  :S; КПП     :S; БИК      :S;
КСчет   :S;  ОРГПРАВ :S; ОКАТО   :S;
ФСОБСТВ :S;  ОТРАСЛЬ :S; МРЕГИСТР:S; ГРЕГИСТР :S;
ДолжРук :S;  ИмяРук  :S; ДолжКас :S; ИмяКас   :S;
ДолжБух :S;  ИмяБух  :S; 
------------------------------------------------------

Proc SaveUL;
-- Сохранение собств.реквизитов в картотеку ЮРЛИЦО
var Robl,RoblAcc:Integer;
var ReI:Integer;
var RecCurr:Record;
  RoblAcc=OpenWorkArea('БАНК_СЧЕТА','','УМОЛЧАНИЕ and НАШ');
  Try
    Robl=OpenWorkArea('КонтРагент','НАШЕ','НАШЕ');
    Try
      BeginChanging(RObl);
      Try
        if Records(Robl)=0 or Records(RoblAcc)=0 :
           ReI=InsertRecord(RObl);
         else 
           ReI=GetRecordNumber(Robl,GetFieldR(RoblAcc,1,'КонтрАгент'));
        fi;

        if ReI>0:
          ReI  = PutFieldS(RObl, ReI, "Признак"   ,'НАШЕ');
          ReI  = PutFieldS(RObl, ReI, "Имя"   , ПолнИмя1);
          ReI  = PutFieldS(RObl, ReI, "ПолнИмя"   , ПолнИмя1);
          ReI  = PutFieldS(RObl, ReI, "КорИмя", КорИмя);
          ReI  = PutFieldS(RObl, ReI, "ИНН"   , НалКод);
          ReI  = PutFieldS(RObl, ReI, "ОКПО"  , ОКПО);
          ReI  = PutFieldS(RObl, ReI, "ОКОНХ" , ОКОНХ);
          ReI  = PutFieldS(RObl, ReI, "ЮрАдрес"  , ЮрАдр);
          ReI  = PutFieldS(RObl, ReI, "ФАКТАДРЕС", ЮрАдр);
          ReI  = PutFieldS(RObl, ReI, "КПП"  , КПП);
          ReI  = PutFieldS(RObl, ReI, "ПочтАдрес", Адрес);
          ReI  = PutFieldS(RObl, ReI, "Телефон", Телефон);
          ReI  = PutFieldS(RObl, ReI, "Факс",Факс);
          ReI  = PutFieldS(RObl, ReI, "ДолжнРук", ДолжРук);
          ReI  = PutFieldS(RObl, ReI, "ДолжнБух", ДолжБух);
          ReI  = PutFieldS(RObl, ReI, "ФИОРук", ИмяРук);
          ReI  = PutFieldS(RObl, ReI, "ФИОБух", ИмяБух);
          ReI  = PutFieldS(RObl, ReI, "ОПФ", ОргПрав);
          ReI  = PutFieldS(RObl, ReI, "ФСОБСТВ", ФСОБСТВ);
          ReI  = PutFieldS(RObl, ReI, "ОТРАСЛЬ", ОТРАСЛЬ);
          ReI  = PutFieldS(RObl, ReI, "МРЕГИСТР",МРЕГИСТР);
          ReI  = PutFieldS(RObl, ReI, "ГРЕГИСТР",ГРЕГИСТР);
          ReI  = PutFieldS(RObl, ReI, "ФИОКАСС",ИмяКас);
          ReI  = PutFieldS(RObl, ReI, "ДолжнКасс",ДолжКас);
          ReI  = PutFieldS(RObl, ReI, "ОКАТО",ОКАТО);
          ReI  = PutFieldL(RObl, ReI, "НАШЕ", True);
          ReI  = PutFieldS(RObl, ReI, "НаимНалоговой", НаимНал);
          ReI  = PutFieldS(RObl, ReI, "КодНалоговой",  КодНал);
        fi;

        EndChanging(Robl);
      Except
        CancelChanging(Robl);
        Raise;
      End;

      if РСчет<>"": -- Если нет расчетного счета, то его не нужно создавать или менять.
        BeginChanging(RoblAcc);
        if Records(ROblAcc)=0: ReI=InsertRecord(ROblAcc);
         else ReI=1;
        fi;

        RecCurr=GetRecordKey(Robl,1);

        Try

          ReI = PutFieldR(ROblAcc, ReI, "КонтрАгент",RecCurr);
          ReI = PutFieldL(ROblAcc, ReI, "НАШ", true);
          ReI = PutFieldS(ROblAcc, ReI, "Банк", КорИмя);
          ReI = PutFieldS(ROblAcc, ReI, "РСчет", РСчет);
          ReI = PutFieldS(ROblAcc, ReI, "Банк", Банк);
          ReI = PutFieldS(ROblAcc, ReI, "БИК", БИК);
          if Substr(БИК, 1, 2) = "04":
             ReI = PutFieldS(ROblAcc, ReI, "РПО_Страна", "RU");
          elsif Substr(БИК, 1, 2) = "15":
             ReI = PutFieldS(ROblAcc, ReI, "РПО_Страна", "BY");
          fi;
          ReI = PutFieldS(ROblAcc, ReI, "КСчет", КСчет);
          ReI = PutFieldl(ROblAcc, ReI, "Умолчание", true);

          EndChanging(RoblAcc);
        Except
          CancelChanging(RoblAcc);
          Raise;
        End;
      end;

    Finally
      CloseWorkArea(Robl);
    End;
  Finally
    CloseWorkArea(RoblAcc);
  End;

   Message("Данные сохранены!");
End;

Func ПросуммироватьПодтаблицу(Ro:Integer; NZ:Integer; SubTabl:String; Field:String):Numeric;
-- Ro      -- основная таблица
-- NZ      -- номер записи
-- SubTabl -- Имя подтаблицы
-- Field   -- Поле подтаблицы для суммирования
  Var RST   : Integer;
  Var Iter  : Integer;
  Var Result: Numeric;

  RST = OpenArray(Ro,NZ,SubTabl,'');
  Try
    Try
     For Iter = 1..Records(RST) do
       Result = Result + GetFieldN(RST,Iter,Field);
     Od;
    Except
       Result = 0;
    end;
  finally
    ^Result;
  End;
END; -- ПросуммироватьПодтаблицу

Func DocExist(w:integer;Oper:string;DocName:string):Integer;
var Ro    :Integer;
Var Doc     :String;
Var DocNumb :Integer;
 If Oper = '' :
   ^ 0;
 else
    Ro = OpenWorkArea('Операция','');
    Try
      DocNumb = GetRecordNumber(Ro,StringToRecord(Oper));
      If DocNumb > 0 :
        Doc = GetFieldS(Ro,DocNumb,DocName);
      Fi;
    Finally
      CloseWorkArea(Ro);
    End;
    if Doc='':
      ^ 0;
    else
      ^ GetRecordNumber(w,StringToRecord(Doc));
    fi;
 fi;
Cnuf; -- DocExist

Func PutDoc(DocRec:Record; OperName:String; field:String; value:String) : String;
Var w,i : Integer;
Var Операция : Record;

  w = OpenWorkArea('Операция','');
  try
  BeginChanging(w);
  try
    If OperName = '' :
      i=InsertRecord(w);
      Операция=GetRecordKey(w,i);
    else
      Операция = StringToRecord(OperName);
      if Операция<>nil:
        i=GetRecordNumber(w,Операция);
      fi;
      if i=0:
        i=InsertRecord(w);
        Операция=GetRecordKey(w,i);
      fi;
    fi;
    i=PutFieldS(w,i,field,value);
  except
    CancelChanging(w);
    raise;
  end;
  finally
    CloseWorkArea(w);
  end;
  Return RecordToString(Операция);
End; -- PutDoc

Func ВыборСФильтром(Карт:String;ПолеСравн:String;ДопФ:String):Record;
-- Ф-ция открытия картотеки с фильтром
-- Карт - Имя картотеки;
-- ПолеСравн - Поле картотеки для сравнения;
-- ДопФ - дополнительный фильтр
var rec:record;
var filtr,str,tstr:String;
  if Карт="Контрагент":
     Rec=ExecuteFuncR("Раб.Поиск.ВыборИзКартотеки","Выбор контрагента","КОНТРАГЕНТ","ПРИЗНАК|ПОЛНИМЯ|КОРИМЯ|ИНН","Код|Полное имя|Краткое имя|ИНН",ДопФ);
     ^Rec;
    else
     if Ввод(filtr,"Введите строку поиска")=cmOk:
      if ДопФ<>'':tstr='И ('+ДопФ+')';else tstr='';fi;
      if filtr='':str=ДопФ; else str="Соотв("+ПолеСравн+',"*'+filtr+'*") '+tstr;fi;
      Rec=ОткрытьКартотеку(Карт,str);
      ^Rec;
     fi;
    ^Nil;
  fi;
End;

Конец
