-- Шаблон создан мастером бланков
-- 27.11.2000 14:47:46
--
БланкСШаблоном "Сведения о сотруднике", Editor Сотрудники;

СохранятьПозицию         :Logical = [False];
кнОбщее                  :Object;
кнУмолчание              :Object;
кнВКадры                 :Object;
кнАдрес                  :Object;
кнДокументы              :Object;
кнПеремещения            :Object;
кнЗарплата               :Object;
кнРедактор               :Object;
кнИнвалидность           :Object;
кнУРА                    :Object;
ФлВновьПринят            :Object;
ФлУдДАТЫУ                :Logical;

Func ПроверитьНаличиеКартотеки(NameCardFile :String):Logical;
 ^ExistsCardFile(NameCardFile);
Cnuf;

Наличие_Сотр_Адрес       :Logical = ПроверитьНаличиеКартотеки("Сотр_Адрес");
Наличие_Сотр_Документ    :Logical = ПроверитьНаличиеКартотеки("Сотр_Документ");
Наличие_Сотр_Перемещения :Logical = ПроверитьНаличиеКартотеки("Сотр_Перемещения");
Наличие_Сотр_Зарплата    :Logical = ПроверитьНаличиеКартотеки("Сотр_Зарплата");
Наличие_Сотр_Инвалид     :Logical = ПроверитьНаличиеКартотеки("Сотр_Инвалид");
Наличие_Сотр_УРА         :Logical = ПроверитьНаличиеКартотеки("Сотр_УРА");
Наличие_Сотр_Кадры       :Logical = ПроверитьНаличиеКартотеки("Сотр_Кадры");

СтатусСтрока          :String = If(Not Статус, "Резидент", "Нерезидент");
П                     :String = If(Not Пол, "М", "Ж");

Вид                   :Integer; -- 1- Основные сведения
                                -- 2- Адрес
                                -- 3- Документы
                                -- 4- Перемещения и назначения
                                -- 5- Зарплата
                                -- 6- Инвалидность

УпрФИО_РПО            :Integer =0;
УпрФИО                :Integer = If(Вид=1, 1, 0);
УпрФИО69              :Integer = If(УпрФИО_РПО=1 And Substr(Version,1,3)="6.9",1,0);
--УпрФИО69              :Integer = If(УпрФИО=1,1,0);
УпрФИО69_0            :Integer = If(УпрФИО69=1 And ВновьПринят,1,0);

УпрФИО69_1            :Integer = If(УпрФИО69=1,ДАТЫУВОЛЬНЕНИЯ,0);
ДатУ[]                :Date    = ДАТЫУВОЛЬНЕНИЯ[$].ДАТАУВОЛЬНЕНИЯ;
ДатПриема[]           :Date;--    = ДАТЫУВОЛЬНЕНИЯ[$].ДАТАПриема;
СтВновьПринят         :Logical;
--------------------------
-- Раздел изменения ФИО --
НовоеФИО              :Integer;
УпрНовоеФИО           :Integer = If(УпрФИО=1, НовоеФИО, 0);
НоваяДата             :Date;
НоваяФамилия          :String;
НовоеИмя              :String;
НовоеОтчество         :String;
УпрФамилия            :Integer;
УпрФамилияСекция      :Integer = If(УпрФИО=1, УпрФамилия, 0);
ДатаФамилии[]         :Date;
ФИОнаДату[]           :String  = Фамилия[ДатаФамилии[$]+1]+" "+ИмяСотрудника[ДатаФамилии[$]+1]+" "+Отчество[ДатаФамилии[$]+1];

ФамСегодня            :String  = Фамилия[ToDay];
ФамИОКого             :String  = ФКого[ToDay]+" "+ИОКого[ToDay];
ФамИООтКого           :String  = ФОтКого[ToDay]+" "+ИОтКого[ToDay];
ФамИОКому             :String  = ФКому[ToDay]+" "+ИОКому[ToDay];

Заявление             :String  = If(Not ЗаявВычет, "присутствует", "отсутствует");
-- Раздел изменения ФИО --
--------------------------

--------------------
-- Раздел адресов --
УпрАдресШапка         :Integer = If(Вид=2, 1, 0);
Адреса                :Integer;
УпрАдресаСекция       :Integer = If(УпрАдресШапка=1, Адреса, 0);
ПоПропискеЛог[]       :Logical;
ПоПрописке[]          :String  = If(ПоПропискеЛог[$], "V", "");
ФактическийЛог[]      :Logical;
Фактический[]         :String  = If(ФактическийЛог[$], "V", "");
ПочтовыйЛог[]         :Logical;
Почтовый[]            :String  = If(ПочтовыйЛог[$], "V", "");
СсылкаНаАдрес[]       :String;
ДатаРегистрации[]     :Date;
Индекс[]              :String;
АдресБезИндекса[]     :String;
АдресСборный[]        :String;
ТелефонДомСекция[]    :String;
-- Раздел адресов --
--------------------

-----------------------
-- Раздел документов --
УпрДокументыШапка     :Integer = If(Вид=3, 1, 0);
Документы             :Integer;
УпрДокументыСекция    :Integer = If(УпрДокументыШапка=1, Документы, 0);
СсылкаНаДокумент[]    :String;
ДействующийЛог[]      :Logical;
Действующий[]         :String  = If(ДействующийЛог[$], "V", "");
ТипДокумента[]        :String;
Документ[]            :String;
-- Раздел документов --
-----------------------

-------------------------------------
-- Раздел перемещения и назначения --
УпрПеремещенияШапка   :Integer = If(Вид=4, 1, 0);
Перемещения           :Integer;
УпрПеремещенияСекция  :Integer = If(УпрПеремещенияШапка=1, Перемещения, 0);
ОсновноеЛог[]         :Logical;
Основное[]            :String  = If(ОсновноеЛог[$], "Основное", "");
СсылкаНаПеремещение[] :String;
ДатаНазначения[]      :Date;
ДатаОкончания[]       :Date;
ПодраздСекция[]       :String;
ДолжностьСекция[]     :String;
ОкладСекция[]         :String;
ТелефонРабСекция[]    :String;
ОбязательныеПоля      :Logical = If(BlankExist("Инфо.Справочники.Настройки"), If(ПроверитьНаличиеКартотеки("Настройки"), True, False), False);
Проверять             :Logical;
-- Раздел перемещения и назначения --
-------------------------------------

-- Раздел 'Зарплата' --
УпрЗарплата           :Integer = If(Вид=5, 1, 0);
СсылкаНаЗарплату      :String;
СчетЗатрат            :String;
НалогУчет             :String;
ТипТМЦ                :String;
ДатаСО                :Date;
ДатаСН                :Date;
ДатаСП                :Date;
ПенсФонд              :Logical; --(ФПенс) Ложь-платит ЕСН пенс, правда-нет
СоцФонд               :Logical; --(ФСоц)
МедФонд               :Logical; --(ФМед)
ФедИПенсБюджеты       :String  = If(Признак<>"", If(ПенсФонд, 'все только "Федеральный бюджет"', 'в "Федеральный бюджет" и "Пенсионный фонд"'), "");

Вычеты                :Integer;
ВычетыСекция          :Integer = If(УпрЗарплата=1, Вычеты, 0);
ДатаНВычета[]         :Date;
ДатаКВычета[]         :Date;
НаимВычета[]          :String;
КоличВычетов[]        :Numeric;
ПримечаниеВычета[]    :String;

ПрофВычеты            :Integer;
ПрофВычетыСекция      :Integer = If(УпрЗарплата=1, ПрофВычеты, 0);
ДатаНПрофВычета[]     :Date;
ГодДействПрофВычета[] :Integer;
НаимПрофВычета[]      :String;
ПримечаниеПрофВычета[]:String;

Начисления            :Integer;
НачисленияСекция      :Integer = If(УпрЗарплата=1, Начисления, 0);
ДатаННачисления[]     :Date;
ДатаКНачисления[]     :Date;
НаимНачисления[]      :String;
ПодрНачисления[]      :String;
ПримечаниеНачисления[]:String;

Удержания             :Integer;
УдержанияСекция       :Integer = If(УпрЗарплата=1, Удержания, 0);
ДатаНУдержания[]      :Date;
ДатаКУдержания[]      :Date;
НаимУдержания[]       :String;
ПодрУдержания[]       :String;
ПримечаниеУдержания[] :String;

Север                 :Integer;
СеверСекция           :Integer = If(УпрЗарплата=1, Север, 0);
ДатаНСевер[]          :Date;
ДатаКСевер[]          :Date;
ПроцентСевер[]        :Numeric;
ПримечаниеСевер[]     :String;

Ставки                :Integer;
СтавкиСекция          :Integer = If(УпрЗарплата=1, Ставки, 0);
НомерМесяца[]         :Integer;
НаимМесяца[]          :String  = If(УпрЗарплата=1, Месяц(НомерМесяца[$]), "");
Ставка[]              :Numeric;
-----------------------

-- Раздел 'Инвалидность' --
УпрИнвалид            :Integer = If(Вид=6, 1, 0);
Инвалиды              :Integer;
УпрИнвалидСекция      :Integer = If(УпрИнвалид=1, Инвалиды, 0);
СсылкаНаИнвалидность[]:String;
ИнвЛог[]              :Logical;
НомерСправкиИнв[]     :String;
ДатаВыдачиИнв[]       :Date;
ДатаНачалаИнв[]       :Date;
ДатаКонцаИнв[]        :Date;
Инв[]                 :String  = If(УпрИнвалид=1, If(ИнвЛог[$], "Бессрочный", If(ДатаНачалаИнв[$]>1.01.1917, "Срочный", "")), "");
ГруппаИнв[]           :Integer;
КомментИнв[]          :String;
---------------------------
-- Раздел 'УРА' --
УпрУРА                :Integer = If(Вид=7, 1, 0);
СсылкаНаУРА           :String;
НомерУдостоверения    :String;
Класс                 :String;
ЛицКарт               :Integer;
ЛицКарточка           :String = If(ЛицКарт=0: "Стандартная" |ЛицКарт=1: "Ограниченная" |True: "");
РегНомер              :String;
РегСерия              :String;
РегНомерСерии         :String;
ДопИнформация         :String;
------------------

-- Клетки "...", "-" и "+" --
SEnter            :String = "...";
SMinus            :String = "-";
SPlus             :String = "+";
SPlusDouble       :String = "++";
SV                :String = "V";
SCalendar         :String = "...";
--увольнение прием  --
Sc02              :String = SCalendar;
SM02              :String = SMinus;
SP02              :String = SPlus;

-- Изменение ФИО
SC2               :String = SCalendar;
SM22              :String = SMinus;
SP21              :String = SPlus;
SP22              :String = SPlus;
SV2               :String = SV;

-- Документы
SE3               :String = SEnter;
SM32              :String = SMinus;
SP31              :String = SPlus;
SP32              :String = SPlus;

-- Адрес места жительства (регистрации)
SE4               :String = SEnter;
SM42              :String = SMinus;
SP41              :String = SPlus;
SP42              :String = SPlus;

-- Назначения и перемещения
SC5               :String = SCalendar;
SE5               :String = SEnter;
SM52              :String = SMinus;
SP51              :String = If(УпрПеремещенияСекция>0, "", SPlus);
SP52              :String = SPlus;
SP53              :String = SPlusDouble;

-- Зарплата
SC6               :String = SCalendar;
SE6               :String = SEnter;
SM62              :String = SMinus;
SP61              :String = SPlus;
SP62              :String = SPlus;

-- Инвалиды
SC10              :String = SCalendar;
SE10              :String = SEnter;
SM102             :String = SMinus;
SP101             :String = SPlus;
SP102             :String = SPlus;

-- УРА
SC11              :String = SCalendar;
SE11              :String = SEnter;
SM112             :String = SMinus;
SP111             :String = SPlus;
SP112             :String = SPlus;

Proc ОчиститьФИО;
  ClearVariable(НовоеФИО);        ClearVariable(НоваяДата);           ClearVariable(НоваяФамилия);
  ClearVariable(НовоеИмя);        ClearVariable(НовоеОтчество);       ClearVariable(УпрФамилия);
  ClearVariable(ДатаФамилии);
Corp;

Proc ОчиститьАдрес;
  ClearVariable(Адреса);          
  ClearVariable(ПоПропискеЛог);   ClearVariable(ФактическийЛог);      ClearVariable(ПочтовыйЛог);
  ClearVariable(СсылкаНаАдрес);   ClearVariable(ДатаРегистрации);     ClearVariable(АдресСборный);
  ClearVariable(Индекс);          ClearVariable(АдресБезИндекса);     ClearVariable(ТелефонДомСекция);
Corp;

Proc ОчиститьДокументы;
  ClearVariable(Документы);       ClearVariable(СсылкаНаДокумент);    ClearVariable(ДействующийЛог);
  ClearVariable(ТипДокумента);    ClearVariable(Документ);
Corp;

Proc ОчиститьПеремещения;
  ClearVariable(Перемещения);     ClearVariable(СсылкаНаПеремещение); ClearVariable(ОсновноеЛог);
  ClearVariable(ДатаНазначения);  ClearVariable(ДатаОкончания);       ClearVariable(ПодраздСекция);
  ClearVariable(ДолжностьСекция); ClearVariable(ОкладСекция);         ClearVariable(ТелефонРабСекция);
Corp;

Proc ОчиститьЗарплату;
  ClearVariable(СсылкаНаЗарплату); ClearVariable(СчетЗатрат);         ClearVariable(НалогУчет);
  ClearVariable(ДатаСО);           ClearVariable(ДатаСН);             ClearVariable(ДатаСП);
  ClearVariable(ПенсФонд);         ClearVariable(СоцФонд);            ClearVariable(МедФонд);
  ClearVariable(Вычеты);           ClearVariable(ДатаНВычета);        ClearVariable(ДатаКВычета);
  ClearVariable(НаимВычета);       ClearVariable(КоличВычетов);       ClearVariable(ПримечаниеВычета);
  ClearVariable(Начисления);       ClearVariable(ДатаННачисления);    ClearVariable(ДатаКНачисления);
  ClearVariable(НаимНачисления);   ClearVariable(ПодрНачисления);     ClearVariable(ПримечаниеНачисления);
  ClearVariable(Удержания);        ClearVariable(ДатаНУдержания);     ClearVariable(ДатаКУдержания);
  ClearVariable(НаимУдержания);    ClearVariable(ПодрУдержания);      ClearVariable(ПримечаниеУдержания);
  ClearVariable(Север);            ClearVariable(ДатаНСевер);         ClearVariable(ДатаКСевер);
  ClearVariable(ПроцентСевер);     ClearVariable(ПримечаниеСевер);    ClearVariable(ТипТМЦ);
  ClearVariable(ПрофВычеты);       ClearVariable(ДатаНПрофВычета);    ClearVariable(ГодДействПрофВычета);
  ClearVariable(НаимПрофВычета);   ClearVariable(ПримечаниеПрофВычета);
  ClearVariable(Ставки);           ClearVariable(НомерМесяца);        ClearVariable(Ставка);
Corp;

Proc ОчиститьИнвалидность;
  ClearVariable(Инвалиды);        ClearVariable(СсылкаНаИнвалидность); ClearVariable(ИнвЛог);              
  ClearVariable(НомерСправкиИнв); ClearVariable(ДатаВыдачиИнв);        ClearVariable(ДатаНачалаИнв);   
  ClearVariable(ДатаКонцаИнв);    ClearVariable(ГруппаИнв);            ClearVariable(КомментИнв);
Corp;

Proc ОчиститьУРА;
  ClearVariable(СсылкаНаУРА);   ClearVariable(НомерУдостоверения); ClearVariable(Класс);
  ClearVariable(ЛицКарт);       ClearVariable(РегНомер);           ClearVariable(РегСерия);
  ClearVariable(РегНомерСерии); ClearVariable(ДопИнформация);
Corp;

Proc СчитатьФамилию;
Var W, RSub, N  :Integer;

  ОчиститьФИО;
  Hint("Идет считываение ФИО...");
  W = OpenWorkArea("Сотрудники", "", "UKey="+RecordToString(Current));
  Try
    If Records(W)>0:
      RSub = OpenArray(W, 1, "Фамилия", "Период");
      Try
        УпрФамилия = Records(RSub);
        For N=1..УпрФамилия Do
          ДатаФамилии[N]=GetFieldD(RSub, N, "Период");
        Od;
      Finally
        CloseWorkArea(RSub);
      End;
    Fi;
  Finally
    CloseWorkArea(W);
  End;
Corp;

Proc СчитатьАдрес;
Var W, N                      :Integer;
Var FilterDoc, Регион, Страна :String;
Var Район, Город, НасПункт, Улица, Дом, Корпус, Квартира :String;

  If УпрАдресШапка=1:
    ОчиститьАдрес;
    If Наличие_Сотр_Адрес:
      Hint("Идет считываение адресов...");
      FilterDoc = "Сотр="+RecordToString(Current);
      W = OpenWorkArea("Сотр_Адрес", "Дата", FilterDoc);
      Try
        For N=1..Records(W) Do
          InsertFrame(Адреса, Адреса+1);
          СсылкаНаАдрес[Адреса]   = RecordToString(GetRecordKey(W, N));
          ДатаРегистрации[Адреса] = GetFieldD(W, N, "Дата");
          ПоПропискеЛог[Адреса]   = GetFieldL(W, N, "ПоПрописке");
          ФактическийЛог[Адреса]  = GetFieldL(W, N, "Фактический");
          ПочтовыйЛог[Адреса]     = GetFieldL(W, N, "Почтовый");

          Район                   = GetFieldS(W, N, "Район");
          Город                   = GetFieldS(W, N, "Город");
          If GetFieldR(W, N, "КодРегиона")<>Nil:
            Регион                = GetFieldS(W, N, "КодРегиона.Код");
            If Регион="77" Or Регион="78" Or Регион="99": Район = ""; Город = ""; Fi;
            Регион                = GetFieldS(W, N, "КодРегиона.Регион");
          Else Регион = ""; Fi;
          If GetFieldR(W, N, "КодСтраны")<>Nil:
            Страна                = GetFieldS(W, N, "КодСтраны.Код");
            If Страна="643":
              Страна              = "";
            Else
              Страна              = GetFieldS(W, N, "КодСтраны.Страна")+",";
            Fi;
          Else Страна = ""; Fi;
          НасПункт                = GetFieldS(W, N, "НасПункт");
          Улица                   = GetFieldS(W, N, "Улица");
          Дом                     = GetFieldS(W, N, "Дом");
          Корпус                  = GetFieldS(W, N, "Корпус");
          Квартира                = GetFieldS(W, N, "Квартира");
          Индекс[Адреса]          = GetFieldS(W, N, "Индекс");
          АдресСборный[Адреса]    = АдресСборный[Адреса]+If(Район<>"", Район, "");
          АдресСборный[Адреса]    = АдресСборный[Адреса]+If(Город<>"", If(АдресСборный[Адреса]<>"", ", ", "")+Город, "");
          АдресСборный[Адреса]    = АдресСборный[Адреса]+If(НасПункт<>"", If(АдресСборный[Адреса]<>"", ", ", "")+НасПункт, "");
          АдресСборный[Адреса]    = АдресСборный[Адреса]+", "+Улица+","+Дом+","+Корпус+","+Квартира;
          АдресБезИндекса[Адреса] = Страна+Регион+","+АдресСборный[Адреса];
          АдресСборный[Адреса]    = Страна+Индекс[Адреса]+","+Регион+","+АдресСборный[Адреса];
          ТелефонДомСекция[Адреса]= GetFieldS(W, N, "Телефон");
        Od;
      Finally
        CloseWorkArea(W);
      End;
    Else
    Fi;
  Fi;
Corp;

Proc СчитатьДокументы;
Var W, N      :Integer;
Var FilterDoc :String;

  If УпрДокументыШапка=1:
    ОчиститьДокументы;
    If Наличие_Сотр_Документ:
      Hint("Идет считываение документов...");
      FilterDoc = "Сотр="+RecordToString(Current);
      W = OpenWorkArea("Сотр_Документ", "ДатаВыдачи", FilterDoc);
      Try
        For N=1..Records(W) Do
          InsertFrame(Документы, Документы+1);
          СсылкаНаДокумент[Документы] = RecordToString(GetRecordKey(W, N));
          ДействующийЛог[Документы]   = GetFieldL(W, N, "Действующий");
          Документ[Документы]         = "серия:"+GetFieldS(W, N, "Серия")+
                                        " номер:"+GetFieldS(W, N, "Номер")+
                                        " выдан: "+DateToString(GetFieldD(W, N, "ДатаВыдачи"))+
                                        "г. "+GetFieldS(W, N, "Кем");
          If GetFieldR(W, N, "ВидДокумента")<>Nil:
            ТипДокумента[Документы]   = GetFieldS(W, N, "ВидДокумента.Код");
          Fi;
        Od;
      Finally
        CloseWorkArea(W);
      End;
    Else
    Fi;
  Fi;
Corp;

Proc СчитатьПеремещения;
Var W, N      :Integer;
Var FilterDoc :String;

  If УпрПеремещенияШапка=1:
    ОчиститьПеремещения;
    If Наличие_Сотр_Перемещения:
      Hint("Идет считываение перемещений...");
      FilterDoc = "Сотр="+RecordToString(Current);
      W = OpenWorkArea("Сотр_Перемещения", "ДатаНазначения", FilterDoc);
      Try
        For N=1..Records(W) Do
          InsertFrame(Перемещения, Перемещения+1);
          СсылкаНаПеремещение[Перемещения] = RecordToString(GetRecordKey(W, N));
          ОсновноеЛог[Перемещения]         = GetFieldL(W, N, "Основное");
          ДатаНазначения[Перемещения]      = GetFieldD(W, N, "ДатаНазначения");
          ДатаОкончания[Перемещения]       = GetFieldD(W, N, "ДатаОкончания");
          If GetFieldR(W, N, "Подразделение")<>Nil:
            ПодраздСекция[Перемещения]     = GetFieldS(W, N, "Подразделение.Подраз");
          Fi;
          If GetFieldR(W, N, "Должность")<>Nil:
            ДолжностьСекция[Перемещения]   = GetFieldS(W, N, "Должность.Долж");
          Fi;
          ОкладСекция[Перемещения]         = GetFieldS(W, N, "Оклад");
          ТелефонРабСекция[Перемещения]    = GetFieldS(W, N, "ТелефонРабочий");
        Od;
      Finally
        CloseWorkArea(W);
      End;
    Else
    Fi;
  Fi;
Corp;

Proc СчитатьЗарплату;
Var W, N, RSub, I      :Integer;
Var FilterDoc          :String;

  If УпрЗарплата=1:
    ОчиститьЗарплату;
    If Наличие_Сотр_Зарплата:
      Hint("Идет считываение сведений об инвалидности сотрудника...");
      FilterDoc = "Сотр="+RecordToString(Current);
      W = OpenWorkArea("Сотр_Зарплата", "", FilterDoc);
      Try
        If Records(W)>0: N=1;
          СсылкаНаЗарплату = RecordToString(GetRecordKey(W, N));
          СчетЗатрат       = GetFieldS(W, N, "СчетЗатрат");
          НалогУчет        = GetFieldS(W, N, "НалогУчет");
          ТипТМЦ           = GetFieldS(W, N, "ТипТМЦ");
          ДатаСО           = GetFieldD(W, N, "ДатаСО");
          ДатаСН           = GetFieldD(W, N, "ДатаСН");
          ДатаСП           = GetFieldD(W, N, "ДатаСП");
          ПенсФонд         = GetFieldL(W, N, "ФПенс");
          СоцФонд          = GetFieldL(W, N, "ФСоц");
          МедФонд          = GetFieldL(W, N, "ФМед");
          RSub = OpenArray(W, N, "Вычеты", "ДатаКонца;ДатаНачала");
          Try
            For I=1..Records(RSub) Do
              InsertFrame(Вычеты, Вычеты+1);
              ДатаНВычета[Вычеты]      = GetFieldD(RSub, I, "ДатаНачала");
              ДатаКВычета[Вычеты]      = GetFieldD(RSub, I, "ДатаКонца");
              If GetFieldR(RSub, I, "Наименование")<>Nil:
                НаимВычета[Вычеты]     = GetFieldS(RSub, I, "Наименование.Вид");
              Fi;
              КоличВычетов[Вычеты]     = GetFieldI(RSub, I, "Количество");
              ПримечаниеВычета[Вычеты] = GetFieldS(RSub, I, "Примечание");
            Od;
          Finally
            CloseWorkArea(RSub);
          End;

          RSub = OpenArray(W, N, "ПрофВычеты", "ГОДДЕЙСТВИЯ;ДатаНачала");
          Try
            For I=1..Records(RSub) Do
              InsertFrame(ПрофВычеты, ПрофВычеты+1);
              ДатаНПрофВычета[ПрофВычеты]    = GetFieldD(RSub, I, "ДатаНачала");
              ГодДействПрофВычета[ПрофВычеты]= GetFieldI(RSub, I, "ГОДДЕЙСТВИЯ");
              If GetFieldR(RSub, I, "Наименование")<>Nil:
                НаимПрофВычета[ПрофВычеты]   = GetFieldS(RSub, I, "Наименование.Вид");
              Fi;
              ПримечаниеПрофВычета[ПрофВычеты] = GetFieldS(RSub, I, "Примечание");
            Od;
          Finally
            CloseWorkArea(RSub);
          End;

          RSub = OpenArray(W, N, "ПостНачисления", "ДатаКонца;ДатаНачала");
          Try
            For I=1..Records(RSub) Do
              InsertFrame(Начисления, Начисления+1);
              ДатаННачисления[Начисления]      = GetFieldD(RSub, I, "ДатаНачала");
              ДатаКНачисления[Начисления]      = GetFieldD(RSub, I, "ДатаКонца");
              If GetFieldR(RSub, I, "Код")<>Nil:
                НаимНачисления[Начисления]     = GetFieldS(RSub, I, "Код.Вид");
              Fi;
              If GetFieldR(RSub, I, "Подраз")<>Nil:
                ПодрНачисления[Начисления]     = GetFieldS(RSub, I, "Подраз.Подраз");
              Fi;
              ПримечаниеНачисления[Начисления] = GetFieldS(RSub, I, "ПримечаниеНач");
            Od;
          Finally
            CloseWorkArea(RSub);
          End;

          RSub = OpenArray(W, N, "ПостУдержания", "ДатаКонца;ДатаНачала");
          Try
            For I=1..Records(RSub) Do
              InsertFrame(Удержания, Удержания+1);
              ДатаНУдержания[Удержания]      = GetFieldD(RSub, I, "ДатаНачала");
              ДатаКУдержания[Удержания]      = GetFieldD(RSub, I, "ДатаКонца");
              If GetFieldR(RSub, I, "Код")<>Nil:
                НаимУдержания[Удержания]     = GetFieldS(RSub, I, "Код.Вид");
              Fi;
              If GetFieldR(RSub, I, "Подраз")<>Nil:
                ПодрУдержания[Удержания]     = GetFieldS(RSub, I, "Подраз.Подраз");
              Fi;
              ПримечаниеУдержания[Удержания] = GetFieldS(RSub, I, "ПримечаниеУд");
            Od;
          Finally
            CloseWorkArea(RSub);
          End;

          RSub = OpenArray(W, N, "СевНадб", "ДатаКонца;ДатаНачала");
          Try
            For I=1..Records(RSub) Do
              InsertFrame(Север, Север+1);
              ДатаНСевер[Север]      = GetFieldD(RSub, I, "ДатаНачала");
              ДатаКСевер[Север]      = GetFieldD(RSub, I, "ДатаКонца");
              ПроцентСевер[Север]    = GetFieldN(RSub, I, "ПроцентНадбавки");
              ПримечаниеСевер[Север] = GetFieldS(RSub, I, "ПримечаниеСев");
            Od;
          Finally
            CloseWorkArea(RSub);
          End;

          RSub = OpenArray(W, N, "Ставки", "М");
          Try
            For I=1..Records(RSub) Do
              InsertFrame(Ставки, Ставки+1);
              НомерМесяца[Ставки]    = GetFieldI(RSub, I, "М");
              Ставка[Ставки]         = GetFieldN(RSub, I, "Ставка");
            Od;
          Finally
            CloseWorkArea(RSub);
          End;
        Else
        Fi;
      Finally
        CloseWorkArea(W);
      End;
    Else
    Fi;
  Fi;
Corp;

Proc СчитатьИнвалидность;
Var W, N      :Integer;
Var FilterDoc :String;

  If УпрИнвалид=1:
    ОчиститьИнвалидность;
    If Наличие_Сотр_Инвалид:
      Hint("Идет считываение сведений об инвалидности сотрудника...");
      FilterDoc = "Сотр="+RecordToString(Current);
      W = OpenWorkArea("Сотр_Инвалид", "Инвалид", FilterDoc);
      Try
        For N=1..Records(W) Do
          InsertFrame(Инвалиды, Инвалиды+1);
          СсылкаНаИнвалидность[Инвалиды] = RecordToString(GetRecordKey(W, N));
          ИнвЛог[Инвалиды]               = GetFieldL(W, N, "Инвалид");

          НомерСправкиИнв[Инвалиды]      = GetFieldS(W, N, "НомерСправки");
          ДатаВыдачиИнв[Инвалиды]        = GetFieldD(W, N, "ДатаВыдачи");
          ГруппаИнв[Инвалиды]            = GetFieldI(W, N, "Группа");

          ДатаНачалаИнв[Инвалиды]        = GetFieldD(W, N, "ДатаНачала");
          ДатаКонцаИнв[Инвалиды]         = GetFieldD(W, N, "ДатаКонца");
          КомментИнв[Инвалиды]           = GetFieldS(W, N, "Комментарий");
        Od;
      Finally
        CloseWorkArea(W);
      End;
    Else
    Fi;
  Fi;
Corp;

Proc СчитатьУРА;
Var W, N      :Integer;
Var FilterDoc :String;

  If УпрУРА=1:
    ОчиститьУРА;
    If Наличие_Сотр_УРА:
      Hint("Идет считываение сведений о сотруднике для систему У.Р.А. ...");
      FilterDoc = "Сотр="+RecordToString(Current);
      W = OpenWorkArea("Сотр_УРА", "", FilterDoc);
      Try
        If Records(W)>0: N=1;
          СсылкаНаУРА        = RecordToString(GetRecordKey(W, N));
          НомерУдостоверения = GetFieldS(W, N, "НомУд");
          Класс              = GetFieldS(W, N, "Класс");
          ЛицКарт            = GetFieldI(W, N, "ЛицКарт");
          РегНомер           = GetFieldS(W, N, "РегНом");
          РегСерия           = GetFieldS(W, N, "РегСерия");
          РегНомерСерии      = GetFieldS(W, N, "РегСерНом");
          ДопИнформация      = GetFieldS(W, N, "ДопИнфо");
        Else
        Fi;
      Finally
        CloseWorkArea(W);
      End;
    Else
    Fi;
  Fi;
Corp;

Proc ЗапомнитьОсновныеЗначения;
--------------------------------------------------------------------------------------------------
-- Необходимо при заполнении основного подразделения заполнять тоже значение в основной         --
-- картотеке в полях с основной информацией о подразделении, должности, категории, паспорте,    --
-- адресной информации. При изменении какого-либо из адресов (фактический, по прописке)         --
-- необходимо также выводить запрос использовать ли данный адрес по умолчанию в основной        --
-- информации.                                                                                  --
--------------------------------------------------------------------------------------------------

Corp;

Proc ДублироватьЗапись(CardName:String; W:Integer; N:Integer; It:Integer);
Var NN  :Integer;
Var Rec :Record;

  If CardName="Сотр_Перемещения":
    Try
      Rec = StringToRecord(СсылкаНаПеремещение[It]);
      NN  = GetRecordNumber(W, Rec);
      N   = PutFieldR(W, N, "Сотр",             GetFieldR(W, NN, "Сотр"));
      N   = PutFieldS(W, N, "ФИОТ",             GetFieldS(W, NN, "ФИОТ"));
      N   = PutFieldS(W, N, "Признак",          GetFieldS(W, NN, "Признак"));
      N   = PutFieldL(W, N, "Основное",         False);--GetFieldL(W, NN, "Основное"));
      N   = PutFieldL(W, N, "ФункцияОтВыручки", GetFieldL(W, NN, "ФункцияОтВыручки"));
      N   = PutFieldR(W, N, "Зарплата",         GetFieldR(W, NN, "Зарплата"));
      N   = PutFieldR(W, N, "Должность",        GetFieldR(W, NN, "Должность"));
      N   = PutFieldR(W, N, "Категория",        GetFieldR(W, NN, "Категория"));
      N   = PutFieldR(W, N, "Подразделение",    GetFieldR(W, NN, "Подразделение"));
      N   = PutFieldR(W, N, "ВидОплаты",        GetFieldR(W, NN, "ВидОплаты"));
      N   = PutFieldN(W, N, "Оклад",            GetFieldN(W, NN, "Оклад"));
      N   = PutFieldR(W, N, "Штат",             GetFieldR(W, NN, "Штат"));
      N   = PutFieldN(W, N, "НормаДня",         GetFieldN(W, NN, "НормаДня"));
      N   = PutFieldR(W, N, "ГрафикРаботы",     GetFieldR(W, NN, "ГрафикРаботы"));
      N   = PutFieldS(W, N, "ТелефонРабочий",   GetFieldS(W, NN, "ТелефонРабочий"));
      N   = PutFieldR(W, N, "Кадры",            GetFieldR(W, NN, "Кадры"));
      N   = PutFieldS(W, N, "НомерПриказа",     GetFieldS(W, NN, "НомерПриказа"));
      N   = PutFieldD(W, N, "ДатаНазначения",   GetFieldD(W, NN, "ДатаНазначения"));
      N   = PutFieldD(W, N, "ДатаОкончания",    GetFieldD(W, NN, "ДатаОкончания"));
      N   = PutFieldD(W, N, "ДатаПриказа",      GetFieldD(W, NN, "ДатаПриказа"));
      N   = PutFieldS(W, N, "Примечание",       GetFieldS(W, NN, "Примечание"));
      N   = PutFieldS(W, N, "Характ",           GetFieldS(W, NN, "Характ"));
      N   = PutFieldL(W, N, "Перевод",          GetFieldL(W, NN, "Перевод"));
      N   = PutFieldR(W, N, "Разряд",           GetFieldR(W, NN, "Разряд"));
      N   = PutFieldN(W, N, "День",             GetFieldN(W, NN, "День"));
      N   = PutFieldS(W, N, "ТипНадбавки",      GetFieldS(W, NN, "ТипНадбавки"));
      N   = PutFieldN(W, N, "Надбавка",         GetFieldN(W, NN, "Надбавка"));
      N   = PutFieldS(W, N, "ИмяГрафика",       GetFieldS(W, NN, "ИмяГрафика"));
    Except
      --Raise;
    End;
  Fi;
Corp;

Proc ДобавитьДокумент(CardName:String; BlankName:String; Sorting:String; Filter:String; Open:Logical; I:Integer; Дублирование:Logical);
Var W, N      :Integer;
Var FilterDoc :String;
Var Rec       :Record;

  FilterDoc = "(Сотр="+RecordToString(Current)+")"+Filter;
  W = OpenWorkArea(CardName, Sorting, FilterDoc);
  Try
    BeginChanging(W);
    Try
      N   = InsertRecord(W);
      Rec = GetRecordKey(W, N);
      N   = PutFieldR(W, N, "Сотр", Current);
      If CardName="Сотр_Перемещения":
        N = PutFieldS(W, N, "ФИОТ", ФИОТ);
        N = PutFieldS(W, N, "Признак", Признак);
      Fi;
      If Дублирование: ДублироватьЗапись(CardName, W, N, I); Fi;
      EndChanging(W);
    Except
      CancelChanging(W);
      Raise;
    End;
  Finally
    CloseWorkArea(W);
  End;
  If Open:
    W = OpenWorkArea(CardName, "", "UKey="+RecordToString(Rec));
    Try
      If Records(W)>0: OpenBlankEditor(BlankName, W, 1); Fi;
    Finally
      CloseWorkArea(W);
    End;
  Fi;
Corp;

Func вхДобавитьЗапись(S:S; I:I):Logical;

  If S="SP21" Or -- ФИО (добавление в шапке)
     S="SP22":   -- ФИО (добавление в секции)
    ClearVariable(НоваяДата); ClearVariable(НоваяФамилия); 
    ClearVariable(НовоеИмя);  ClearVariable(НовоеОтчество);
    НовоеФИО      = 1;
    НоваяДата     = If(ДатаРожд>1.01.1917 And Фамилия[ToDay]="", ДатаРожд, ToDay);
    НовоеИмя      = ИмяСотрудника[НоваяДата];
    НовоеОтчество = Отчество[НоваяДата];
  | S="SP02":
       If I>1:
          If ДАТЫУВОЛЬНЕНИЯ[I-1].ДАТАПРИЕМА<2.2.1917:
             Message('Вы повторно "недоприняли" сотрудника,а уже пытаетесь принять его еще раз!');
           ^False;
          Fi;
       Fi;
       If ДАТАУВОЛЬНЕНИЯ>1.1.1917:
         InsertFrame(ДАТЫУВОЛЬНЕНИЯ,ДАТЫУВОЛЬНЕНИЯ+1);
         ДАТЫУВОЛЬНЕНИЯ[ДАТЫУВОЛЬНЕНИЯ].ДАТАУВОЛЬНЕНИЯ=ДАТАУВОЛЬНЕНИЯ;
         ДАТЫУВОЛЬНЕНИЯ[ДАТЫУВОЛЬНЕНИЯ].ДАТАПРИЕМА=ДАТАУВОЛЬНЕНИЯ;
         ДАТАУВОЛЬНЕНИЯ=1.1.100;
      --   СтВновьПринят=ВновьПринят;
       else
         Message("Нельзя вновь принять не уволенного сотрудника!");
       Fi;

  |  S="SP31" Or S="SP32":   -- Документы
    If Наличие_Сотр_Документ:
      If S="SP31":   -- Документы (добавление в шапке)
        If Документы=0: InsertFrame(Документы, Документы+1); Fi;
      |  S="SP32":   -- Документы (добавление в секции)
        ДобавитьДокумент("Сотр_Документ", "Инфо.Справочники.Удостоверение", "ДатаВыдачи", "", True, I, False);
        СчитатьДокументы;
      Fi;
    Else
    Fi;
  |  S="SP41" Or S="SP42": -- Адрес
    If Наличие_Сотр_Адрес:
      If S="SP41": -- Адрес (добавление в шапке)
        If Адреса=0: InsertFrame(Адреса, Адреса+1); Fi;
      |  S="SP42": -- Адрес (добавление в секции)
        ДобавитьДокумент("Сотр_Адрес", "Инфо.Справочники.Адрес", "Дата", "", True, I, False);
        СчитатьАдрес;
      Fi;
    Else
    Fi;
  |  (S="SP51" And SP51>"") Or (S="SP52" And SP52>"") Or (S="SP53" And SP53>""): -- Перемещения
    If Наличие_Сотр_Перемещения:
      If S="SP51": -- Перемещения (добавление в шапке)
        If Перемещения=0: InsertFrame(Перемещения, Перемещения+1); Fi;
      |  S="SP52": -- Перемещения (добавление в секции)
        ДобавитьДокумент("Сотр_Перемещения", "Инфо.Справочники.Перемещения", "ДатаНазначения", "", True, I, False);
        СчитатьПеремещения;
      |  S="SP53": -- Перемещения (дублирование в секции)
        ДобавитьДокумент("Сотр_Перемещения", "Инфо.Справочники.Перемещения", "ДатаНазначения", "", True, I, True);
        СчитатьПеремещения;
      Fi;
    Else
    Fi;
  |  S="SP61" Or S="SP62": -- Зарплата
    If Наличие_Сотр_Зарплата:
      If S="SP62": -- добавление
        ДобавитьДокумент("Сотр_Зарплата", "Инфо.Справочники.Зарплата", "", "", True, I, False);
        СчитатьЗарплату;
      Fi;
    Else
    Fi;
  |  S="SP101" Or S="SP102": -- Инвалидность
    If Наличие_Сотр_Инвалид:
      If S="SP101": -- Инвалидность (добавление в шапке)
        If Инвалиды=0: InsertFrame(Инвалиды, Инвалиды+1); Fi;
      |  S="SP102": -- Инвалидность (добавление в секции)
        ДобавитьДокумент("Сотр_Инвалид", "Инфо.Справочники.Инвалидность", "Инвалид", "", True, I, False);
        СчитатьИнвалидность;
      Fi;
    Else
    Fi;
  |  S="SP111" Or S="SP112": -- УРА
    If Наличие_Сотр_УРА:
      If S="SP112": -- добавление
        ДобавитьДокумент("Сотр_УРА", "Инфо.Справочники.Реквизиты_Водителя", "", "", True, I, False);
        СчитатьУРА;
      Fi;
    Else
    Fi;
  Fi;
  ^False;
Cnuf;

Proc РедактироватьДокумент(CardName:String; BlankName:String; Ссылка:String; NameIndex:String; Index:Integer);
Var W, N :Integer;
Var Rec  :Record;

  Rec = If(Ссылка<>"", StringToRecord(Ссылка), Nil);
  If Rec<>Nil:
    W = OpenWorkArea(CardName, "", "UKey="+Ссылка);
    Try
      N = Records(W);
      If N=0: -- Записи не существует   (хреново)
      |  N>1: -- Более чем одна запись  (хреново)
      |  N=1: -- Одна запись            (все хорошо)
        OpenBlankEditor(BlankName, W, N);
      Fi;
    Finally
      CloseWorkArea(W);
    End;
  Else
    вхДобавитьЗапись(NameIndex, Index);
  Fi;
Corp;

Func вхРедактироватьЗапись(S:S; I:I):Logical;
  If S="SE3":
    If Наличие_Сотр_Документ:
      РедактироватьДокумент("Сотр_Документ", "Инфо.Справочники.Удостоверение", СсылкаНаДокумент[I], "SP32", I);
      СчитатьДокументы;
    Else
    Fi;
  |  S="SE4":
    If Наличие_Сотр_Адрес:
      РедактироватьДокумент("Сотр_Адрес", "Инфо.Справочники.Адрес", СсылкаНаАдрес[I], "SP42", I);
      СчитатьАдрес;
    Else
    Fi;
  |  S="SE5": -- Перемещения и назначения
    If Наличие_Сотр_Перемещения:
      РедактироватьДокумент("Сотр_Перемещения", "Инфо.Справочники.Перемещения", СсылкаНаПеремещение[I], "SP52", I);
      СчитатьПеремещения;
    Else
    Fi;
  |  S="SE6": -- Зарплата
    If Наличие_Сотр_Зарплата:
      РедактироватьДокумент("Сотр_Зарплата", "Инфо.Справочники.Зарплата", СсылкаНаЗарплату, "SP62", I);
      СчитатьЗарплату;
    Else
    Fi;
  |  S="SE10": -- Инвалидность
    If Наличие_Сотр_Инвалид:
      РедактироватьДокумент("Сотр_Инвалид", "Инфо.Справочники.Инвалидность", СсылкаНаИнвалидность[I], "SP102", I);
      СчитатьИнвалидность;
    Else
    Fi;
  |  S="SE11": -- УРА
    If Наличие_Сотр_УРА:
      РедактироватьДокумент("Сотр_УРА", "Инфо.Справочники.Реквизиты_Водителя", СсылкаНаУРА, "SP112", I);
      СчитатьУРА;
    Else
    Fi;
  Fi;
  ^False;
Cnuf;

Proc РедактироватьЗапись(S:String);
  If Вид=5:
    вхРедактироватьЗапись("SE6", 0);
  |  Вид=7:
    вхРедактироватьЗапись("SE11", 0);
  |   True:
  Fi;
Corp;

Proc УдалитьДокумент(CardName:String; Ссылка:String);
Var Rec    :Record;
Var W, N   :Integer;

  Rec = If(Ссылка<>"", StringToRecord(Ссылка), Nil);
  If Rec<>Nil:
    W = OpenWorkArea(CardName, "", "UKey="+Ссылка);
    Try
      If Records(W)>0:
        N = EnqOkCancel("Удалить выбранный документ?");
        If N = cmOk:
          BeginChanging(W);
          Try
            DeleteAllRecords(W);
            EndChanging(W);
          Except
            CancelChanging(W);
            Raise;
          End;
        Fi;
      Fi;
    Finally
      CloseWorkArea(W);
    End;
  Fi;
Corp;

Func вхУдалитьЗапись(S:S; I:I):Logical;
Var W, RSub, N, II, Z  :Integer;

  If S="SM22" Or S="SM02":   -- ФИО (удаление в секции)
    N = EnqOkCancel("Вы уверены, что хотите удалить?");
    If N = cmOk:
      EditorApply;
      W = OpenWorkArea("Сотрудники", "", "UKey="+RecordToString(Current));
      Try
        If Records(W)>0:
          BeginChanging(W);
          Try
           If S= "SM22":
            RSub = OpenArray(W, 1, "Фамилия", "Период");
            Try
              For II=1..Records(RSub) Do
                If ДатаФамилии[I]=GetFieldD(RSub, II, "Период"):
                  DeleteRecord(RSub, II); Break;
                Fi;
              Od;
            Finally
              CloseWorkArea(RSub);
            End;
            RSub = OpenArray(W, 1, "ИмяСотрудника", "Период");
            Try
              For II=1..Records(RSub) Do
                If ДатаФамилии[I]=GetFieldD(RSub, II, "Период"):
                  DeleteRecord(RSub, II); Break;
                Fi;
              Od;
            Finally
              CloseWorkArea(RSub);
            End;
            RSub = OpenArray(W, 1, "Отчество", "Период");
            Try
              For II=1..Records(RSub) Do
                If ДатаФамилии[I]=GetFieldD(RSub, II, "Период"):
                  DeleteRecord(RSub, II); Break;
                Fi;
              Od;
            Finally
              CloseWorkArea(RSub);
            End;
           | True:
            RSub = OpenArray(W, 1, "ДАТЫУВОЛЬНЕНИЯ", "ДАТАУВОЛЬНЕНИЯ");
            Try
              For II=1..Records(RSub) Do
                If ДатУ[I]=GetFieldD(RSub, II, "ДАТАУВОЛЬНЕНИЯ"):
                  Z = PutFieldD(W,1,"ДАТАУВОЛЬНЕНИЯ",ДатУ[I]);
                  If I=1:
                    Z = PutFieldD(W,1,"ДатаПриема",ДатаПервичПриема);
                  | True:
                    Z = PutFieldD(W,1,"ДатаПриема",GetFieldD(RSub, II-1, "ДАТАПриема"));
                  Fi;
                  DeleteRecord(RSub, II); 
                  Break;
                Fi;
              Od;
            Finally
              CloseWorkArea(RSub);
            End;

           Fi;
            EndChanging(W);
          Except
            CancelChanging(W);
            Raise;
          End;
        Fi;
      Finally
        CloseWorkArea(W);
      End;
      СчитатьФамилию;
      If УпрФамилияСекция>0:
        ФИОТ = Фамилия[ToDay]+" "+ИмяСотрудника[ToDay]+" "+Отчество[ToDay];
      Fi;
    Fi;
  |  S="SM32":   -- Документы (удаление в секции)
    If Наличие_Сотр_Документ:
      УдалитьДокумент("Сотр_Документ", СсылкаНаДокумент[I]);
      СчитатьДокументы;
    Else
    Fi;
  |  S="SM42":   -- Адрес (удаление в секции)
    If Наличие_Сотр_Адрес:
      УдалитьДокумент("Сотр_Адрес", СсылкаНаАдрес[I]);
      СчитатьАдрес;
    Else
    Fi;
  |  S="SM52": -- Перемещения и назначения
    If Наличие_Сотр_Перемещения:
      УдалитьДокумент("Сотр_Перемещения", СсылкаНаПеремещение[I]);
      СчитатьПеремещения;
    Else
    Fi;
  |  S="SM62": -- Зарплата
    If Наличие_Сотр_Зарплата:
      УдалитьДокумент("Сотр_Зарплата", СсылкаНаЗарплату);
      СчитатьЗарплату;
    Else
    Fi;
  |  S="SM102": -- Инвалидность
    If Наличие_Сотр_Инвалид:
      УдалитьДокумент("Сотр_Инвалид", СсылкаНаИнвалидность[I]);
      СчитатьИнвалидность;
    Else
    Fi;
  |  S="SM112": -- УРА
    If Наличие_Сотр_УРА:
      УдалитьДокумент("Сотр_УРА", СсылкаНаУРА);
      СчитатьУРА;
    Else
    Fi;
  Fi;
  ^False;
Cnuf;

Func ПроверкаДаты(D:Date):Logical;
Var I  :Integer;

  For I=1..УпрФамилия Do
    If D=ДатаФамилии[I]:
      Message("Введенная дата уже присутствует в общем списке.^MНеобходимо ввести другое значение.");
      ^True;
    Fi;
  Od;
  ^False;
Cnuf;

Func ПроверкаДатыИзШаблона(S:S; I:I):Logical;

  If Признак="":
    Message("Необходимо первоначально ввести 'Табельный номер' сотрудника...");
    Template.Field = "Признак";
    Template.Frame = I;
    ^False;
  Fi;
  If Not ДатаРожд>1.01.1917 And Not Сотрудник:
    Message("Необходимо первоначально ввести 'Дату рождения' сотрудника...");
    Template.Field = "ДатаРожд";
    Template.Frame = I;
    ^False;
  Fi;
  If Not НоваяДата>1.01.1917:
    Message("Пожалуйста, введите сначала дату...");
    Template.Field = "НоваяДата";
    Template.Frame = I;
    ^False;
  Fi;
  If ПроверкаДаты(НоваяДата): 
    Template.Field = "НоваяДата";
    Template.Frame = I;
    ^False;
  Fi;
  ^True;
Cnuf;

Proc приВыходеДатаРождения(S:String; I:Integer);
  If ДатаРожд>1.01.1917 And ФИОТ="" And УпрНовоеФИО=1:
    НоваяДата      = ДатаРожд;
    Template.Field = "П";
    --Template.Field = "ФИОТ";
  Fi;
Corp;

Proc ЗаписатьСклоненияФамилии(Вопрос :Logical; D :Date);
Var Enq             :Integer;
Var ДЛ, ДЛ1, ДЛ2    :Integer;
Var Фамил, Имя, Отч :String;
Var И1, О2, Й       :String;

  If Вопрос: Enq = EnqOkCancel("Записать склонения фамилии по умолчанию?"); Fi;
  If (Enq=cmOk And Вопрос) Or Not Вопрос:

    Фамил   = Фамилия[D+1];
    Имя     = ИмяСотрудника[D+1];
    Отч     = Отчество[D+1];

    ДЛ      = Length(Фамил)-1;
    ДЛ1     = Length(Имя)-1;
    ДЛ2     = Length(Отч)-1;
    И1      = SubStr(Имя, 1, ДЛ1);
    О2      = " "+SubStr(Отч, 1, ДЛ2);

    If Not Пол:
      Й           = If(SubStr(Имя,ДЛ1+1,1)="Й","",SubStr(Имя,ДЛ1+1,1));
      ФКого[D]    = Фамил+"а";
      ИОКого[D]   = И1+Й+If(Й="","я","а")+" "+Отч+"а";
      ФОтКого[D]  = Фамил+"а";
      ИОтКого[D]  = И1+Й+If(Й="","я","а")+" "+Отч+"а";
      ФКому[D]    = Фамил+"у";
      ИОКому[D]   = И1+Й+If(Й="","ю","у")+" "+Отч+"у";
    |  Пол:
      ФКого[D]    = SubStr(Фамил, 1, ДЛ)+"у";
      ИОКого[D]   = И1+"у"+О2+"у";
      ФОтКого[D]  = SubStr(Фамил, 1, ДЛ)+"ой";
      ИОтКого[D]  = И1+"ы"+О2+"ы";
      ФКому[D]    = SubStr(Фамил, 1, ДЛ)+"ой";
      ИОКому[D]   = И1+"е"+О2+"е";
    Fi;
  Fi;
Corp;

Proc приВыходеВводНомера(S:String; It:Integer);
Var St :String;

  If Признак>"":
    Try
      For Sign St="Ф."+Признак Do
        If Not (SignCardFile(St) = "Сотрудники" And SignToRecord(St) = Current):
          Message("Заданный табельный номер уже используется. Необходимо выбрать другое значение");
          Признак        = "";
          Template.Field = "Признак";
          Break;
        Fi;
      Od;
    Except
    End;
    If Признак>"":
      If Not ДатаРожд>1.01.1917 And Not Сотрудник:
        Template.Field = "ДатаРожд";
      Else
        Template.Field = "П";
        --Template.Field = "ФИОТ";
      Fi;
    Fi;
  Else
    Message("Необходимо задать табельный номер сотрудника.");
    Template.Field = "Признак";
  Fi;
Corp;

Func приВходеВводФамилии(St:String; It:Integer):Logical;
  If Признак="":
    Message("Необходимо первоначально ввести 'Табельный номер' сотрудника...");
    Template.Field = "Признак";
    Template.Frame = It;
    ^False;
  Fi;
  If Not ДатаРожд>1.01.1917 And Not Сотрудник:
    Message("Необходимо первоначально ввести 'Дату рождения' сотрудника...");
    Template.Field = "ДатаРожд";
    Template.Frame = It;
    ^False;
  Fi;
  If Фамилия[ToDay]="": ^True; Else ^False; Fi;
Cnuf;

Proc приВыходеВводФамилии(S:String; It:Integer);
Var Ps                      :Integer;
Var St, Name1, Name2, Name3 :String;
Var Dt                      :Date;

  St = ФИОТ;
  If St>"" And Фамилия[ToDay]="":
    St    = Trim(St);
    Dt    = If(ДатаРожд>1.01.1917, ДатаРожд, Dat(1, 1, Year(ToDay)));
    Ps    = Pos(" ", St);
    If Ps>0:
      Name1 = SubStr(St, 1, Ps-1);
      St    = SubStr(St, Ps+1, Length(St)-Ps);
      St    = Trim(St);
      Ps    = Pos(" ", St);
      If Ps>0:
        Name2 = SubStr(St, 1, Ps-1);
        St    = SubStr(St, Ps+1, Length(St)-Ps);
        St    = Trim(St);
        Name3 = St;
      Else
        Name2 = St;
      Fi;
    Else
      Name1 = St;
    Fi;
    Фамилия[Dt] = Name1; ИмяСотрудника[Dt] = Name2; Отчество[Dt] = Name3;
    Инициалы = SubStr(ИмяСотрудника[Dt], 1, 1)+"."+SubStr(Отчество[Dt], 1, 1)+".";
    ЗаписатьСклоненияФамилии(False, Dt);
    СчитатьФамилию;
  Fi;
Corp;

Func ПроверкаФамилии(S:String; I:Integer; St :String):Logical;
  If Not НоваяДата>1.01.1917:
    Message("Пожалуйста, введите сначала дату.");
    If S="НоваяФамилия":  НоваяФамилия  = "";
    |  S="НовоеИмя":      НовоеИмя      = "";
    |  S="НовоеОтчество": НовоеОтчество = "";
    Fi;
    Шаблон.Поле = "НоваяДата";
    Шаблон.Кадр = I;
  Else
    If Not ПроверкаДаты(НоваяДата):
      St = Trim(St);
      If S="НоваяФамилия":  Фамилия[НоваяДата] = St;           ИмяСотрудника[НоваяДата] = НовоеИмя; Отчество[НоваяДата] = НовоеОтчество;
      |  S="НовоеИмя":      Фамилия[НоваяДата] = НоваяФамилия; ИмяСотрудника[НоваяДата] = St;       Отчество[НоваяДата] = НовоеОтчество;
      |  S="НовоеОтчество": Фамилия[НоваяДата] = НоваяФамилия; ИмяСотрудника[НоваяДата] = НовоеИмя; Отчество[НоваяДата] = St;
      Fi;
      Инициалы = SubStr(ИмяСотрудника[ToDay], 1, 1)+"."+SubStr(Отчество[ToDay], 1, 1)+".";
      ФИОТ     = Фамилия[ToDay]+" "+ИмяСотрудника[ToDay]+" "+Отчество[ToDay];
      ЗаписатьСклоненияФамилии(False, НоваяДата);
    Fi;
  Fi;
  ^True;
Cnuf;

Proc ЗакрытьДатуОкончания(St:String; It:Integer);
Var W, N, I, K :Integer;
Var FilterDoc  :String;

  If ДатаУвольнения>01.01.1917:
    FilterDoc = "Сотр="+RecordToString(Current)+" And (Not ДатаОкончания>1.01.1917 Or ДатаОкончания>"+DateToString(ДатаУвольнения)+")";
    W         = OpenWorkArea("Сотр_Перемещения", "ДатаНазначения", FilterDoc);
    Try
      N = Records(W);
      If N>0:
        If EnqOkCancel("У уволенного сотрудника присутствуют подразделения с не закрытой датой окончания работы,^Mили дата окончания больше, чем дата увольнения.^MЗакрыть их автоматически датой увольнения?")=cmOk:
          BeginChanging(W);
          Try
            For I=1..N Do
              K = PutFieldD(W, I, "ДатаОкончания", ДатаУвольнения);
            Od;
            EndChanging(W);
          Except
            CancelChanging(W);
          End;
        Fi;
      Fi;
    Finally
      CloseWorkArea(W);
    End;
  Fi;
Corp;


Func ВызовКалендаря(S:S; I:I):Logical;
Var TempDate :Date;

  If S="SC2": -- Выбор даты изменения ФИО
    TempDate = Calendar;
    If TempDate<>1.1.1917 And TempDate<>НоваяДата: НоваяДата=TempDate; Fi;
  |  S="SC5": -- Выбор даты увольнения
    TempDate = Calendar;
    If TempDate<>1.1.1917 And TempDate<>ДатаУвольнения: ДатаУвольнения=TempDate; Fi; ЗакрытьДатуОкончания("", 0);
--------------------------------------------------------------------------------------------------
-- При указании даты увольнения необходимо закрывать работы в подразделениях без даты окончания --
--------------------------------------------------------------------------------------------------
  | S="Sc02":
    TempDate = Calendar;
    If TempDate<>1.1.1917 And Not ВновьПринят:ДатаПриема=TempDate; Fi;
  Fi;
  ^False;
Cnuf;

Proc ПоказатьКнопкиРазделов;
  --РПО
  кнЗарплата.Visible=False;
  кнВКадры.Visible=False;
  кнИнвалидность.Visible=False;
  кнПеремещения.Visible=False;
  кнУРА.Visible=False;
  ФлВновьПринят.Visible=False;
  --
  кнОбщее.Enabled    = False;
  кнАдрес.Enabled    = False; кнДокументы.Enabled    = False; кнПеремещения.Enabled  = False; 
  кнЗарплата.Enabled = False; кнИнвалидность.Enabled = False; кнУРА.Enabled          = False; 
  кнВКадры.Enabled   = False;

  If (Not Вид=1):                                                  кнОбщее.Enabled        = True; Fi;
  If Наличие_Сотр_Адрес And (Not Вид=2):                           кнАдрес.Enabled        = True; Fi;
  If Наличие_Сотр_Документ And (Not Вид=3):                        кнДокументы.Enabled    = True; Fi;
  If Наличие_Сотр_Перемещения And (Not Сотрудник) And (Not Вид=4): кнПеремещения.Enabled  = True; Fi;
  If Наличие_Сотр_Зарплата And (Not Сотрудник) And (Not Вид=5):    кнЗарплата.Enabled     = True; Fi;
  If Наличие_Сотр_Инвалид And (Not Сотрудник) And (Not Вид=6):     кнИнвалидность.Enabled = True; Fi;
  If Наличие_Сотр_УРА And (Not Сотрудник) And (Not Вид=7):         кнУРА.Enabled          = True; Fi;
  If Наличие_Сотр_Кадры And (Not Сотрудник):                       кнВКадры.Enabled       = True; Fi;
Corp;

Proc СчитатьИнформацию(ВыбратьВид :Integer);
  кнРедактор.Visible  = False;
  кнУмолчание.Visible = False;
  If ВыбратьВид=0:
    If Вид=1: СчитатьФамилию;      кнУмолчание.Visible = True;
    |  Вид=2: СчитатьАдрес;
    |  Вид=3: СчитатьДокументы;
    |  Вид=4: СчитатьПеремещения;
    |  Вид=5: СчитатьЗарплату;     кнРедактор.Visible  = True;кнРедактор.Hint="Редактировать запись информации о заработной плате сотрудника...";
    |  Вид=6: СчитатьИнвалидность;
    |  Вид=7: СчитатьУРА;          кнРедактор.Visible  = True;кнРедактор.Hint="Редактировать запись информации о реквизитах водителя...";
    Fi;
  |  ВыбратьВид=1: СчитатьФамилию;      кнУмолчание.Visible = True;
  |  ВыбратьВид=2: СчитатьАдрес;
  |  ВыбратьВид=3: СчитатьДокументы;
  |  ВыбратьВид=4: СчитатьПеремещения;
  |  ВыбратьВид=5: СчитатьЗарплату;     кнРедактор.Visible  = True; кнРедактор.Hint="Редактировать запись информации о заработной плате сотрудника...";
  |  ВыбратьВид=6: СчитатьИнвалидность;
  |  ВыбратьВид=7: СчитатьУРА;          кнРедактор.Visible  = True;кнРедактор.Hint="Редактировать запись информации о реквизитах водителя...";
  Fi;
Corp;

Flag :Logical;

Proc ПриСчитывании;
Var i:I;
  If Not СохранятьПозицию: Вид = 1; Fi;
  ПоказатьКнопкиРазделов;
  СчитатьИнформацию(0);
  If Not Признак>"": 
    вхДобавитьЗапись("SP22", 0); 
    Template.Field = "Признак";
  Fi;
  Flag = False;
  If УпрФИО69=1:
     ФлВновьПринят.Visible=False;
  | True:
     ФлВновьПринят.Visible=False;
  Fi;
  СтВновьПринят=ВновьПринят;
  ФлУдДАТЫУ=False;
  For I=1..ДАТЫУВОЛЬНЕНИЯ Do
     ДатПриема[I] = ДАТЫУВОЛЬНЕНИЯ[I].ДАТАПриема;
  Od;
  If ДатаПриема>2.2.1917 And ДАТЫУВОЛЬНЕНИЯ=0 And ДатаПриема<>ДатаПервичПриема:
     ДатаПервичПриема = ДатаПриема;
  Fi;
Corp;

Proc ИзменитьВид(S:S);

  кнОбщее.Enabled        = True;
  кнАдрес.Enabled        = True;
  кнДокументы.Enabled    = True;
  кнПеремещения.Enabled  = If(Сотрудник, False, True);
  кнЗарплата.Enabled     = If(Сотрудник, False, True);
  кнИнвалидность.Enabled = If(Сотрудник, False, True);
  кнУРА.Enabled          = If(Сотрудник, False, True);


  If S="кнОбщее":        Вид=1; кнОбщее.Enabled        = False; -- Основная информация
  |  S="кнАдрес":        Вид=2; кнАдрес.Enabled        = False; -- Адрес
  |  S="кнДокументы":    Вид=3; кнДокументы.Enabled    = False; -- Документы
  |  S="кнПеремещения":  Вид=4; кнПеремещения.Enabled  = False; -- Назначения и перемещения
  |  S="кнЗарплата":     Вид=5; кнЗарплата.Enabled     = False; -- Зарплата
  |  S="кнИнвалидность": Вид=6; кнИнвалидность.Enabled = False; -- Инвалидность
  |  S="кнУРА":          Вид=7; кнУРА.Enabled          = False; -- Управление автотранспортом
  Fi;
  СчитатьИнформацию(Вид);
Corp;

Proc ВзятьИзНастройки;
Var W :Integer;

  If ОбязательныеПоля:
    W = OpenWorkArea("Настройки", "");
    Try
      If Records(W)>0: Проверять = GetFieldL(W, 1, "ОбязательныеПоля"); Fi;
    Finally
      CloseWorkArea(W);
    End;
  Fi;
Corp;

Func ПриПроверке:Logical;
Var W, N, Wr, Nr, I   :Integer;
Var FilterDoc         :String;
Var Rec               :Record;

  Признак = Trim(Признак);
  ВзятьИзНастройки;

  if Not ValidSign(Признак):
    Message("Ошибка в написании табельного номера.");
    ШАБЛОН.поле="Признак";
    ^false;
  fi;

  If ДАТЫУВОЛЬНЕНИЯ>0:
     If ДАТЫУВОЛЬНЕНИЯ[ДАТЫУВОЛЬНЕНИЯ].ДАТАПриема=1.1.100:
       Message("При повторном приеме Вы не задали в таблице повторных приемов дату приема!");
       ^False;
     Fi;
  Fi;
  If ДатаУвольнения>01.01.1917: Проверять = False; Fi;
  If Проверять:
    СчитатьПеремещения; W = 0;
    For I=1..Перемещения Do 
      If Not ДатаНазначения[I]>1.01.1917:
        Message("Необходимо выбрать дату начала работы в подразделении"); 
        ИзменитьВид("кнПеремещения"); Template.Field = "SE5"; Template.Frame = I; Break; ^False;
      Fi;
      If ПодраздСекция[I]="":
        Message("Необходимо выбрать подразделение...");                   
        ИзменитьВид("кнПеремещения"); Template.Field = "SE5"; Template.Frame = I; Break; ^False;
      Fi;
      If ДолжностьСекция[I]="":
        Message("Необходимо выбрать должность сотрудника в выбранном подразделении...");
        ИзменитьВид("кнПеремещения"); Template.Field = "SE5"; Template.Frame = I; Break; ^False;
      Fi;
      If ОсновноеЛог[I] And (Not ДатаОкончания[I]>1.01.1917 Or ДатаОкончания[I]>=ToDay): W=W+1; Fi;
    Od;
    If W=0 And Not Сотрудник: Message("Необходимо выбрать основное подразделение на текущее время");
      ИзменитьВид("кнПеремещения"); Template.Field = "SE5"; Template.Frame = Перемещения; ^False;
    |  W>1: Message("Основное подразделение может быть только одно"); 
      ИзменитьВид("кнПеремещения"); Template.Field = "SE5"; Template.Frame = Перемещения; ^False;
    |  True:
    Fi;
  Fi;

  If Наличие_Сотр_Перемещения:
    FilterDoc = "Сотр="+RecordToString(Current);
    W = OpenWorkArea("Сотр_Перемещения", "ДатаНазначения", FilterDoc);
    Try
      N = Records(W);
      If N=0: ДобавитьДокумент("Сотр_Перемещения", "", "ДатаНазначения", "", False, 0, False); Fi;
      If N>0:
        Rec = Nil;
        If Наличие_Сотр_Зарплата:
          Wr = OpenWorkArea("Сотр_Зарплата", "", FilterDoc);
          Try
            If Records(Wr)=0: ДобавитьДокумент("Сотр_Зарплата", "", "", "", False, 0, False); Fi;
            If Records(Wr)>0: 
              Nr  = 1;
              Rec = GetRecordKey(Wr, Nr);
              BeginChanging(Wr);
              Try
                Nr  = PutFieldL(Wr, Nr, "ФПенс", ПенсФонд);
                Nr  = PutFieldL(Wr, Nr, "ФСоц",  СоцФонд);
                Nr  = PutFieldL(Wr, Nr, "ФМед",  МедФонд);
                EndChanging(Wr);
              Except
                CancelChanging(Wr);
                Raise;
              End;
            Fi;
          Finally
            CloseWorkArea(Wr);
          End;
        Fi;
        If Rec<>Nil:
          BeginChanging(W);
          Try
            For I=1..N Do
              I = PutFieldR(W, I, "Зарплата", Rec);
              I = PutFieldS(W, I, "Признак",  Признак);
              I = PutFieldS(W, I, "ФиоТ",     ФИОТ);
            Od;
            EndChanging(W);
          Except
            CancelChanging(W);
            Raise;
          End;
        Fi;
      Else
      Fi;
    Finally
      CloseWorkArea(W);
    End;
    ЗакрытьДатуОкончания("", 0);
  Fi;
  If Not Flag:
    If Not Признак>"":
      N = EnqOkCancel("Для сотрудника не задан табельный номер. Сохранить карточку без таб.номера?");
      If N=cmOk:
      |  N=cmCancel: Template.Field = "Признак"; Template.Frame = 1; ^False;
      Fi;
    Fi;
    If Not ДатаРожд>1.01.1917 And Not Сотрудник:
      N = EnqOkCancel("Для сотрудника не задана дата рождения. Сохранить карточку без даты рождения?");
      If N=cmOk:
      |  N=cmCancel: Template.Field = "ДатаРожд"; Template.Frame = 1; ^False;
      Fi;
    Fi;
  Fi;
  ^True;
Cnuf;

Proc ПриОтмене;
  ПриСчитывании;
Corp;

Func ЗапомнитьФамилию(S:S; I:I):Logical;
  ЗаписатьСклоненияФамилии(True, НоваяДата);
  Flag = False; If ПриПроверке: Flag = True; EditorApply; ПриСчитывании; Else Flag = False; Fi;
  ^False;
Cnuf;

Proc кнОК(S:String);
  Flag = False; If ПриПроверке: Flag = True; EditorApply; Close; Else Flag = False; Fi;
Corp;

Proc кнОтмена(S:String);
  EditorCancel; Close;
Corp;

proc Помощь;
  Раб.Сис.ShowHelpContext(211);
end;

Proc кнПомощь(S:String);
  --Раб.Сис.ShowHelpContext(211);
  Помощь;
Corp;

ВыбФПенс :Logical;
ВыбФСоц  :Logical;
ВыбФМед  :Logical;
Строки[] :String;

Proc ПроверкаСтатуса(S:String; It:Integer; Val:L);
Var FilterDoc       :String;
Var W, N, NN, RSub  :Integer;

  If Val:
    If Наличие_Сотр_Зарплата:
      FilterDoc = "Сотр="+RecordToString(Current);
      W = OpenWorkArea("Сотр_Зарплата", "", FilterDoc);
      Try
        N=Records(W);
        If N=0:
          Message("Внимание.По данному сотруднику у Вас нет записи в картотеке 'Сотр_Зарплата'!");
        |  N>1:
          Message("Внимание.По данному сотруднику у Вас "+Str(N)+" записей в картотеке 'Сотр_Зарплата'!Должна быть одна!Удалите лишние!");
        | True:
          RSub = OpenArray(W, N, "Вычеты", "ДатаКонца;ДатаНачала");
          Try
            NN=Records(RSub);
            If NN>0:
              Message("Внимание! Не забудьте удалить его стандартные вычеты!");
            Fi;
          Finally
            CloseWorkArea(RSub);
          End;
        Fi;
      Finally
        CloseWorkArea(W);
      End;
    Fi;
  Fi;
Corp;

Func ВыборПризнака(S:String; It:Integer):Logical;
Var N      :Integer;
Var Rec    :Record;
Var KodStr :String;

  If S="П":            -- Выбор Пола сотрудника
    Строки[1]="Мужской";
    Строки[2]="Женский";
    N = If(Not Пол, 1, 2);
    N = Alternate("Выбор пола:", Строки, -1, N);
    If N=1 And Not Пол:
    |  N=2 And Пол:
    |  True: Пол = If(N=1, False, True);
    Fi;
    If ДатаРожд>1.01.1917 And ФИОТ="" And УпрНовоеФИО=1: Template.Field = "ФИОТ"; Fi;
  |  S="СтатусСтрока": -- Выбор статуса сотрудника
    Строки[1]="Резидент";
    Строки[2]="Нерезидент";
    N = If(Not Статус, 1, 2);
    N = Alternate("Выбор статуса сотрудника:", Строки, -1, N);
    If N=1 And Not Статус:
    |  N=2 And Статус:
    |  True: Статус = If(N=1, False, True);
    Fi;
    ПроверкаСтатуса(S,It,Статус);
  |  S="Гражданство":
    Rec = OpenCardFile("КодСтр");
    If Rec<>Nil:
      Гражданство = GetCardFieldS("КодСтр", Rec, "Страна");
      KodStr      = GetCardFieldS("КодСтр", Rec, "Код");
      ВыбФПенс    = ПенсФонд;
      ВыбФСоц     = СоцФонд;
      ВыбФМед     = МедФонд;
      If KodStr<>"643":
        OpenBlank("Раб.СотрЕСН",True);
        ПенсФонд = ВыбФПенс;
        СоцФонд  = ВыбФСоц;
        МедФонд  = ВыбФМед;
        -- Необходимо сделать запись в картотеку "Сотр_Зарплата" в поля ФПенс, ФСоц, ФМед
      |  True:
        ПенсФонд = False;
        СоцФонд  = False;
        МедФонд  = False;
      Fi;
    Fi;
  |  S="Заявление": ЗаявВычет = Not ЗаявВычет;
  |  S="Сотрудник": Сотрудник = Not Сотрудник; ПоказатьКнопкиРазделов;
  Fi;
  ^False;
Cnuf;

Proc кнПоУмолчанию(S:String);
Var W, N                           :Integer;
Var КодСтраны, Индекс, КодРегиона  :String;
Var Район, Город, НасПункт, Улица  :String;
Var Дом, Корпус, Квартира          :String;
Var Rec                            :Record;

  If Наличие_Сотр_Перемещения:
    W = OpenWorkArea("Сотр_Перемещения", "ДатаНазначения", "Сотр="+RecordToString(Current)+" And Основное And (Not ДатаОкончания>1.01.1917 Or ДатаОкончания>="+DateToString(ToDay)+")");
    Try
      N = Records(W);
      If N=0:
      |  N=1:
        Подразделение  = GetFieldR(W, N, "Подразделение");
        Категория      = GetFieldR(W, N, "Категория");
        Должность      = GetFieldR(W, N, "Должность");
        ТелефонРабочий = GetFieldS(W, N, "ТелефонРабочий");
      |  True:
        Message("ОШИБКА!Основное подразделение должно быть только одно. Исправьте...");
      Fi;
    Finally
      CloseWorkArea(W);
    End;
  Fi;

  If Наличие_Сотр_Документ:
    W = OpenWorkArea("Сотр_Документ", "ДатаВыдачи", "Сотр="+RecordToString(Current)+" And Действующий");
    Try
      N = Records(W);
      If N=0:
      |  N=1:
        Rec     = GetFieldR(W, N, "ВидДокумента");
        Паспорт = If(Rec<>Nil, GetFieldS(W, N, "ВидДокумента.Вид"), "")+
                  " Серия:"+GetFieldS(W, N, "Серия")+
                  " Номер:"+GetFieldS(W, N, "Номер")+
                  " Выдан:"+GetFieldS(W, N, "ДатаВыдачи")+
                  " "+      GetFieldS(W, N, "Кем");
      |  True:
        Message("ОШИБКА!Основной действующий документ должен быть только один. Исправьте...");
      Fi;
    Finally
      CloseWorkArea(W);
    End;
  Fi;

  If Наличие_Сотр_Адрес:
    W = OpenWorkArea("Сотр_Адрес", "Дата", "Сотр="+RecordToString(Current)+" And (ПоПрописке) And (Дата>01.01.1917)");-- Or Фактический)");
    Try
      N = Records(W);
      If  N>0:
        Rec             = GetFieldR(W, N, "КодСтраны");
        КодСтраны       = If(Rec<>Nil, GetFieldS(W, N, "КодСтраны.Код"), "");
        Индекс          = GetFieldS(W, N, "Индекс");
        Rec             = GetFieldR(W, N, "КодРегиона");
        КодРегиона      = If(Rec<>Nil, GetFieldS(W, N, "КодРегиона.Код"), "");
        Район           = GetFieldS(W, N, "Район");
        Город           = GetFieldS(W, N, "Город");
        НасПункт        = GetFieldS(W, N, "НасПункт");
        Улица           = GetFieldS(W, N, "Улица");
        Дом             = GetFieldS(W, N, "Дом");
        Корпус          = GetFieldS(W, N, "Корпус");
        Квартира        = GetFieldS(W, N, "Квартира");
        ТелефонДомашний = GetFieldS(W, N, "Телефон");

        If КодСтраны="643": КодСтраны=""; Fi;
        If КодРегиона="77" Or КодРегиона="78" Or КодРегиона="99": Район=""; Город=""; Fi;
        If КодСтраны>"":  КодСтраны  = GetFieldS(W, N, "КодСтраны.Страна")+","; Fi;
        If КодРегиона>"": КодРегиона = GetFieldS(W, N, "КодРегиона.Регион")+","; Fi;
        If Индекс>"":     Индекс=Индекс+","; Fi;
        If Район>"":      Район=Район+","; Fi;
        If Город>"":      Город=Город+","; Fi;
        If НасПункт>"":   НасПункт=НасПункт+","; Fi;
        Адрес = Индекс+КодСтраны+КодРегиона+Район+Город+НасПункт+Улица+","+Дом+","+Корпус+","+Квартира;
      Fi;
    Finally
      CloseWorkArea(W);
    End;
  Fi;
Corp;

Proc кнВсехПоУмолчанию(S:String);
Var W, N,WW,NN,i,NNN               :Integer;
Var КодСтраны, Индекс, КодРегиона  :String;
Var Район, Город, НасПункт, Улица  :String;
Var Дом, Корпус, Квартира,Адр      :String;
Var Rec,Kl,Тек                     :Record;
Тек=Current;
--EditorApply;
--Close
WW=OpenWorkArea("Сотрудники","","ДАТАУВОЛЬНЕНИЯ<="+DateToString(ToDay) +" And Not Сотрудник");
Try
 NN=Records(WW);
 BeginChanging(WW);
 Try
  For I=1..NN Do
   Kl=GetRecordKey(WW,I);
   If Kl<>Тек:
   If Наличие_Сотр_Перемещения:
    W = OpenWorkArea("Сотр_Перемещения", "ДатаНазначения", "Сотр="+RecordToString(Kl)+" And Основное And (Not ДатаОкончания>1.01.1917 Or ДатаОкончания>="+DateToString(ToDay)+")");
    Try
      N = Records(W);
      If N=0:
      |  True:

        NNN=PutFieldR(WW,I,"Подразделение",GetFieldR(W, N, "Подразделение"));
        NNN=PutFieldR(WW,I,"Категория", GetFieldR(W, N, "Категория"));
        NNN=PutFieldR(WW,I,"Должность", GetFieldR(W, N, "Должность"));
        NNN=PutFieldS(WW,I,"ТелефонРабочий", GetFieldS(W, N, "ТелефонРабочий"));
      Fi;
    Finally
      CloseWorkArea(W);
    End;
   Fi;

   If Наличие_Сотр_Документ:
    W = OpenWorkArea("Сотр_Документ", "ДатаВыдачи", "Сотр="+RecordToString(KL)+" And Действующий");
    Try
      N = Records(W);
      If N=0:
      |  N=1:
        Rec     = GetFieldR(W, N, "ВидДокумента");
        NNN=PutFieldS(WW,I,"Паспорт", If(Rec<>Nil, GetFieldS(W, N, "ВидДокумента.Вид"), "")+
                  " Серия:"+GetFieldS(W, N, "Серия")+
                  " Номер:"+GetFieldS(W, N, "Номер")+
                  " Выдан:"+GetFieldS(W, N, "ДатаВыдачи")+
                  " "+      GetFieldS(W, N, "Кем"));
      |  True:
        Message("ОШИБКА!Основной действующий документ должен быть только один. Исправьте...("+GetFieldS(WW,I,"ФИОТ")+")");
      Fi;
    Finally
      CloseWorkArea(W);
    End;
   Fi;

   If Наличие_Сотр_Адрес:
    W = OpenWorkArea("Сотр_Адрес", "Дата", "Сотр="+RecordToString(Kl)+" And (ПоПрописке) And (Дата>01.01.1917)");-- Or Фактический)");
    Try
      N = Records(W);
      If  N>0:
        Rec             = GetFieldR(W, N, "КодСтраны");
        КодСтраны       = If(Rec<>Nil, GetFieldS(W, N, "КодСтраны.Код"), "");
        Индекс          = GetFieldS(W, N, "Индекс");
        Rec             = GetFieldR(W, N, "КодРегиона");
        КодРегиона      = If(Rec<>Nil, GetFieldS(W, N, "КодРегиона.Код"), "");
        Район           = GetFieldS(W, N, "Район");
        Город           = GetFieldS(W, N, "Город");
        НасПункт        = GetFieldS(W, N, "НасПункт");
        Улица           = GetFieldS(W, N, "Улица");
        Дом             = GetFieldS(W, N, "Дом");
        Корпус          = GetFieldS(W, N, "Корпус");
        Квартира        = GetFieldS(W, N, "Квартира");
        ТелефонДомашний = GetFieldS(W, N, "Телефон");

        If КодСтраны="643": КодСтраны=""; Fi;
        If КодРегиона="77" Or КодРегиона="78" Or КодРегиона="99": Район=""; Город=""; Fi;
        If КодСтраны>"":  КодСтраны  = GetFieldS(W, N, "КодСтраны.Страна")+","; Fi;
        If КодРегиона>"": КодРегиона = GetFieldS(W, N, "КодРегиона.Регион")+","; Fi;
        If Индекс>"":     Индекс=Индекс+","; Fi;
        If Район>"":      Район=Район+","; Fi;
        If Город>"":      Город=Город+","; Fi;
        If НасПункт>"":   НасПункт=НасПункт+","; Fi;
        Адр = Индекс+КодСтраны+КодРегиона+Район+Город+НасПункт+Улица+","+Дом+","+Корпус+","+Квартира;
        NNN=PutFieldS(WW,I,"Адрес",Адр);
      Fi;
    Finally
      CloseWorkArea(W);
    End;
   Fi;
  Fi;
  Od;

  EndChanging(WW);

 Except

  CancelChanging(WW);

 Raise;
 End;

Finally

  CloseWorkArea(WW);

End;












Corp;



Proc УдалитьСсылки(CardName :String);
Var W      :Integer;
Var Filter :String;

  If ПроверитьНаличиеКартотеки(CardName):
    Filter = If(CardName="Сотрудники", "UKey=", "Сотр=")+RecordToString(Current);
    W = OpenWorkArea(CardName, "", Filter);
    Try
      If Records(W)>0:
        BeginChanging(W);
        Try
          DeleteAllRecords(W);
          EndChanging(W);
        Except
          CancelChanging(W);
          Raise;
        End;
      Fi;
    Finally
      CloseWorkArea(W);
    End;
  Fi;
Corp;


Proc СписокУдаления(Целиком :Logical);
  УдалитьСсылки("Сотр_Адрес");
  УдалитьСсылки("Сотр_Инвалид");
  УдалитьСсылки("Сотр_Зарплата");
  УдалитьСсылки("Сотр_Кадры");
  УдалитьСсылки("Сотр_Перемещения");
  УдалитьСсылки("Сотр_Документ");
  УдалитьСсылки("Сотр_УРА");
  If Целиком:
    УдалитьСсылки("Сотрудники");
  Fi;
Corp;

func АналитикаЗаписиИспользуется: Logical;
  var n, i: Integer;
  var признЗап: String;

  n = ЧислоПризнаковЗаписи("Сотрудники", Текущая);
  for i = 1 .. n do
    признЗап = ПризнакЗаписи("Сотрудники", Текущая, i);
    if ПризнакИспользован(признЗап): 
      return true; 
    fi;
  od;
  return false;
end;

Proc кнУдалить(S:String);
  var N: Integer;

  if АналитикаЗаписиИспользуется:
    N = EnqOkCancel("Аналитика записи используется!" + chr(13) +
                    "Удаление приведет к ошибкам в связи с отсутсвием аналитического признака!" + chr(13) + chr(13) +
                    "Вы подтверждаете удаление?", mtWarning);
    if N = cmCancel: exit; fi;
  fi;

  N = EnqYesNoCancel("Удалить записи в картотеках о текущем сотруднике?");
  If N=cmYes: СписокУдаления(True);
  |  N=cmNo:
    N = EnqOkCancel("Удалить только записи в дополнительных картотеках о текущем сотруднике?");
    If N=cmOk: СписокУдаления(False); Fi;
  Fi;
  ПриСчитывании;
Corp;

Func ЗаписатьВКадры(W:Integer; N:Integer):Record;
Var Flag1, Flag2 :Logical;
Var I            :Integer;
Var Rec, Rez     :Record;

  Flag1 = False; Flag2 = False; Rez=Nil;
  BeginChanging(W);
  Try
    If N=0:
      N = InsertRecord(W); 
      N = PutFieldR(W, N, "Сотр", Current);
      N = PutFieldS(W, N, "ФИОТ", ФИОТ);  --
      N = PutFieldS(W, N, "ПРИЗНАК", ПРИЗНАК);  --
    | True:
      N = PutFieldS(W, N, "ФИОТ", ФИОТ);
    Fi;
    For I=1..Документы Do
      If ДействующийЛог[I] And СсылкаНаДокумент[I]>"":
        Rec = StringToRecord(СсылкаНаДокумент[I]);
        If Rec<>Nil:
          N = PutFieldS(W, N, "КлючПасп", СсылкаНаДокумент[I]);
          Break;
        Fi;
      Fi;
    Od;

    For I=1..Адреса Do
      If ПоПропискеЛог[I] And ФактическийЛог[I] And СсылкаНаАдрес[I]>"":
        Rec = StringToRecord(СсылкаНаАдрес[I]);
        If ПоПропискеЛог[I] And Rec<>Nil And Not Flag1:
          N     = PutFieldS(W, N, "КлючАдрПасп", СсылкаНаАдрес[I]);
          N     = PutFieldD(W, N, "ДатРег",      ДатаРегистрации[I]);
          N     = PutFieldS(W, N, "Индекс",      Индекс[I]);
          N     = PutFieldS(W, N, "АдресБИ",     АдресБезИндекса[I]);
          N     = PutFieldS(W, N, "Адрес",       АдресСборный[I]);
          Flag1 = True;
        Fi;
        If ФактическийЛог[I] And Rec<>Nil And Not Flag2:
          N     = PutFieldS(W, N, "КлючАдрФакт", СсылкаНаАдрес[I]);
          N     = PutFieldS(W, N, "ИндексФ",     Индекс[I]);
          N     = PutFieldS(W, N, "АдресФ",      АдресСборный[I]);
          N     = PutFieldS(W, N, "Телефон",     ТелефонДомСекция[I]);
          Flag2 = True;
        Fi;
        If Flag1 And Flag2: Break; Fi;
      Fi;
    Od;
    Rez = GetRecordKey(W, N);
    EndChanging(W);
  Except
    CancelChanging(W); Rez = Nil;
  End;
  ^Rez;
Cnuf;

Proc кнЗаписатьВКадры(S:String);
Var W, N, Enq :Integer;
Var CardName  :String;
Var Rec       :Record;

  Rec = Nil;
If ПриПроверке: 
  EditorApply;
  CardName = "Сотр_Кадры";
  СчитатьДокументы;
  СчитатьАдрес;
  If Наличие_Сотр_Кадры And Current<>Nil:
    W = OpenWorkArea(CardName, "", "Сотр="+RecordToString(Current));
    Try
      N = Records(W);
      If N=0:
        Rec = ЗаписатьВКадры(W, N); If Rec<>Nil: Message("Запись успешно произведена."); Fi;
      |  N=1: -- Запись есть, нужно ли обновление?
        Enq = EnqOkCancel("Запись для данного сотрудника в системе 'Кадры' уже существует. Обновить ее?");
        If Enq=cmOk:
          Rec = ЗаписатьВКадры(W, N); If Rec<>Nil: Message("Запись успешно произведена."); Fi;
        Fi;
      | True:
      Fi;
    Finally
      CloseWorkArea(W);
    End;
    OpenCardFile(CardName, "", Rec);
  Fi;
Fi;
Corp;

Func приВходе(St:String; It:Integer):Logical;
  If EnqOkCancel("Редактировать данное поле рекомендуется только для^Mкорректировки заполненной информации.^MДля ввода данных пользуйтесь закладками в верхней части бланка,^Mзатем заполняйте данные поля при помощи кнопки 'По умолчанию'^MПродолжить заполнение?")=cmOk: ^True; Fi;
  ^False;
Cnuf;

Func ПриВходеДатыУв(St:String; It:Integer):Logical;
    If It<>ДАТЫУВОЛЬНЕНИЯ:
       Message("Редактировать допускается только последнюю запись!");
      ^False;
    | True:
     ^True;
    Fi;
Cnuf;

Proc ПриВыходеДатыУв(St:String; It:Integer);
     ДАТЫУВОЛЬНЕНИЯ[It].ДАТАПриема=ДатПриема[It];
     ДАТАПриема=ДатПриема[It];
Corp;

Proc ПриИзмВновьПринят(Ob:S);
Var I:I;

    If Not СтВновьПринят:
       If ДАТАУВОЛЬНЕНИЯ<2.2.1917:
          Message("Нельзя вновь принять не уволенного сотрудника!");
          ВновьПринят=СтВновьПринят;
       | True:
         InsertFrame(ДАТЫУВОЛЬНЕНИЯ,ДАТЫУВОЛЬНЕНИЯ+1);
         ДАТЫУВОЛЬНЕНИЯ[ДАТЫУВОЛЬНЕНИЯ].ДАТАУВОЛЬНЕНИЯ=ДАТАУВОЛЬНЕНИЯ;
         ДАТАУВОЛЬНЕНИЯ=1.1.100;
         СтВновьПринят=ВновьПринят;
       Fi;
    | True:
       If (EnqOkCancel("Будет удалена вся таблица увольнений! Вы согласны?")=кмдВерно):
          ФлУдДАТЫУ=True;
         If ДАТЫУВОЛЬНЕНИЯ>0:
            ДАТАУВОЛЬНЕНИЯ=ДАТЫУВОЛЬНЕНИЯ[ДАТЫУВОЛЬНЕНИЯ].ДАТАУВОЛЬНЕНИЯ;
            I=ДАТЫУВОЛЬНЕНИЯ;
            While I>0 Do
              DeleteFrame(ДАТЫУВОЛЬНЕНИЯ,I);
              I=I-1;
            Od;
         Fi;
         СтВновьПринят=ВновьПринят;
         ДатаПриема=ДатаПервичПриема;
       | True:
          ВновьПринят=СтВновьПринят;
       Fi;
    Fi;
Corp;


Func ПриВхДатПриема(Ob:s;It:I):L;
  If Not ВновьПринят:
    ^True;
  |  True:
    ^False;
  Fi;
Cnuf;

Proc ПриВыхДатПриема(Ob:s;It:I);
  ДатаПервичПриема=ДатаПриема;
Corp;

Func ПриВхДатПриемаТабл(Ob:s;It:I):L;
  If ДатаУвольнения>02.02.1917:
    ^True;
  |  True:
    ^False;
  Fi;
Cnuf;

Proc ПриВыхДатПриемаТабл(Ob:s;It:I);
  ДатаПриема=ДатПриема[It];
Corp;

Func Признак_OnEnter(FieldName: String; Iter: Integer): logical;
  if Признак <> '':
    if АналитикаЗаписиИспользуется:
      Message('Нельзя изменять идентификатор признака, который используется, т.к. это приведет к его удалению и, следовательно, к ошибкам в ваших операциях!');
      return false;
    fi;
  fi;
  return true;
end;


Конец