БланкСШаблоном "Библиотека бухгалтерской области";
-- Описание общих процедур и функций для работы с бухгалтерскими документами
				 -- Многие М.М.     01.01.100- 29.05.98
				 -- Алексеев С.В.   30.05.98 - 17.08.98
				 -- Егоров М.О.     08.09.98 - 09.09.98
--CheckBox1:О;
--RadioButton1:О;
--RadioButton2:О;

НалПр:ц=2;  -- Процент налога с продаж
ММ:ц=МЕС(B.F-1); -- последний месяц периода
НачГод:ц=ГОД(B.S);   -- начало года
КонГод:ц=ГОД(B.F-1); -- конец года
Месяц1:с=Месяц(ММ-2); -- 1 месяц квартала
Месяц2:с=Месяц(ММ-1); -- 2 месяц квартала
Месяц3:с=Месяц(ММ);   -- 3 месяц квартала
Д1:Дата=ДАТ(01,ММ-2,КонГод);  -- дата начала 1 месяца квартала
Д2:Дата=ДАТ(01,ММ-1,КонГод);  -- дата начала 2 месяца квартала
Д3:Дата=ДАТ(01,ММ,КонГод);    -- дата начала 3 месяца квартала

Состояние:I=[0];
Проводить:L=ЕСЛИ(Состояние=1,False,True);
--------------------------------------------------------------------------------
-- Подстановки счетов и корреспонденций
--------------------------------------------------------------------------------

-- Вид разделителя рублей и копеек (для НДС) #Р2
Р2:С=["-"]; -- Вид разделителя рублей и копеек (для НДС)
--  РАЗРЕШЕННАЯ КОРРЕСПОНДЕНЦИЯ СЧЕТОВ ДЛЯ БЛАНКОВ (дополнительную
--  корреспонденцию счетов можно ставить как в основной строке, так и в дополнительной)

КМСч51к:С="04!|50!!|51!|52!|55!"+
	  "|57!|58!|60!|62!|66!|67!|68!|69!|70!|71!|73!|75!"+
	  "|76!|79!|80!|81!|84!|96!|99!";
КМСч51д:С="06!|09!|44!|45!|46!|47!|48!|50!|52!|55!|57!|58!|60!|61!|62!|63!"+
	  "|64!|65!|67!|68!|69!|71!|73!|75!|76!|78!|79!|80!|83!|88!|90!|92!"+
	  "|93!|94!|95!|96!";

БМСч51к:С="15*|16*|17*|18*|19*";
БМСч51д:С="1?*";
МСч51кА:С;
МСч51дА:С;
КМСч50д:С="51!|50!|52!|55!|57!|60!|62!|66!|67!|"+
	  "71!|73!|75!|76!|79!|80!|86!|90!|91!|98!|99!";
БМСч50д:С="09*|10*|15*|16*|17*|18*|19*";

МСч50дА:С;
КМСч50к:С="51!|50!|52!|57!|58!|55!|60!|62!|66!|68!|69!|70!|71!|73!|"+
	  "75!|76!|79!|80!|81!|94!|99!";
БМСч50к:С="15*|16*|17*|18*|19*";
МСч50кА:С;
КМСч71к:С="07!|08!|10!|11!|15!|20!|23!|25!|26!|28!|29!|41!|44!|45!|"+
	  "50!|51!|52!|55!|60!|70!|73!|76!|79!|91!|94!|97!|99!";
БМСч71к:С="15*|16*|17*|18*|19*";
МСч71кА:С;
КСчЗтр:С="08!|2*|44!|69!|76!|79!|84!|91!|97!|96!|99!";
БСчЗтр:С="20*|21*|08";
СчЗтрА:С;
КТМЦ:С="10!|41!";
БТМЦ:С="06*|08*";
ТМЦА:С;

--МС51к:С=IF(МСч51к="","04!|06!|08!|15!|19!|20!|25!|26!|28!|29!|31!|43!|44!|"+
--		       "50!|52!|55!|56!|57!|58!|60!|61!|62!|63!|64!|65!|67!|"+
--		       "68!|69!|70!|71!|73!|75!|76!|78!|79!|80!|81!|87!|88!|"+
--		       "89!|90!|92!|93!|94!|95!|96!|97!",МСч51к)+МСч51кА;
--МС50д:С=IF(МСч50д="","09!|44!|45!|46!|47!|48!|51!|52!|55!|57!|60!|61!|62!|"+
--		       "63!|64!|70!|71!|73!|75!|76!|78!|79!|80!|83!|90!|92!|"+
--		       "93!|94!|95!|96!",МСч50д)+МСч50дА;
--МС50к:С=IF(МСч50к="","04!|06!|07!|10!|11!|12!|15!|19!|20!|23!|25!|26!|29!|"+
--		       "31!|41!|43!|44!|51!|52!|56!|57!|58!|60!|61!|62!|64!|"+
--		       "67!|68!|69!|70!|71!|73!|75!|76!|78!|79!|80!|83!|84!|"+
--		       "87!|88!|90!|93!|96!|97!",МСч50к)+МСч50кА;
--МС71к:С=IF(МСч71к="","07!|08!|10!|11!|12!|15!|20!|25!|26!|28!|29!|31!|41!|"+
--		       "43!|44!|45!|50!|51!|52!|55!|56!|70!|73!|76!|79!|80!|"+
--		       "84!|96!",МСч71к)+МСч71кА;
--СЗтр:С=IF(СчЗтр="","2*|44!|96!",СчЗтр)+СчЗтрА;
--ТМЦС:С=IF(ТМЦ="","10!|41!",ТМЦ)+ТМЦА;
Accur:Integer=2; -- Точность бух. расчетов

-- КОРРЕСПОНДЕНЦИЯ СЧЕТОВ ДЛЯ ВЫБОРА АНАЛИТИКИ ПРИ ВСТАВКЕ В ЖУРНАЛ ИЗ БЛАНКОВ

КСчЗарпл:С=	"70";
КСчЗарплОтп:С=	"70.Отп";
КСчЗарплПр:С=	"70.Пр";
КАлименты:С=	"76.Ал";
КОбраз:С=	"682.0Обр";
КПодоходн:С=	"68.Подн";
КСчРСчет:С=	"51!";
КСчКасса:С=	"50!";
КСчОС:С=	"01!|02!|03!|08.4";
КСчОСИз:С=	"02!";
КСчНА:С=	"04!|05!|08.5";
КСчНАИЗ:С=	"05!";
КСчТов:С=	"41!|45!";
КСчМат:С=	"10!|15!|16!";
КСчМБП:С=	"10!";
КСчИзд:С=	"43!";
КСчЗатрат:С=	"20!|23!|25!|26!|28!|29!|44!|90!|91!|97!";
КСчПоставщика:С="60!|60Д!|71!|76!";
КСчПокупателя:С="60!|62!|62Д!|76!";
КМаскаСчетовК:С="60!|71!|76!";	      -- Поставщики
КМаскаСчетовП:С="62!|71!|76!";	      -- Покупатели
КСчУчредит:С=	"75!";
КСчФиз:С=	"71!";
КСчДиК:С=	"76Д!|76!";
КСчН:С= 	"68!|69!";
Жилсоц:С=	"68.ЖИЛ";

БСчЗарпл:С=	"180";
БСчЗарплОтп:С=	"180.Отп";
БСчЗарплПр:С=	"180.Пр";
БАлименты:С=	"187";
БПодоходн:С=	"2173.подн0";
БОбраз:С=	"2173.0Образ";
БСчРСчет:С=	"100*";
БСчКасса:С=	"120";
БСчОС:С=	"01*|02*|25*";
БСчОСИз:С=	"02*";
БСчНА:С=	"01*|02*|25*";
БСчНАИЗ:С=	"02*";
БСчТов:С=	"08*";
БСчМат:С=	"060*";
БСчМБП:С=	"07*|26*";
БСчИзд:С=	"03*";
БСчЗатрат:С=	"20*|21*|08*";
БСчПоставщика:С="15!";
БСчПокупателя:С="15!";
БМаскаСчетовК :С="15*!|16*!|17*!";	  -- Поставщики
БМаскаСчетовП :С="15*!|16*!|17*!";	  -- Покупатели
БСчУчредит:С=	"75!";
БСчФиз:С=	"18*|16*";
БСчДиК:С=	"157!|178!";
БСчН:С= 	"159!|171!|173!|198!";

СчЗарпл:С=     [IF(Проводить,КСчЗарпл,	   БСчЗарпл)];
СчЗарплОтп:С=  [IF(Проводить,КСчЗарплОтп,  БСчЗарплОтп)];
СчЗарплПр:С=   [IF(Проводить,КСчЗарплПр,   БСчЗарплПр)];
Алименты:С=    [IF(Проводить,КАлименты,    БАлименты)];
Образ:С=       [IF(Проводить,КОбраз,	   БОбраз)];
ПодохНал:С=    [IF(Проводить,КПодоходн,    БПодоходн)];
СчРСчет:С=     [IF(Проводить,КСчРСчет,	   БСчРСчет)];
СчКасса:С=     [IF(Проводить,КСчКасса,	   БСчКасса)];
СчОС:С=        [IF(Проводить,КСчОС,	   БСчОС)];
СчОСИз:С=      [IF(Проводить,КСчОСИз,	   БСчОСИз)];
СчНА:С=        [IF(Проводить,КСчНА,	   БСчНА)];
СчНАИЗ:С=      [IF(Проводить,КСчНАИЗ,	   БСчНАИЗ)];
СчТов:С=       [IF(Проводить,КСчТов,	   БСчТов)];
СчМат:С=       [IF(Проводить,КСчМат,	   БСчМат)];
СчМБП:С=       [IF(Проводить,КСчМБП,	   БСчМБП)];
СчИзд:С=       [IF(Проводить,КСчИзд,	   БСчИзд)];
СчЗатрат:С=    [IF(Проводить,КСчЗатрат,    БСчЗатрат)];
СчПоставщика:С=[IF(Проводить,КСчПоставщика,БСчПоставщика)];
СчПокупателя:С=[IF(Проводить,КСчПокупателя,БСчПокупателя)];
СчУчредит:С=   [IF(Проводить,КСчУчредит,   БСчУчредит)];
СчФиз:С=       [IF(Проводить,КСчФиз,	   БСчФиз)];
СчДиК:С=       [IF(Проводить,КСчДиК,	   БСчДиК)];
СчН:С=	       [IF(Проводить,КСчН,	   БСчН)];
МСч51к:С=	IF(Проводить,КМСч51к,	   БМСч51к);
МСч51д:С=	IF(Проводить,КМСч51д,	   БМСч51д);
МСч50д:С=	IF(Проводить,КМСч50д,	   БМСч50д);
МСч50к:С=	IF(Проводить,КМСч50к,	   БМСч50к);
МСч71к:С=	IF(Проводить,КМСч71к,	   БМСч71к);
СчЗтр:С=	IF(Проводить,КСчЗтр,	   БСчЗтр);
ТМЦ:С=		IF(Проводить,КТМЦ,	   БТМЦ);
МаскаСчетовК:С=IF(Проводить,КМаскаСчетовК,БМаскаСчетовК);	 -- Поставщики
МаскаСчетовП:С=IF(Проводить,КМаскаСчетовП,БМаскаСчетовП);	 -- Покупатели
МС51к:С=МСч51к+МСч51кА;
МС51д:С=МСч51д+МСч51дА;
МС50д:С=МСч50д+МСч50дА;
МС50к:С=МСч50к+МСч50кА;
МС71к:С=МСч71к+МСч71кА;
СЗтр:С=СчЗтр+СчЗтрА;
ТМЦС:С=ТМЦ+ТМЦА;

СчетЗарпл:С=	  СчЗарпл;
СчетЗарплОтп:С=   СчЗарплОтп;
СчетЗарплПр:С=	  СчЗарплПр;
СчетРСчет:С=	  СчРСчет;
СчетКасса:С=	  СчКасса;
СчетОС:С=	  СчОС;
СчетОСИз:С=	  СчОСИз;
СчетНА:С=	  СчНА;
СчетНАИЗ:С=	  СчНАИЗ;
СчетТов:С=	  СчТов;
СчетМат:С=	  СчМат;
СчетМБП:С=	  СчМБП;
СчетИзд:С=	  СчИзд;
СчетЗатрат:С=	  СчЗатрат;
СчетПоставщика:С= СчПоставщика;
СчетПокупателя:С= СчПокупателя;
СчетУчредит:С=	  СчУчредит;
СчетФиз:С=	  СчФиз;
СчетДиК:С=	  СчДиК;
СчетН:С=	  СчН;
МСчетК:С=МаскаСчетовК;	      -- Поставщики
МСчетП:С=МаскаСчетовП;	      -- Покупатели


--СчетЗарпл:С=	   IF(СчЗарпл="","00"СчЗарпл,СчЗарпл);
--СчетЗарплОтп:С=  IF(СчЗарпл="","70.Отп",СчЗарплОтп);
--СчетЗарплПр:С=   IF(СчЗарпл="","70.Пр",СчЗарпл);
--СчетРСчет:С=	   IF(СчРСчет="","51!",СчРСчет);
--СчетКасса:С=	   IF(СчКасса="","50!",СчКасса);
--СчетОС:С=	   IF(СчОС="","01!|02!|03!|08.4!",СчОС);
--СчетОСИз:С=	   IF(СчОСИз="","02!",СчОСИз);
--СчетНА:С=	   IF(СчНА="","04!|05!|08.5!",СчНА);
--СчетНАИЗ:С=	   IF(СчНАИЗ="","05!",СчНАИЗ);
--СчетТов:С=	   IF(СчТов="","41!",СчТов);
--СчетМат:С=	   IF(СчМат="","10!|15!|16!",СчМат);
--СчетМБП:С=	   IF(СчМБП="","12!|13!",СчМБП);
--СчетИзд:С=	   IF(СчИзд="","40!",СчИзд);
--СчетЗатрат:С=    IF(СчЗатрат="","20!|25!|26!|28!|29!|31!|43!|44!",СчЗатрат);
--СчетПоставщика:С=IF(СчПоставщика="","60!|60Д!|61!|61Д!",СчПоставщика);
--СчетПокупателя:С=IF(СчПокупателя="","62!|62Д!|64!",СчПокупателя);
--СчетУчредит:С=   IF(СчУчредит="","75!",СчУчредит);
--СчетФиз:С=	   IF(СчФиз="","70!|71!",СчФиз);
--СчетДиК:С=	   IF(СчДиК="","76Д!|76!",СчДиК);
--СчетН:С=	   IF(СчН="","67!|67!|68!|69!",СчН);

ЗарплА:С=["|Ф.*"];
РСчетА:С;
КассаА:С;
ОС:С=	 ["|ОС.*"];
НА:С=	 ["|НА.*"];
Тов:С=	 ["|ТМЦ.*"];
Мат:С=	 ["|ТМЦ.*"];
МБП:С=	 ["|ТМЦ.*"];
Изд:С=	 ["|ТМЦ.*"];
ВНЗ:С=	 ["|ВНЗ.*"];
ПОСТ:С=  ["|К.*"];
ПОК:С=	 ["|К.*"];
УЧР:С=	 ["|К.*"];
Ф:С=	 ["|Ф.*"];
ДИК:С=	 ["|К.*"];
НБ:С=	 ["|НБ.*"];

Стр1:С= '-'+СчЗарпл+'/';
Стр2:С= '-'+СчРСчет+'/';
Стр3:С= '+'+СчКасса+'/';
Стр4:С= '-'+СчКасса+'/';
Стр5:С= '-'+СчФиз+'/';


Func МаскаАнаП (St:S):S;
  Var Str:S;
  Var Result:S;
   Result = '';
   Str="*"+SubStr(St,1,2)+"*";

   If Соотв (СчетПоставщика,Str) : Result = Result + ПОСТ;   Fi;
   If Соотв (СчетОС	   ,Str) : Result = Result + ОС;     Fi;
   If Соотв (СчетНА	   ,Str) : Result = Result + НА;     Fi;
   If Соотв (СчетТов	   ,Str) : Result = Result + Тов;    Fi;
   If Соотв (СчетМат	   ,Str) : Result = Result + Мат;    Fi;
   If Соотв (СчетМБП	   ,Str) : Result = Result + МБП;    Fi;
   If Соотв (СчетИзд	   ,Str) : Result = Result + Изд;    Fi;
   If Соотв (СчетЗатрат    ,Str) : Result = Result + ВНЗ;    Fi;
   If Соотв (СчетПокупателя,Str) : Result = Result + ПОК;    Fi;
   If Соотв (СчетУчредит   ,Str) : Result = Result + УЧР;    Fi;
   If Соотв (СчетФиз	   ,Str) : Result = Result + Ф;      Fi;
   If Соотв (СчетДиК	   ,Str) : Result = Result + ДИК;    Fi;
   If Соотв (СчетН	   ,Str) : Result = Result + НБ;     Fi;
   If Result='' : ^"*"; Fi;
   Result = SubStr(Result,2,Length(Result)-1);
   ^Result;
Cnuf;
-------------------------------------------------------------------------------

  func ПОДОХОДН98(Сум:Ч):Ч;
	 Если Сегодня < 1.1.1998 :
		^ОКР(ЕСЛИ(Сум<=      0 :      0.00		    |
			  Сум<12000000 :Сум  *0.12		    |
			  Сум<24000000 :1440000+(Сум-12000000)*0.20 |
			  Сум<36000000 :3840000+(Сум-24000000)*0.25 |
			  Сум<48000000 :6840000+(Сум-36000000)*0.30 ,
				       10440000+(Сум-48000000)*0.35 ));

	  | True :

		 ^ОКР(ЕСЛИ(Сум<=   0 :	    0.00	      |
			   Сум<20000 :Сум  *0.12	      |
			   Сум<40000 :2400+(Сум-20000)*0.15   |
			   Сум<60000 :5400+(Сум-40000)*0.2    |
			   Сум<80000 :9400+(Сум-60000)*0.25   |
			   Сум<100000 :14400+(Сум-80000) *0.30,
				       20400+(Сум-100000)*0.35),2);
	   Илсе;

   end;


  func ПодоходНФед(Сум :Numeric) :Numeric;
    ^ОКР(ЕСЛИ(Сум>0,3%Сум,0));
  end; -- ПодоходН --

  func ПодоходНТер(Сум :Numeric) :Numeric;
    ^ОКР(ЕСЛИ(Сум<=   0 :      0.00	  |
      Сум< 30000 :	 Сум	    *0.09 |
      Сум< 60000 : 2700+(Сум- 30000)*0.12 |
      Сум< 90000 : 6300+(Сум- 60000)*0.17 |
      Сум<150000 :11400+(Сум- 90000)*0.22 |
      Сум<300000 :24600+(Сум-150000)*0.32 ,
		  72600+(Сум-300000)*0.42),2);
  end; -- ПодоходН --

  func ПодоходН2000(Сум :Numeric) :Numeric;
    ^ОКР(ЕСЛИ(Сум<=   0 :      0.00	  |
      Сум< 50000 :	 Сум	    *0.12 |
      Сум<150000 : 6000+(Сум- 50000)*0.20,
		  26000+(Сум-150000)*0.30),2);
  end; -- ПодоходН --

  func ПодоходН2001(Сум :Numeric) :Numeric;
    ^if(Сум<=0, 0.00, Сум*0.13);
  end; -- ПодоходН --

  func ПодоходН(Сум :Numeric) :Numeric;
    ^(ПодоходНФед(Сум)+ПодоходНТер(Сум));
  end; -- ПодоходН --

  func КоэфЛьгот (Сум :Numeric) :Integer;
    ^ЕСЛИ( Сум<=0  :	  2  |
      Сум<=10000   :	  2  |
      Сум<=30000   :	  1 ,0);
  end; -- КоэфЛьгот --

  func КоэфЛьгот2000 (Сум :Numeric) :Integer;
    ^ЕСЛИ( Сум<=0  :	  2  |
      Сум<=15000   :	  2  |
      Сум<=50000   :	  1 ,0);
  end; -- КоэфЛьгот --

  Func КоэфЛьгот2001 (Сум :Numeric) :Integer;
    ^If(Сум<=20000: 1, 0);
  end; -- КоэфЛьгот 2001--

  Func КоэфЛьгот2005 (Сум :Numeric) :Integer;
    ^If(Сум<=40000: 1, 0);
  end; -- КоэфЛьгот 2005--


  Func КоэфЛьготДети (Сум :Numeric;Дт:Date) :Integer;
    ^If(Сум<=Com_Var("МахДоходДети",Дт): 1, 0);
  end; -- КоэфЛьгот на детей 2001- 2006 и далее-

  Func КоэфЛьгот2001Н (Сум :Numeric; Льготы :Numeric;Дт:Date):Numeric;
 --   ^If((Льготы=400 And Сум<=20000) Or Льготы=500 Or Льготы=3000: Льготы, 0);
    ^If((Льготы=400 And Сум<=Com_Var("МахДоходСотр",Дт)) Or Льготы=500 Or Льготы=3000: Льготы, 0);

  end; -- КоэфЛьгот 2001Н--

  Func ДопСумПО(Шкала :Integer):Numeric;
    ^If(Шкала=1: 0 |Шкала=2: 28000 |Шкала=3: 59600 |Шкала=4: 83300);
  Cnuf;

  Func ДопСумПС(Шкала :Integer):Numeric;
    ^If(Шкала=1: 0 |Шкала=2: 4000 |Шкала=3: 8400 |Шкала=4: 11700);
  Cnuf;

  Func ДопСумФед(Шкала :Integer):Numeric;
    ^If(Шкала=1: 0 |Шкала=2: 200 |Шкала=3: 400 |Шкала=4: 700);
  Cnuf;

  Func ДопСумТер(Шкала :Integer):Numeric;
    ^If(Шкала=1: 0 |Шкала=2: 3400 |Шкала=3: 7200 |Шкала=4: 9900);
  Cnuf;

 func ПризПериода (М :Integer) :String;
   ^IF(М=1 :"1.01" |
       М=2 :"1.02"  |
       М=3 :"1.03"  |
       М=4 :"2.04"  |
       М=5 :"2.05"  |
       М=6 :"2.06"  |
       М=7 :"3.07"  |
       М=8 :"3.08"  |
       М=9 :"3.09"  |
       М=10:"4.10"  |
       М=11:"4.11"  |
       М=12:"4.12","");
  end; -- ПризПериода --

--- Функции для выбора из стандартных справочников
--- в дальнейшем переделаем на вызов картотеки

МассивСтрок[]:String;
	КодДокумент[] : String;

func КодДокумента : String;
     Var Iter:Integer;

	КодДокумент[1]="01 - Паспорт гражданина СССР";
	КодДокумент[2]="02 - Загранпаспорт гражданина СССР";
	КодДокумент[3]="03 - Свидетельство о рождении";
	КодДокумент[4]="04 - Удостоверение личности офицера";
	КодДокумент[5]="05 - Справка об освобождении";
	КодДокумент[6]="06 - Паспорт Минморфлота";
	КодДокумент[7]="07 - Военный билет";
	КодДокумент[8]="09 - Дипломатический паспорт гражданина РФ";
	КодДокумент[9]="10 - Иностранный паспорт";
	КодДокумент[10]="11 - Свидетельство о регистрации эмигранта";
	КодДокумент[11]="12 - Вид на эительство";
	КодДокумент[12]="13 - Удостоверение беженца в РФ";
	КодДокумент[13]="14 - Временное удостоверение гражданина";
	КодДокумент[14]="21 - Паспорт гражданина РФ";
	КодДокумент[15]="22 - Загранпаспорт гражданина РФ";
	КодДокумент[16]="26 - Паспорт моряка";
	КодДокумент[17]="27 - Военный билет офицера запаса";
	КодДокумент[18]="91 - Иные документы, выдаваемые органами МВД";
	Iter = Альтернатива ("Виды документов",КодДокумент,25);
	^Substr(КодДокумент[Iter],1,2);

End; -- КодДокумента

	КодДоход[] : String;

Func КодДохода : String;
     Var Iter:Integer;

	КодДоход[1]="0200 - Заработная плата, вознаграждения по основному месту работы";
	КодДоход[2]="0300 - Доходы от выполнения работ по совместительству";
	КодДоход[3]="0410 - Доходы, полученные от приобретения товаров, работ по ценам, ниже рыночных";
	КодДоход[4]="0420 - Материальная выгода по заемным средствам";
	КодДоход[5]="0500 - Дивиденды и иные доходы от прироста капитала";
	КодДоход[6]="1010 - Дивиденды, определяемые с учетом ст.214 НК РФ";
	КодДоход[7]="1100 - Сумма процентов по облигациям и ценным бумагам,включая векселя, кроме суммы процентов по гос. и муниципал. облигациям и ценным бумагам,освобождаемой от налогооблажения";
	КодДоход[8]="1200 - Страховые выплаты при наступлении страхового случая,кроме сумм страховых выплат,не подлежащих налогооблажению,за исключением суммы разницы между страховой выплатой...";
	КодДоход[9]="1210 - Сумма разницы между суммой страховой выплаты по договору добровольного страхования жизни,заключенному на срок менее 5 лет, и суммой внесенных физическими лицами страховых взносов";
	КодДоход[10]="1220 - Денежная (выкупная)сумма выплаты при досрочном расторжении договора добровольного долгосрочного страхования жизни";
	КодДоход[11]="1230 - Сумма налогооблагаемого дохода в виде страховых (пенсионных) взносов,внесенных за физических лиц из средств организаций или иных работодателей...";
	КодДоход[12]="1300 - Доходы,полученные налогоплательщиком от использования прав на объекты  интеллектуальной собственности,кроме авторских вознаграждений";
	КодДоход[13]="1400 - Доходы, полученные от представления в аренду и иного использования имущества налогоплательщика,кроме аналогичных доходов от сдачи в аренду любых транспортных средств,средств связи, компьютерных сетей";
	КодДоход[14]="1510 - Доходы,полученные налогоплательщиком от реализации недвижимого имущества";
	КодДоход[15]="1520 - Доходы,полученные налогоплательщиком от реализации иного имущества (кроме ценных бумаг)";
	КодДоход[16]="1530 - Доходы,полученные налогоплательщиком от реализации  акций или иных ценных бумаг";
	КодДоход[17]="1540 - Доходы,полученные налогоплательщиком от реализации долей участия в уставном капитале организаций";
	КодДоход[18]="2000 - Вознаграждение ( зарплата и др.выплаты во исполнение трудового договора,денежное содержание и иные налогобл. выплаты военнослужащим и т.п.) за выполнение труд. и иных обязанностей";
	КодДоход[19]="2100 - Доходы от выполнения работ по договорам гражд.-прав. хар-ра";
	КодДоход[20]="2200 - Доходы в виде курсовой разницы от операций с валютой";
	КодДоход[21]="2201 - Сумма авторских вознаграждений за создание лит.произведений, в том числе для театра,кино,эстрады и цирка";
	КодДоход[22]="2202 - Сумма авторских вознаграждений за создание худож.-графических произведений,фоторабот для печати,произведений архитектуры и дизайна";
	КодДоход[23]="2203 - Сумма авторских вознаграждений за создание  произведений скульптуры,монумент.-декор.живописи,декор.-прикладного и оформительского искусства,...";
	КодДоход[24]="2204 - Сумма авторских вознаграждений за создание аудиовизуальных произведений (видео-,теле- и кинофильмов)";
	КодДоход[25]="2205 - Сумма авторских вознаграждений за создание музыкальных произведений: муз.-сценических (опер,балетов,муз.комедий), симфонических,хоровых,камерных,для духового оркестра,оригинал.";
	КодДоход[26]="2206 - Сумма авторских вознаграждений за создание других музыкальных произведений,в том числе подготовленных к опубликованию";
	КодДоход[27]="2207 - Сумма авторских вознаграждений за исполнение произведений литературы и искусства";
	КодДоход[28]="2208 - Сумма авторских вознаграждений за создание научных трудов и разработок";
	КодДоход[29]="2209 - Сумма авторских вознаграждений за открытия,изобретения, промышленные образцы";
	КодДоход[30]="2299 - Суммы иных авторских вознаграждений";
	КодДоход[31]="2300 - Пенсии,пособия,стипендии и иные аналогичные выплаты,кроме сумм государственных пособий,пенсий,стипендий,выплат по договорам пенсионного обеспечения";
	КодДоход[32]="2400 - Суммы иных авторских вознаграждений";
	КодДоход[33]="2510 - Суммы иных авторских вознаграждений";
	КодДоход[34]="2520 - Стоимость полученных налогоплательщиком товаров,выполненных (оказанных) в интересах налогоплательщика работ (услуг) на безвозмездной основе";
	КодДоход[35]="2530 - Суммы оплаты труда в натуральной форме в виде товаров (работ, услуг)";
	КодДоход[36]="2610 - Сумма материальной выгоды,полученная от экономии на процентах за пользование налогоплательщиком заемными средствами, определяемая в соответствии с п.2 ст.212 НК РФ";
	КодДоход[37]="2630 - Сумма материальной выгоды,полученной от приобретения товаров (работ,услуг) у физ.лиц в соответствии с гражданско-правовым договором, а также у орг. и инд.предпринимателей";
	КодДоход[38]="2640 - Сумма материальной выгоды,полученной налогоплательщиком от приобретения ценных бумаг";
	КодДоход[39]="2710 - Суммы материальной помощи,оказываемой налогоплательщикам в иных случаях,не подпадающих под действие п.8 и п.28 ст.217 НК, подлежащие налогообложению";
	КодДоход[40]="2720 - Стоимость подарков,полученных от организаций или индивидуальных предпринимателей,и не подлежащих обложению налогом на наследование или дарение";
	КодДоход[41]="2730 - Стоимость призов в денежной и натуральных формах,полученных на конкурсах и соревнованиях согласно решениям Правительства РФ, органов гос.власти и местного самоуправления";
	КодДоход[42]="2740 - Стоимость выиграшей и призов,получаемых в проводимых конкурсах, играх и других мероприятиях в целях рекламы товаров (работ,услуг)";
	КодДоход[43]="2750 - Стоимость призов в денежной и натуральных формах,полученных на конкурсах и соревнованиях,проводимых не в соответствии решениям Правительства РФ, органов гос.власти и местного самоуправления";
	КодДоход[44]="2760 - Суммы материальной помощи,оказываемой работодателями своим работникам,а также бывшим своим работникам ,уволившимся в связи с выходом на пенсию по инвалидности или по возрасту";
	КодДоход[45]="2770 - Суммы возмещения (оплаты) работодателями своим работникам,их супругам,родителям и детям,бывшим своим работникам (пенсионерам по возр.),а также инвалидам стоимости приобретенных ими (для них) медикаментов";
	КодДоход[46]="2780 - Суммы возмещения (оплаты) стоимости приобретенных налогоплательщиком (для налогоплательщика) медикаментов,назначенных им лечащим врачем в иных случаях, не подпадающих под действие  п.28 ст.217 НК РФ";
	КодДоход[47]="2800 - Суммы, полученные в погашение вексельных обязательств";
	КодДоход[48]="2900 - Доходы в виде курсовой разницы от операций с валютой";
	КодДоход[49]="3010 - Стоимость выиграшей,выплачиваемых организаторами лотерей, тотализаторов и других,основанных на риске игр (в том числе с использованием игровых автоматов)";
	КодДоход[50]="3020 - Сумма процентного дохода по вкладам в банках в части превышения суммы,освобождаемой от налогооблажения в соответствии с п.27 ст.217 НК РФ";
	КодДоход[51]="3100 - Иные доходы,включаемые в налоговую источником выплаты (до 01.01.2000г.-материальная помощь)";
	КодДоход[52]="3200 - Стоимость подарков";
	КодДоход[53]="3300 - Стоимость призов";
	КодДоход[54]="3400 - Доходы, полученные от продажи квартир, жилых домов, дач";
	КодДоход[55]="3500 - Доходы, полученные от продажи другого имущества";
	КодДоход[56]="3510 - Доходы от продажи ценных бумаг";
	КодДоход[57]="3520 - Доходы, полученыые в погашение вексельных обязательств";
	КодДоход[58]="3600 - Доходы, полученные в натуральной форме";
	КодДоход[59]="3701 - Доходы учащихся дневной формы обучения";
	КодДоход[60]="3799 - Доходы, частично или полностью не включаемые в совокупный г.д. в соответствии с законодательством РФ";
	КодДоход[61]="4000 - Доходы от предпринимательской деятельности";
	КодДоход[62]="4600 - Доходы частных нотариусов";
	КодДоход[63]="4701 - Доходы от сдачи в аренду помещений";
	КодДоход[64]="4702 - Доходы от сдачи в аренду имущества";
	КодДоход[65]="4703 - Доходы от сдачи в аренду земли";
	КодДоход[66]="4800 - Иные доходы, полученные в нарушение порядка,установленного пунктами 3,8-13,18,26,30,31 ст.217 НК РФ и прочие налогооблагаемые доходы";
	КодДоход[67]="4900 - Доходы,по которым в соответствии с законодательством субъекта РФ предоставлена налоговая льгота";
	КодДоход[68]="5001 - Авторские вознаграждения за создание литературных произведений";
	КодДоход[69]="5002 - Авторские вознаграждения за создание художественно-графических произведений";
	КодДоход[70]="5003 - Авторские вознаграждения за создание скульптур, декоративно-прикладного искусства";
	КодДоход[71]="5004 - Авторские вознаграждения за создание аудиовизуальных произведений";
	КодДоход[72]="5005 - Авторские вознаграждения за создание музыкально-сценических произведений";
	КодДоход[73]="5006 - Авторские вознаграждения за создание других музыкальных произведений";
	КодДоход[73]="5007 - Авторские вознаграждения за создание произведений науки";
	КодДоход[74]="5008 - Авторские вознаграждения за открытия, изобретения, промышленные образцы";
	КодДоход[75]="5009 - Авторские вознаграждения за исполнение произведений литературы, искусства";
	КодДоход[76]="5099 - Другие авторские вознаграждения";
	КодДоход[77]="5100 - Иные доходы, полностью включаемые в совокупный годовой доход";
	КодДоход[78]="6001 - Сумма коэффициентов и надбавок за работу в районах Крайнего Севера";
	КодДоход[79]="6002 - Сумма материальной выгоды по вкладам";
	КодДоход[80]="6003 - Сумма материальной выгоды по страховым выплатам";
	Iter = Альтернатива ("Виды доходов",КодДоход,75);
	^Substr(КодДоход[Iter],1,4);

End; -- КодДохода

	КодСкидк[] : String;

Func КодСкидки : String;
     Var Iter:Integer;

	КодСкидк[1]="01 - Сумма скидки в пределах 10-ти кратной ММОТ";
	КодСкидк[2]="02 - Сумма скидки в пределах 12-ти кратной ММОТ";
	КодСкидк[3]="03 - Сумма скидки в пределах 50-ти кратной ММОТ";
	КодСкидк[4]="04 - Сумма скидки в пределах 1000-ти кратной ММОТ";
	КодСкидк[5]="05 - Сумма скидки в пределах 5000-ти кратной ММОТ";
	КодСкидк[6]="06 - Нормативная величина расходов";
	КодСкидк[7]="07 - Документально подтвержденные расходы";
	КодСкидк[8]="08 - Иные скидки, установленные законодательством РФ";
	КодСкидк[9]="401- В сумме фактически произведенных и документально подтвержденных  расходов,непосредственно связанных сизвлечением дохода,в отношении доходов от предпринимательской деятельности";
	КодСкидк[10]="402- В пределах норматива в отношении доходов от предпринимательской деятельности";
	КодСкидк[11]="403- В сумме фактически произведенных и документально подтвержденных расходов,непосредственно связанных с выполнением работ (оказанием услуг) по договорам гражданско-правового характера";
	КодСкидк[12]="404- В сумме фактически произведенных и документально подтвержденных расходов,связанных с получением авторских вознаграждений и вознагаждений за создание,...произведений науки,литературы...";
	КодСкидк[13]="405- В пределах норматива затрат в отношении авторских вознаграждений";
	КодСкидк[14]="501- Вычет из стоимости подарков,полученных от организаций и индивидуальных предпринимателей,не подлежащих обложению налогом на наследование или дарение";
	КодСкидк[15]="502- Вычет из стоимости призов в денежной и натуральной формах, полученных на конкурсах и соревнованиях,проводимых в соответствии с решениями Правительства РФ,...органов государственной власти или представи";
	КодСкидк[16]="503- Вычет из стоимости (суммы) материальной помощи,оказываемой работодателями своим работникам,а также бывшим своим работникам ,уволившимися в связи с выходом на пенсию по инвалидности или по возрасту";
	КодСкидк[17]="504- Вычет из суммы возмещения (оплаты) работодателями своим работникам,их супругам...,бывшим своим работникам(пенсионерам...) ,инвалидам стоимости приобретенных ими(для них) медикоментов";
	КодСкидк[18]="505- Вычет из стоимости любых выиграшей и призов,полученных на конкурсах,играх и других мероприятиях в целях рекламы товаров (работ,услуг)";
	КодСкидк[19]="601- Налоговые льготы,установленные законодательными актамисубъектов РФ до 01.01.2001г,в части сумм,зачисляемых в соответствии с законодательством РФ в их бюджеты";
	Iter = Альтернатива ("Виды скидок",КодСкидк,40);
	^Substr(КодСкидк[Iter],1,3);

End; -- КодСкидки

	КодВычет[] : String;

Func КодВычета : String;
     Var Iter:Integer;

	КодВычет[1]="10 - Отчисления в Пенсионный Фонд с совокупного дохода";
	КодВычет[2]="11 - Отчисления в ПФ с сумм коэффициентов и надбавок";
	КодВычет[3]="21 - Однократный размер ММОТ";
	КодВычет[4]="22 - Двухкратный размер ММОТ";
	КодВычет[5]="23 - Трехкратный размер ММОТ";
	КодВычет[6]="25 - Пятикратный размер ММОТ";
	КодВычет[7]="29 - Доход, облагаемый налогом по минимальной ставке";
	КодВычет[8]="30 - Расходы на содержание детей и иждивенцев в однократнов размере ММОТ";
	КодВычет[9]="31 - Расходы на содержание детей и иждивенцев в двухкратном размере ММОТ";
	КодВычет[10]="41 - Суммы, перечисленные на благотворительные цели";
	КодВычет[11]="42 - Суммы, направленные на  новое строительство жилых объектов";
	КодВычет[12]="44 - Суммы, направленные на противопожарное страхование";
	КодВычет[13]="45 - Расходы на содержание детей, иждивенцев и т.д. в двукратном размере ММОТ";
	КодВычет[14]="46 - Расходы на содержание детей, иждивенцев и т.д. в четырехкратном размере ММОТ";
	КодВычет[15]="47 - Суммы расходов по погашению кредитов и процентов, которые получены на строительство или приобретение жилых объектов";
	КодВычет[16]="99 - Прочие вычеты, установленные законодательством субъектов РФ";
	КодВычет[17]="101- 300р. на каждого ребенка,пп.4 п.1 ст.218 НК";
	КодВычет[18]="102- 600р. на ребенка вдове(вдовцу),одинокому родителю,опекуну,попечителю,пп.4 п.1 ст.218 НК";
	КодВычет[19]="103- 400р. на налогоплательщика,пп.3 п.1 ст.218 НК";
	КодВычет[20]="104- 500р. на налогоплательщика,пп.2 п.1ст.218 НК";
	КодВычет[21]="105- 3000р на налогоплательщика,пп.1 п.1. ст.2 НК";
	КодВычет[22]="201- В сумме доходов,перечисленных на благотворительные цели";
	КодВычет[23]="202- В сумме,уплаченной налогоплательщиком в налоговом периоде за свое обучение в образовательных учреждениях,но не более 25 000 руб.";
	КодВычет[24]="203- В сумме,уплаченной налогоплательщиком- родителем в налоговом периоде за обучение своих детей в возрасте до 24 лет,в размере фактически произведенных расходов,но не более 25000р. на каждого ребенка";
	КодВычет[25]="204- В сумме,уплаченной налогоплательщиком в налоговом периоде за услуги по лечению в мед.учреждениях РФ,предоставленные налогоплательщику,его супругу(ге), его родителям ,детям до 18 лет...,но не более 2500";
	КодВычет[26]="205- В сумме расходов,произведенных налогоплательщиком в налоговом периоде по дорогостоящим видам лечения (налогоплательщика, его супруга(ги),родителей,детей до 18 лет) в мед.учреждениях РФ.";
	КодВычет[27]="301- В суммах,полученных в налоговом периоде от продажи жилых домов,квартир,дач, садовых домиков или зем.участков, находившихся в собственности налогоплательщика менее 5 лет,в пределах 1 000 000руб.";
	КодВычет[28]="302- В суммах,фактически полученных в налоговом периоде от продажи жилых домов, квартир,дач,садовых домиков или земельных участков,находившихся в собственности налогоплательщика 5 лет и более";
	КодВычет[29]="303- В суммах,полученных в налоговом от продажи иного имущества,находившегося в собственности налогоплательщика менее 3 лет,включая продажу ценных бумаг,в пределах 125'000р.";
	КодВычет[30]="304- В суммах ,фактически полученных в налоговом периоде от продажи иного имущества,находившегося в собственности налогоплательщика 3 года и более,включая продажу ценных бумаг.";
	КодВычет[31]="305- В сумме фактически произведенных налогоплательщиком и документально подтвержденных расходов,от продажи жилых домов,квартир,дач,садовых домиков или земельных участков";
	КодВычет[32]="306- В сумме фактически произведенных налогоплательщиком и документально подтвержденных расходов,связанных с получением доходов от продажи иного имущества,кроме продажи ценных бумаг";
	КодВычет[33]="307- Совокупная сумма фактически произведенных налогоплательщиком и документально подтвержденных расходов,связанных с приобретением ценных бумаг";
	КодВычет[34]="308- Суммы,с которых был исчислен и уплачен налог при приобретении (получении) ценных бумаг в собственность на безвозмездной основе или с частичной оплатой";
	КодВычет[35]="311- В сумме,израсходованной налогоплательщиком на новое строительство либо приобретение на территории РФ жилого дома или квартиры,в размере фактически произведенных и документально подтвержденных расходов";
	КодВычет[36]="312- Сумма расходов по погашению процентов по ипотечным кредитам,полученным в банках РФ на новое строительство или приобретение жилого дома или квартиры";

	Iter = Альтернатива ("Виды вычетов",КодВычет,45);
	^Substr(КодВычет[Iter],1,3);

End; -- КодВычета

------------------------------------------------------------------------------------
------- Связь с правовыми базами данных

Proc Docs(Mess:С;FileName:С);

  If ПравоваяПоддержка(Mess,FileName): EXIT;
  | True : Message("Ни одна правовая база данных не найдена!");
  Fi;

End; -- Docs

CoordsTable[]	 :String;
FileNamesTable[] :String;
CoordsCount	 :Integer;
FileNamesCount	 :Integer;

tblCoords	 :Integer = 0;
tblFNames	 :Integer = 1;

Proc FillStrTable (tblType :Integer; MultiStr :String);
Var strPos, i :Integer;
Var tmpStr    :String;
  i = 0;
  while (Length(MultiStr) > 0) do
    strPos = Pos('|', MultiStr);
    if (strPos > 0) :
      tmpStr = SubStr(MultiStr, 1, strPos - 1);
      MultiStr = SubStr(MultiStr, strPos + 1, Length(MultiStr) - strPos);
    else
      tmpStr = MultiStr;
      MultiStr = '';
    fi;
    i = i + 1;
    if (tblType = tblCoords):
      CoordsTable[i] = tmpStr;
    else
      FileNamesTable[i] = tmpStr;
    fi;
  od;
  if (tblType = tblCoords) :
    CoordsCount = i;
  else
    FileNamesCount = i;
  fi;
End;--FillStrTable

Func SearchFName (aCol :Integer; aRow :Integer) : String;
Var i	     :Integer;
Var CoordStr :String;
Var Result   :String;
  if (CoordsCount <> FileNamesCount) :
    Trace('число имен файлов ' + Стр(FileNamesCount) + ' не равно числу клеток ' + Str(CoordsCount));
  fi;
  CoordStr = Str(aCol) + ',' + Str(aRow);
  Result = '';
  for i = 1..CoordsCount do
    if (CoordsTable[i] = CoordStr) :
      Result = FileNamesTable[i];
      break;
    fi;
  end;
  return Result;
End;--SearchFName

Proc DocsEx (Mess :String; Coords :String;  FNames :String; DefaultFName :String; Col :Integer; Row :Integer);
Var FName :String;
  if (LegalSupportType = ппРеферент) :
    FName = DefaultFName;
  else
    FillStrTable(tblCoords, Coords);
    FillStrTable(tblFNames, FNames);
    FName = SearchFName(Col, Row);
    if (FName = ''):
      FName = DefaultFName;
    fi;
  fi;
  Docs(Mess, FName);
End;--DocsEx

proc Вст(jj:s;dd:d;tt:s); -- вставка проводки в текстовый журнал (только для версии 6.5)
  Вставка(jj,dd,tt);
end;

proc ВстТабл(jj:s;dd:d;tt:s); -- вставка проводки в табличный журнал (только для версии 6.5)
  InsertToTableJur(jj,dd,tt,TRUE);
end;

----------------------------  Работа с признаками  -----------------------------------
func ДокументВПризнак(TabName: String; D: Record): String;
var Пр, Справочник, ПолеПризнака: String;
 Пр = ' ';
 if D <> nil :
   if Up(TabName) = 'ПОДРАЗДЕЛЕНИЯ' :
     ПолеПризнака = 'КОД';
     Справочник = 'П';
   elsif Up(TabName) = 'БАНК_СЧЕТА' :
     ПолеПризнака = 'РСчет';
     Справочник = 'Банк';
   else
     ПолеПризнака = 'Признак';
     if Up(TabName) = 'СДЕЛКА' :
       Справочник = 'Дог';
     elsif Up(TabName) = 'КарточкаПартии' :
       Справочник = 'Прт';
     elsif Up(TabName) = 'КонтрАгент' :
       Справочник = 'К';
     elsif Up(TabName) = 'ТМЦ' :
       Справочник = 'ТМЦ';
     elsif Up(TabName) = 'СОТРУДНИКИ' :
       Справочник = 'Ф';
     elsif Up(TabName) = 'ДВИЖЕНИЕРЕСУРСОВБУХ' :
       Справочник = 'ДвижБух';
     elsif Up(TabName) = 'ДВИЖЕНИЕРЕСУРСОВ' :
       Справочник = 'Движ';
     elsif Up(TabName) = 'НАШИ' :
       Справочник = 'Наши';
       TabName = 'КонтрАгент';
     end;
   end;
   Пр = CardFileRecSign(TabName, ПолеПризнака, Справочник, D);
--   if IsHierarchical(TabName) :
--     Пр = Пр + if(IsCardGroup(TabName, D), '.*', '');
--   end;
 end;
 return Пр;
end;
--
Массив[]  : String;
var МасСтрок[]: String;

func ВыбратьВалюту(OldVal: String): String;
  var Result, v, d :string;
  var i   :integer;

  ОчиститьПеременную(РАБ.БУХ.МасСтрок);
  для валюты  v = "*"  do
    d = Up(v);
    i = i+1;
    МасСтрок[i] = d;
  od;
  Result = МасСтрок[Альтернатива('Валюта документа:', МасСтрок)];
  Return if(Result <> '', Result, OldVal);
end;

---- Возвращает базовую валюту
--func БазоваяВалюта: String;	-- РАБ.ТСС.БИБ.ВАЛЮТЫ.БазоваяВалюта
--var Result, Curr: String;

--  for Currencies Curr = '*' do
--    Result = Curr;
--    break;
--  end;
--  Return Result;
--end;

-- Возвращает сумму прописью в зависимости от валюты
func СуммаПрописью(Сумма:Numeric; Валюта:string):string;
var result :string;
  if Сумма=0 :
    result = '';
  else
    if Валюта = 'РУБ' or Валюта = '':
       result = СЛО(Сумма);
    elsif Валюта = 'USD' :
       result = СЛО_(Сумма,'ДОЛ');
    elsif Валюта = 'DEM' :
       result = СЛО_(Сумма,'Дем');
    elsif Валюта = 'EUR' :
       result = СЛО_(Сумма,'Евр');
    fi;
  fi;
  ^result;
end;

-------------------------------------------------------------------------------------------
-- Эта функция пересчитывает денежную сумму Сумма1 указанную в валюте Вал1 в валюту Вал2 по 
-- курсу на указанную дату;
FUNC СумВалДат(Сумма1:Numeric;Вал1:String;Вал2:String;Дат:Date):Numeric; -- РАБ.ТСС.БИБ.ВАЛЮТЫ.СумВалДат
 Var Курс1к2:Numeric;
 IF Вал1 <> Вал2 И Сумма1 <> 0 :
   try
     Курс1к2 = if(Lo(Вал1) <> Lo(БазоваяВалюта), COM_VAR("Курс."+Вал1, Дат), 1) /
	       if(Lo(Вал2) <> Lo(БазоваяВалюта), COM_VAR("Курс."+Вал2, Дат), 1);
   except
     return 0;
   end;
   Return (Курс1к2 * Сумма1);
 ELSE
   Return Сумма1;
 FI;
END;
-------------------------------------------------------------------------------------------
-- Эта функция пересчитывает денежную сумму Сумма1 указанную в валюте Вал1 в валюту Вал2;
func СумВалДат2(Сумма1: Numeric; Вал1: String; Вал2: String; Дат: Date;
		СпецКурс1: Numeric; СпецКурс2: Numeric): Numeric;  -- РАБ.ТСС.БИБ.ВАЛЮТЫ.СумВалДат2
 Var Курс1, Курс2: Numeric;

 if Вал1 <> Вал2 И Сумма1 <> 0:
   Курс1 = СпецКурс1;
   if СпецКурс1=0:
     Курс1 = if(Lo(Вал1) <> Lo(БазоваяВалюта), COM_VAR("Курс."+Вал1, Дат), 1); --COM_VAR("Курс." + Вал1,Дат);
   end;
   Курс2 = СпецКурс2;
   if СпецКурс2=0:
     Курс2 = if(Lo(Вал2) <> Lo(БазоваяВалюта), COM_VAR("Курс."+Вал2, Дат), 1); --COM_VAR("Курс."+Вал2,Дат);
   end;
   Return (Курс1 * Сумма1) / Курс2;
 else
   Return Сумма1;
 end;
end;
-------------------------------------------------------------------------------------------
-- Эта функция пересчитывает денежную сумму Сумма1 указанную в валюте Вал1 в валюту Вал2 по 
-- текущему курсу;
FUNC СумВал(Сумма1: Numeric; Вал1: String; Вал2: String): Numeric; -- РАБ.ТСС.БИБ.ВАЛЮТЫ.СумВал
  Return СумВалДат(Сумма1, Вал1, Вал2, Сегодня);
END;
-------------------------------------------------------------------------------------------
-- Эта функция рассчитывает "официальный" курс одной валюты к другой. Курс - это число на
-- которое нужно домножить сумму в первой валюте, чтобы получить  сумму во второй
func Курс(Вал1: String; Вал2: String; Дат: Date): Numeric;
var КурсКБазовой1, КурсКБазовой2: Numeric;
  try
    КурсКБазовой1 = if(Lo(Вал1) <> Lo(БазоваяВалюта), COM_VAR("Курс."+Вал1, Дат), 1); --COM_VAR("Курс." + Вал1, Дат);
  except
  end;
  try
    КурсКБазовой2 = if(Lo(Вал2) <> Lo(БазоваяВалюта), COM_VAR("Курс."+Вал2, Дат), 1); --COM_VAR("Курс." + Вал2, Дат);
  except
  end;
  return if(КурсКБазовой2 <> 0, КурсКБазовой1/КурсКБазовой2, 0);
end;

Func UnitSigns (ar1:String;ar2:String) : String;
 If ar1 <> '' and ar2 <> '' :
    Return ar1+"|"+ar2;
 |  ar1 <> ''  :
    Return ar1;
 |  ar2 <> '' :
    Return ar2;
 Fi;
End;


Func ВыборПр (Маска : String; РазрешитьОтмену : Logical) : String;
Var Temp     : String;

Temp="";
If Not РазрешитьОтмену :
 While Temp = "" Do
  Temp = ВыборПризнака ( Маска );
  If Temp="" :
    If ВопрДаОтказ("Необходимо выбрать обязательный признак из группы "+БОЛ(Подстр(Маска,1,Длина(Маска)-2))+". Повторить ввод?")=КмдОтказ :
     Break;
    Fi;
  Fi;
 Od;
|      РазрешитьОтмену :
  Temp = ВыборПризнака ( Маска );
Fi;
^Temp;
End; -- ВыборПр


Func ВыборОбПр (СчетД: String; СчетК : String): String;
Var Дебет :    String;
Var Кредит:    String;
Var Маска :    String;
Var А	  :    Integer;
Var Б	  :    Integer;
Var Признаки : String;

 Дебет=МаскаПризнаков(СчетД,True);
 Кредит=МаскаПризнаков(СчетК,True);
 Маска=UnitSigns(Дебет,Кредит);
 Б=0;
-- ОчиститьПеременную(Массив);
 While Маска<>"" DO
  Б=Б+1;
  А=Поз("|",Маска);
  If А=0  : 
     Массив[Б]=Маска;
     Маска="";
  |  А<>0 :
     Массив[Б]=Подстр(Маска,1,А-1);
     Маска=Подстр(Маска,А+1,Длина(Маска)-А);
  Fi;
  For А=1..Б-1 Do
    If СООТВ(Массив[А],Массив[Б]) : Б=Б-1; Fi;
  Od;
 Od;
------------------
 If А > 0 :
    For А=1..Б Do
     Маска=ВыборПр(Массив[А],False);
     If Признаки =  "" : Признаки=Маска;
     |	Признаки <> "" : Признаки=Маска+" "+Признаки;
     Fi;
    Od;
 else
    Признаки = ВыборПр("*.*",True);
 Fi;
 Return Признаки;
End; -- ВыборОбПр

Func ВыборСвПр (СчетД: String; СчетК : String): String;
Var Дебет :    String;
Var Кредит:    String;
Var Маска :    String;
Var А	  :    Integer;
Var Б	  :    Integer;
Var Признаки : String;

 Дебет=МаскаПризнаков(СчетД,False);
 Кредит=МаскаПризнаков(СчетК,False);
 Маска=UnitSigns(Дебет,Кредит);
 Б=0;
-- ОчиститьПеременную(Массив);
 While Маска<>"" DO
  Б=Б+1;
  А=Поз("|",Маска);
  If А=0  : 
     Массив[Б]=Маска;
     Маска="";
  |  А<>0 :
     Массив[Б]=Подстр(Маска,1,А-1);
     Маска=Подстр(Маска,А+1,Длина(Маска)-А);
  Fi;
  For А=1..Б-1 Do
    If СООТВ(Массив[А],Массив[Б]) : Б=Б-1; Fi;
  Od;
 Od;
------------------
 If А > 0 :
    For А=1..Б Do
     Маска=ВыборПр(Массив[А],True);
     If Маска<>"" :
      If Признаки =  "" : Признаки=Маска;
      |  Признаки <> "" : Признаки=Маска+" "+Признаки;
      Fi;
     Fi;
    Od;
 else
    Признаки = ВыборПр("*.*",True);
 Fi;
 Return Признаки;
End; -- ВыборСвПр

Func ПроверкаОбПр (СчетД: String; СчетК : String; ВведПризн: String): Logical;
Var Дебет :    String;
Var Кредит:    String;
Var Маска :    String;
Var А	  :    Integer;
Var Б	  :    Integer;

 Дебет=МаскаПризнаков(СчетД,True);
 Кредит=МаскаПризнаков(СчетК,True);
 Маска=UnitSigns(Дебет,Кредит);
 Б=0;
-- ОчиститьПеременную(Массив);
 While Маска<>"" DO
  Б=Б+1;
  А=Поз("|",Маска);
  If А=0  : 
     Массив[Б]=Маска;
     Маска="";
  |  А<>0 :
     Массив[Б]=Подстр(Маска,1,А-1);
     Маска=Подстр(Маска,А+1,Длина(Маска)-А);
  Fi;
  For А=1..Б-1 Do
    If СООТВ(Массив[А],Массив[Б]) : Б=Б-1; Fi;
  Od;
 Od;
------------------
 For А=1..Б Do
  Маска = Подстр(Массив[А],1,Длина(Массив[А])-2);
  If Pos(Маска,ВведПризн) = 0 :
     Message("В наборе признаков отсутствует аналитика группы "+Маска);
     Return False;
  Fi;
 Od;
 Return True;
End; -- ПроверкаОбПр

  func TrimRight(s : String) :String;
  -- удаляет замыкающие пробелы из строки
  var a :String;
  var j :Integer;
    j = Length(s);
    a = Substr(s, j, 1);
    while a=' ' do
      j = j - 1;
      a = Substr(s, j, 1);
    od;
    Return(Substr(s, 1, j));
  end; -- TrimRight

func ПризнакИзСправочника (t :String; Pref :String) :STRING;
var n, i   :INTEGER;
var Result :String;
  n = Pos(Pref,t);
  If n > 0 :
     for i = n..Length(t) do
       if Substr(t,i,1) <> ' ':
	  Result = Result + Substr(t,i,1);
       else
	 return Result;
       fi;
     od;
     return Result;
  else
     return '';
  Fi;
end; -- ПризнакИзСправочника

Func ВыборСвПрSimple (СчетД: String; СчетК : String; ВведеноСтр : String): String;
Var Дебет :    String;
Var Кредит:    String;
Var Маска :    String;
Var МаскаВвед: String;
Var А,Б   :    Integer;
Var Уменьш:    Logical;
Var Признаки : String;

 Дебет=МаскаПризнаков(СчетД,True);
 Кредит=МаскаПризнаков(СчетК,True);
 Маска=UnitSigns(Дебет,Кредит);
 Дебет=МаскаПризнаков(СчетД,False);
 Кредит=МаскаПризнаков(СчетК,False);
 Маска=UnitSigns(Маска,Дебет);
 Маска=UnitSigns(Маска,Кредит);
 Б=0;
-- ОчиститьПеременную(Массив);
 While Маска<>"" DO
  Б=Б+1;
  А=Поз("|",Маска);
  If А=0  : 
     Массив[Б]=Маска;
     Маска="";
  |  А<>0 :
     Массив[Б]=Подстр(Маска,1,А-1);
     Маска=Подстр(Маска,А+1,Длина(Маска)-А);
  Fi;
  Уменьш = False;
  For А=1..Б-1 Do
    If СООТВ(Массив[А],Массив[Б]) :
       Б=Б-1;
       Уменьш = True;
    Fi;
  Od;
  МаскаВвед = Подстр(Массив[Б],1,Длина(Массив[Б])-1);
  If Pos(МаскаВвед,ВведеноСтр) > 0 :
     If not Уменьш :
	Б=Б-1;
     Fi;
  Fi;
 Od;
------------------
 If Б > 0 :
   Маска = "";
   For А=1..Б Do
     Маска= UnitSigns(Маска,Массив[А]);
   od;
   Признаки = ВыборПр(Маска,True);
 Fi;
 Return Признаки;
End; -- ВыборСвПр

Func ВыборСвПрСПроверкой (СчетД: String; СчетК : String; ВведеноСтр : String): String;
Var Признаки : String;
Var Введено  : String;
Var Result   : String;
 Введено  = ВведеноСтр;
 Признаки = ВыборСвПрSimple (СчетД,СчетК,Введено);

 While Признаки<>"" DO
     Result = Признаки+" "+Result;
     Введено= Признаки+" "+Введено;
     Признаки = ВыборСвПрSimple (СчетД,СчетК,Введено);
 od;
 Return TrimRight(Result);
End; -- ВыборСвПр

func ПроверкаПризнаков(Признаки:String):Logical;
var Пр:String;
var i:Integer;
  for i=1..Раб.Формат.Слов(Признаки,' ') do
    Пр=Раб.Формат.ВыделитьСлова(Признаки,i,1,' ');
      if Пр<>"":
	if Not ValidSign(Пр):
	  message('Признак "'+Пр+'" содержит ошибку в написании.');
	  ^false;
	fi;
      fi;
  end;
  ^true;
end;

func VerSQL:Logical;
var ver :String;
  ver = Версия;
  if (Поз('SQL', ver) > 0) :
    return true;
  elsif (Поз('Oracle', ver) > 0) :
    return true;
  elsif (Поз('Сетевая', ver) > 0) :
    return true;
  else
   return false;
  fi;
end;

Proc ЗначениеПоУмолчанию(Ob:S);
    ClearBlank("Раб.Бух",False);
Corp;

Proc ЗаписатьВDBT(Ob:S);
Var Fl:L;
    Fl=WriteVarInDBT("Раб_Бух.dbt",False);
    If Not Fl:
       Message("Попытка не удачна");
    Fi;
Corp;

Proc ВзятьИзDBT(Ob:S);
Var Fl:L;
  If ExistFile("Раб_Бух.dbt"):
    Fl=ReadVarFromDBT("Раб_Бух.dbt");
    If Not Fl:
       Message("Попытка не удачна");
    Fi;
  | True:
    Message("Сначала надо записать,и только потом можно считать!");
  Fi;
Corp;

-- Пересчитывает валютную сумму в рублевую по курсу на дату
func ПересчетВРуб(СуммаВВалюте:Numeric;Валюта:String;ДКурса:Date):Numeric;
var res:Numeric;
  if Up(Валюта)<>'РУБ' and Валюта<>'':
    res=СуммаВВалюте*Com_Var("Курс."+Валюта,ДКурса);
  else
    res=СуммаВВалюте;
  fi;
  ^res;
end;

-- Пересчитывает рублевую сумму в валютную по курсу на дату
func ПересчетВВалюту(СуммаВРублях:Numeric;Валюта:String;ДКурса:Date):Numeric;
var res:Numeric;
  if Up(Валюта)<>'РУБ' and Валюта<>'':
    res=СуммаВРублях/Com_Var("Курс."+Валюта,ДКурса);
  else
    res=СуммаВРублях;
  fi;
  ^res;
end;

--- Процедуры и переменные для сторнирования счетов-фактур.
--- Использовать процедуру "Сторнировать". Остальные вспомогательные

var Отгрузки[]	:Integer;    -- Номера отгрузок с одинаковыми кодами кода аванса
var КолОтгр	:Integer;    -- Счетчик массива отгрузок
var Авансы[]	:Integer;    -- Номера авансов с одинаковыми кодами
var КолАвансы	:Integer;    -- Счетчик авансов
var КолВст	:Integer;    -- Количество вставленных сторно в спец картотеку
var КолВстСФ	:Integer;    -- Количество вставленных сторно в с.ф. отгрузок

-- Насколько уменьшили суммы авансов в результате сторнирования
var РВсегоДок[] :Numeric;
var РСто1[]	:Numeric;
var РСто18[]	:Numeric;
var РСто2[]	:Numeric;
var РСум1[]	:Numeric;
var РСум18[]	:Numeric;
var РСум2[]	:Numeric;
var РСум3[]	:Numeric; -- По ставке 0 % (Если значение 0, то не облагается НДС)
var РНеобл[]	:Numeric; -- необлагаемая сумма
------

-- Строка со сторно для вставки в картотеку
var СВсегоДок	:Numeric;
var ССто1	:Numeric;
var ССто18	:Numeric;
var ССто2	:Numeric;
var ССум1	:Numeric;
var ССум18	:Numeric;
var ССум2	:Numeric;
var ССум3	:Numeric; -- По ставке 0 % (Если значение 0, то не облагается НДС)
var СНеобл	:Numeric; -- необлагаемая сумма
var НеОтображать:Logical; -- Не отображать в книге продаж (для	сторнировании на всю сумму аванса)
var СчетСФ	:String;  -- счет из счет-фактуры отгрузка
var СчетСФАв	:String;  -- счет из счет-фактуры аванса
var Перенос	:Logical; -- Перенесли сумму из 18% в 20%
------

-- Строка со сторно для изменения счетов фактур (отгрузки)
var УВсегоДок	:Numeric;
var УСто1	:Numeric;
var УСто18	:Numeric;
var УСто2	:Numeric;
var УСум1	:Numeric;
var УСум18	:Numeric;
var УСум2	:Numeric;
var УСум3	:Numeric; -- По ставке 0 % (Если значение 0, то не облагается НДС)
var УНеобл	:Numeric; -- необлагаемая сумма
var УКомент	:String;  -- Например Уменьшающая сумма по с.ф №3;
------

Proc ОчиститьПерем; -- Очищает массивы и связанные счетчики
  ClearVariable(Раб.Бух.Отгрузки);
  ClearVariable(Раб.Бух.Авансы);
  ClearVariable(Раб.Бух.КолОтгр);
  ClearVariable(Раб.Бух.КолАвансы);
  ClearVariable(Раб.Бух.РВсегоДок);
  ClearVariable(Раб.Бух.РСто1);
  ClearVariable(Раб.Бух.РСто18);
  ClearVariable(Раб.Бух.РСто2);
  ClearVariable(Раб.Бух.РСум1);
  ClearVariable(Раб.Бух.РСум18);
  ClearVariable(Раб.Бух.РСум2);
  ClearVariable(Раб.Бух.РСум3);
  ClearVariable(Раб.Бух.РНеобл);
end;


Proc ВставкаВМассивы(Тип:Integer;Номер:Integer);
-- Вставка в массивы
-- Параметры:
-- Тип - в какой массив вставлять (1-Отгрузки,2- Авансы)
-- Номер - номер отгрузки или аванса
  if Тип=1:
      КолОтгр=КолОтгр+1;
      Отгрузки[КолОтгр]=Номер;
    |Тип=2:
      КолАвансы=КолАвансы+1;
      Авансы[КолАвансы]=Номер;
  fi;
end;

--  ВСЕГОДОК	  :REAL; --сумма счета
--  СТО1	  :REAL; --сумма НДС 20%
--  СТО2	  :REAL; --сумма НДС 10%
--  СУМ1	  :REAL; --сумма без НДС 20%
--  СУМ2	  :REAL; --сумма без НДС 10%

Proc ВставкаСторно(Robl:Integer;Robl2:Integer;Robl3:Integer;i:Integer;n:Integer;ДатаВ:Date);
-- Вставка сторно в специальную картотеку
-- Robl  - отгрузки
-- Robl2 - авансы
-- RObl3 - картотека со сторно
-- i - Номер записи в Robl
-- n - Номер записи в Robl2
-- ДатаВ - Дата отображения строки в книгах
var Зап:Integer; -- новая запись
var РеквП:Record;
  КолВст=КолВст+1;
  Зап=InsertRecord(Robl3);
  Зап=PutFieldR(Robl3,Зап,'НАШЕПОДРАЗД',GetFieldR(Robl2,Авансы[n],'НАШЕПОДРАЗД'));
  РеквП=GetFieldR(Robl2,Авансы[n],'РЕКВП');
  Зап=PutFieldR(Robl3,Зап,'РЕКВП',РеквП);
  if РеквП<>nil:
    Зап=PutFieldS(Robl3,Зап,'ИНН',GetFieldS(Robl2,Авансы[n],'РЕКВП.ИНН'));
    Зап=PutFieldS(Robl3,Зап,'КПП',GetFieldS(Robl2,Авансы[n],'РЕКВП.КПП'));
    Зап=PutFieldS(Robl3,Зап,'ПОСТ',GetFieldS(Robl2,Авансы[n],'РЕКВП.ПолнИмя'));
    Зап=PutFieldS(Robl3,Зап,'АНКОДПост',
			    CARDFILERECSIGN('КОНТРАГЕНТ','ПРИЗНАК','К',РеквП)
			    +' '+GetFieldS(Robl2,Авансы[n],'ДопАналит')
			    +' СФН.'+GetFieldS(Robl2,Авансы[n],'Анкод'));
  else
    Зап=PutFieldS(Robl3,Зап,'ИНН',GetFieldS(Robl2,Авансы[n],'ИНН'));
    Зап=PutFieldS(Robl3,Зап,'КПП',GetFieldS(Robl2,Авансы[n],'КПП'));
  fi;
  Зап=PutFieldD(Robl3,Зап,'ДАТАВ',ДатаВ);
  Зап=PutFieldD(Robl3,Зап,'D0',GetFieldD(Robl2,Авансы[n],'Дата'));
  Зап=PutFieldS(Robl3,Зап,'ДНП0',GetFieldS(Robl2,Авансы[n],'НомерБум'));
  Зап=PutFieldD(Robl3,Зап,'D2',GetFieldD(Robl2,Авансы[n],'Дата'));
  Зап=PutFieldD(Robl3,Зап,'D3',GetFieldD(Robl2,Авансы[n],'Дата'));
  Зап=PutFieldN(Robl3,Зап,'D8',СВсегоДок+ССум3+СНеобл);
  Зап=PutFieldN(Robl3,Зап,'STO1',ССто1);
  Зап=PutFieldN(Robl3,Зап,'STO18',ССто18);
  Зап=PutFieldN(Robl3,Зап,'STO2',ССто2);
  Зап=PutFieldN(Robl3,Зап,'SUM1',ССум1);
  Зап=PutFieldN(Robl3,Зап,'SUM18',ССум18);
  Зап=PutFieldN(Robl3,Зап,'SUM2',ССум2);
  Зап=PutFieldN(Robl3,Зап,'SUM3',ССум3);
  Зап=PutFieldL(Robl3,Зап,'НеОтображать',НеОтображать);
  Зап=PutFieldL(Robl3,Зап,'Перенос',Перенос);
  Зап=PutFieldS(Robl3,Зап,'КОММЕНТ','Авансовый платеж');
  Зап=PutFieldS(Robl3,Зап,'КОРСЧЕТ',if(СчетСФАв='','62.1',СчетСФАв));
  Зап=PutFieldS(Robl3,Зап,'СЧЕТ',if(СчетСФ='','90.3',СчетСФ));
  -- Отгруз поля .с.ф.
  if Not НеОтображать:
    Зап=PutFieldS(Robl3,Зап,'ОНомер',GetFieldS(Robl,Отгрузки[i],'НомерБум'));
    Зап=PutFieldD(Robl3,Зап,'ОДатаХ',GetFieldD(Robl2,Авансы[n],'Дата'));
    Зап=PutFieldS(Robl3,Зап,'ОКом_УМ',GetFieldS(Robl,Отгрузки[i],'Коммент'));
    if GetFieldN(Robl,Отгрузки[i],'ВСЕГОДОК')>(СВсегоДок+ССум3+СНеобл):
      Зап=PutFieldS(Robl3,Зап,'ОКОММЕНТ','частичная оплата');
    fi;
  fi;
End;


Proc ИзменениеСторноСФ(Robl:Integer;i:Integer;Валюта:String;ДПересчета:Date);-- записываем сторно в с.ф.
var Ком:String;
var СчВсегоДок,СчСто1,СчСто18,СчСто2,СчСум1,СчСум18,СчСум2:Numeric; -- Считанное сторно
var ВсВсегоДок,ВсСто1,ВсСто18,ВсСто2,ВсСум1,ВсСум18,ВсСум2:Numeric; -- Сторно для вставки
var СчКом:String;

  if УВсегоДок+УНеобл+УСум3>0:Ком=Укомент;
   else Ком='';
  fi;
  СчВсегоДок= GetFieldN(Robl,Отгрузки[i],'ВсегоДокСт');
  СчСто1=     GetFieldN(Robl,Отгрузки[i],'Сум1Сторно');
  СчСто18=    GetFieldN(Robl,Отгрузки[i],'Сум18Сторно');
  СчСто2=     GetFieldN(Robl,Отгрузки[i],'Сум2Сторно');
  СчСум1=     GetFieldN(Robl,Отгрузки[i],'СуммаНДС10');
  СчСум18=    GetFieldN(Robl,Отгрузки[i],'СуммаНДС18');
  СчСум2=     GetFieldN(Robl,Отгрузки[i],'СуммаНДС20');
  СчКом=      GetFieldS(Robl,Отгрузки[i],'Коммент');

  ВсВсегоДок=ПересчетВВалюту(УВсегоДок+УНеобл+УСум3,Валюта,ДПересчета);
  ВсСто1=ПересчетВВалюту(УСум1,Валюта,ДПересчета);
  ВсСто18=ПересчетВВалюту(УСум18,Валюта,ДПересчета);
  ВсСто2= ПересчетВВалюту(УСум2,Валюта,ДПересчета);
  ВсСум1= ПересчетВВалюту(УСто2,Валюта,ДПересчета);
  ВсСум18=ПересчетВВалюту(УСто18,Валюта,ДПересчета);
  ВсСум2= ПересчетВВалюту(УСто1,Валюта,ДПересчета);

  if СчВсегоДок<>ВсВсегоДок or СчСто1<>ВсСто1 or СчСто18<>ВсСто18 or СчСто2<>ВсСто2 or
     СчСум1<>ВсСум1 or СчСум18<>ВсСум18 or СчСум2<>ВсСум2 or СчКом<>Ком:
    КолВстСФ=КолВстСФ+1;
    Отгрузки[i]=PutFieldN(Robl,Отгрузки[i],'ВсегоДокСт',ВсВсегоДок);
    Отгрузки[i]=PutFieldN(Robl,Отгрузки[i],'Сум1Сторно',ВсСто1);
    Отгрузки[i]=PutFieldN(Robl,Отгрузки[i],'Сум18Сторно',ВсСто18);
    Отгрузки[i]=PutFieldN(Robl,Отгрузки[i],'Сум2Сторно',ВсСто2);
    Отгрузки[i]=PutFieldN(Robl,Отгрузки[i],'СуммаНДС10',ВсСум1);
    Отгрузки[i]=PutFieldN(Robl,Отгрузки[i],'СуммаНДС18',ВсСум18);
    Отгрузки[i]=PutFieldN(Robl,Отгрузки[i],'СуммаНДС20',ВсСум2);
    Отгрузки[i]=PutFieldS(Robl,Отгрузки[i],'Коммент',Ком);
  fi;
End;


Proc РасчитатьСторно(Robl:Integer;Robl2:Integer;Robl3:Integer); -- Расчитывает необходимое сторно
-- Robl  - отгрузки
-- Robl2 - авансы
-- RObl3 - картотека со сторно
var i,n:Integer;
var ОВсегоДок,ОСто1,ОСто18,ОСто2,ОСум1,ОСум18,ОСум2,ОСум3,ОНеобл:Numeric; -- Суммы отгрузки
var ОНДС0:Logical; -- Ставка 0 процентов у отгрузки
var АВсегоДок,АСто1,АСто18,АСто2,АСум1,АСум18,АСум2,АСум3,АНеобл:Numeric; -- Суммы авансов
var ДатаОтгр:Date; -- Дата текущей отгрузки
var ДатаАв  :Date; -- Дата аванса
var ОВал,АВал:String; -- Валюта отгрузки и аванса
var ЗакрытьАванс:Logical; -- закрыть аванс
  for i=1..КолОтгр do
    УВсегоДок=0;УСто1=0;УСто18=0;УСто2=0;УСум1=0;УСум18=0;УСум2=0;УСум3=0;УНеобл=0;УКомент='Уменьшающая сумма по с.ф №';
    ОВал     =GetFieldS(Robl,Отгрузки[i],'Валюта');
    ДатаОтгр =GetFieldD(Robl,Отгрузки[i],'Дата');
    СчетСФ   =GetFieldS(Robl,Отгрузки[i],'Счет');
    ЗакрытьАванс=GetFieldL(Robl,Отгрузки[i],'ЗакрытьАванс');
    НеОтображать=ЗакрытьАванс;
    ОВСЕГОДОК=ПересчетВРуб(GetFieldN(Robl,Отгрузки[i],'ВсегоДок'),Овал,ДатаОтгр);
    ОСТО18   =ПересчетВРуб(GetFieldN(Robl,Отгрузки[i],'Сто18'),ОВал,ДатаОтгр);
    ОСТО1    =ПересчетВРуб(GetFieldN(Robl,Отгрузки[i],'Сто1'),ОВал,ДатаОтгр);
    ОСТО2    =ПересчетВРуб(GetFieldN(Robl,Отгрузки[i],'Сто2'),ОВал,ДатаОтгр);
    ОСУМ18   =ПересчетВРуб(GetFieldN(Robl,Отгрузки[i],'Сум18'),ОВал,ДатаОтгр);
    ОСУМ1    =ПересчетВРуб(GetFieldN(Robl,Отгрузки[i],'Сум1'),ОВал,ДатаОтгр);
    ОСУМ2    =ПересчетВРуб(GetFieldN(Robl,Отгрузки[i],'Сум2'),ОВал,ДатаОтгр);
    ОНДС0    =GetFieldL(Robl,Отгрузки[i],'НДС0');
    ОСУМ3    =if(ОНДС0:ОВСЕГОДОК-(ОСТО1+ОСТО18+ОСТО2+ОСУМ1+ОСУМ18+ОСУМ2),0);
    ОНеобл   =ОВСЕГОДОК-(ОСТО1+ОСТО18+ОСТО2+ОСУМ1+ОСУМ18+ОСУМ2)-ОСУМ3;
    for n=1..КолАвансы do
      ДатаАв=GetFieldD(Robl2,Авансы[n],'Дата');
      СчетСФАв=GetFieldS(Robl2,Авансы[n],'Счет');
      if ДатаАв<=ДатаОтгр:
	АВал	 =GetFieldS(Robl2,Авансы[n],'Валюта');
	АВСЕГОДОК=ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'ВсегоДок'),АВал,ДатаАв)-РВСЕГОДОК[n];
	АСТО1	 =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сто1'),АВал,ДатаАв)	 -РСТО1[n];
	АСТО18	 =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сто18'),АВал,ДатаАв)-РСТО18[n];
	АСТО2	 =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сто2'),АВал,ДатаАв)	 -РСТО2[n];
	АСУМ1	 =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сум1'),АВал,ДатаАв)	 -РСУМ1[n];
	АСУМ18	 =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сум18'),АВал,ДатаАв)-РСУМ18[n];
	АСУМ2	 =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сум2'),АВал,ДатаАв)	 -РСУМ2[n];
	АСУМ3	 =if(GetFieldL(Robl2,Авансы[n],'НДС0'):АВСЕГОДОК-(АСТО1+АСТО18+АСТО2+АСУМ1+АСУМ18+АСУМ2),0)-РСУМ3[n];
	АНеобл	 =АВСЕГОДОК-(АСТО1+АСТО18+АСТО2+АСУМ1+АСУМ18+АСУМ2)-АСУМ3-РНеобл[n]-РСУМ3[n];
	Перенос = false;
	if Not ЗакрытьАванс:
	  if ОСТО18>0 and АСТО1>0: 
	    -- Если есть аванс 20% и отгрузка 18%, то перекидывается сумма, что бы сторнировать 18%.
	    ОСТО1=min(ОСТО18,АСТО1);
	    ОСТО18=ОСТО18-ОСТО1;
	    ОСУМ1=min(ОСУМ18,АСУМ1);
	    ОСУМ18=ОСУМ18-ОСУМ1;
	    Перенос=true;
	  fi;

	  ССто1    = min(АСТО1,ОСТО1);
	  ССто18   = min(АСТО18,ОСТО18);
	  ССто2    = min(АСТО2,ОСТО2);
	  ССум1    = min(АСУМ1,ОСУМ1);
	  ССум18   = min(АСУМ18,ОСУМ18);
	  ССум2    = min(АСУМ2,ОСУМ2);
	  ССум3    = min(АСУМ3,ОСУМ3);
	  СВсегоДок= ССто1+ССто18+ССто2+ССум1+ССум18+ССум2;
	  СНеобл   = min(АНеобл,ОНеобл);
	else
	  ССто1    = АСТО1;
	  ССто18   = АСТО18;
	  ССто2    = АСТО2;
	  ССум1    = АСУМ1;
	  ССум18   = АСУМ18;
	  ССум2    = АСУМ2;
	  ССум3    = АСУМ3;
	  СВсегоДок= ССто1+ССто18+ССто2+ССум1+ССум18+ССум2;
	  СНеобл   = АНеобл;
	fi;
	if СВсегоДок+СНеобл+ССум3<>0: ВставкаСторно(Robl,Robl2,Robl3,i,n,GetFieldD(Robl,Отгрузки[i],'Дата'));fi;

	УВсегоДок=УВсегоДок+СВсегоДок;
	УСто1=УСто1+ССто1;
	УСто18=УСто18+ССто18;
	УСто2=УСто2+ССто2;
	УСум1=УСум1+ССум1;
	УСум18=УСум18+ССум18;
	УСум2=УСум2+ССум2;
	УСум3=УСум3+ССум3;
	УНеобл=УНеобл+СНеобл;
	УКомент=УКомент+GetFieldS(Robl2,Авансы[n],'НомерБум')+';';

	ОВСЕГОДОК=ОВСЕГОДОК-СВсегоДок; -- уменьшаем сумму отгрузки
	ОСТО1	 =ОСТО1    -ССто1;
	ОСТО18	 =ОСТО18   -ССто18;
	ОСТО2	 =ОСТО2    -ССто2;
	ОСУМ1	 =ОСУМ1    -ССум1;
	ОСУМ18	 =ОСУМ18   -ССум18;
	ОСУМ2	 =ОСУМ2    -ССум2;
	ОСУМ3	 =ОСУМ3    -ССум3;
	ОНеобл	 =ОНеобл   -СНеобл;
	РВСЕГОДОК[n]=РВСЕГОДОК[n]+СВсегоДок; -- уменьшаем сумму аванса
	РСТО1[n]    =РСТО1[n]	 +ССто1;
	РСТО18[n]   =РСТО18[n]	 +ССто18;
	РСТО2[n]    =РСТО2[n]	 +ССто2;
	РСУМ1[n]    =РСУМ1[n]	 +ССум1;
	РСУМ18[n]   =РСУМ18[n]	 +ССум18;
	РСУМ2[n]    =РСУМ2[n]	 +ССум2;
	РСУМ3[n]    =РСУМ3[n]	 +ССум3;
	РНеобл[n]   =РНеобл[n]	 +СНеобл;
      else
	ССто1=0;
	ССто18=0;
	ССто2=0;
	ССум1=0;
	ССум18=0;
	ССум2=0;
	СВсегоДок=0;
	СНеобл=0;
	ССум3=0;
      fi;
    end;
    ИзменениеСторноСФ(Robl,i,ОВал,ДатаОтгр);-- записываем сторно в с.ф.
  end;

  --- Проверяем авансы на возврат
  НеОтображать=true;
  for n=1..КолАвансы do
    if GetFieldL(Robl2,Авансы[n],'АвансВернули'): -- Если аванс вернули, то нужно вписать его в книгу на оставшуюся сумму

      ДатаАв=GetFieldD(Robl2,Авансы[n],'Дата');
      СчетСФАв=GetFieldS(Robl2,Авансы[n],'Счет');
      СВСЕГОДОК=ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'ВсегоДок'),АВал,ДатаАв)-РВСЕГОДОК[n];
      ССТО1    =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сто1'),АВал,ДатаАв)    -РСТО1[n];
      ССТО18   =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сто18'),АВал,ДатаАв)-РСТО18[n];
      ССТО2    =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сто2'),АВал,ДатаАв)    -РСТО2[n];
      ССУМ1    =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сум1'),АВал,ДатаАв)    -РСУМ1[n];
      ССУМ18   =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сум18'),АВал,ДатаАв)-РСУМ18[n];
      ССУМ2    =ПересчетВРуб(GetFieldN(Robl2,Авансы[n],'Сум2'),АВал,ДатаАв)    -РСУМ2[n];
      ССУМ3    =if(GetFieldL(Robl2,Авансы[n],'НДС0'):АВСЕГОДОК-(АСТО1+АСТО18+АСТО2+АСУМ1+АСУМ18+АСУМ2),0)-РСУМ3[n];
      СНеобл   =АВСЕГОДОК-(АСТО1+АСТО18+АСТО2+АСУМ1+АСУМ18+АСУМ2)-АСУМ3-РНеобл[n]-РСУМ3[n];
      if СВсегоДок+СНеобл+ССум3<>0: ВставкаСторно(Robl,Robl2,Robl3,i,n,GetFieldD(Robl2,Авансы[n],'ДатаВозврата'));fi;
    fi;
  end;
  --------------------------------
end;



Proc Сторнировать(КодАванса:String); -- Сторнирует с.ф.
-- КодАванса - Код аванса для сторнирования, если пустоя строка, то сторнирует все коды аванса.
var Robl,i,RObl2,RObl3,n:Integer;
var Аванс:String; -- текущий аванс отгрузки
var АвансПред:String; -- предыдущий аванс отгрузки
var flag:Logical; -- Была вставка отгрузки
var Flag2:Logical; -- Следующая отгрузка такая же
var КолЗап:Integer; -- количество записей для вставки пакета
var Flag3:Logical; -- был ли аванс для отгрузки
  if VerSQL:
      КолЗап=1000;
  else
      КолЗап=100;
  fi;
  АвансПред='';
  Аванс='';
  ОчиститьПерем;
  КолВст=0;
  КолВстСФ=0;
  hint('Рассчитываются сторно...');
  if КодАванса<>'': КодАванса=' and Сделка="'+КодАванса+'"'; fi;
  Robl=OpenWorkArea('СчетФакт','Сделка;Дата','Проводить and Сделка>"" and Not Аванс'+КодАванса); -- отгрузки
  Try
    Robl2=OpenWorkArea('СчетФакт','Сделка;Дата','Проводить and Сделка>"" and Аванс'+КодАванса);  -- авансы
    Try
      hint('Удаляются предыдущие записи о сторно...');
      RObl3=OpenWorkArea('Сторно_СФ','','');  -- картотека со сторно
      Try
	DeleteAllRecords(Robl3);
      Finally
	CloseWorkArea(Robl3);
      End;
      hint('Рассчитываются сторно...');
      RObl3=OpenWorkArea('Сторно_СФ','','1=0');  -- картотека со сторно
      Try
	BeginChanging(Robl);
	Try
	  BeginChanging(Robl3);
	  Try
	    n=1;
	    for i=1..records(robl2) do
	      Аванс=GetFieldS(Robl2,i,'Сделка');
	      flag2=false;
	      if i<records(robl2):
		if Аванс<>GetFieldS(Robl2,i+1,'Сделка'):flag2=true;fi;
	      fi;

	      if Аванс=АвансПред or АвансПред='': -- Запоминаем номер если такой же как и предыдущий
		ВставкаВМассивы(2,i);
		АвансПред=Аванс;
		flag=true;
	      else
		flag=false;
	      fi;

	      if (Flag2) or (Not flag) or (i=records(robl2)): -- искать ли отгрузки
		Flag3=false;
		n=1; -- если база без несуществующих кодов авансов, то строку можно убрать, что бы работало быстрее
		while n<=records(Robl) do -- Ищем отгрузки с той же сделкой
		  if GetFieldS(Robl,n,'Сделка')=АвансПред:
		    ВставкаВМассивы(1,n);
		    n=n+1;
		    flag3=true;
		  elsif flag3:break;
		  else n=n+1;
		  fi;
		end;
		РасчитатьСторно(Robl,Robl2,Robl3);
		if КолВст>=КолЗап:
		  КолВст=0;
		  hint('Сохраняем часть посчитанных сторно..');
		  EndChanging(Robl3);
		  hint('Рассчитываются сторно...');
		  BeginChanging(Robl3);
		fi;
		if КолВстСФ>=КолЗап:
		  КолВстСФ=0;
		  hint('Сохраняем часть посчитанных сторно..');
		  EndChanging(Robl);
		  hint('Рассчитываются сторно...');
		  BeginChanging(Robl);
		fi;
		ОчиститьПерем;
		АвансПред='';
	      fi;
	    end;
	  hint('Сохранение записей.');
	  EndChanging(Robl3);
	  Except
	    CancelChanging(Robl3);
	    raise;
	  End;
	  hint('Сохранение записей.');
	  EndChanging(Robl);
	Except
	  CancelChanging(Robl);
	  raise;
	End;
      Finally
	CloseWorkArea(Robl3);
      End;
    Finally
      CloseWorkArea(Robl2);
    End;
  Finally
    CloseWorkArea(Robl);
  End;
end;
----------------------------

-------------
-- Переменные, процедуры и ф-ии для сторнирования счетов фактур поставщика
-------------


----------------------
var ОтгрузкиП[]  :Integer;    -- Номера отгрузок с одинаковыми кодами кода аванса
var КолОтгрП	 :Integer;    -- Счетчик массива отгрузок
var АвансыП[]	 :Integer;    -- Номера авансов с одинаковыми кодами
var КолАвансыП	 :Integer;    -- Счетчик авансов
var КолВстП	 :Integer;    -- Количество вставленных сторно в спец картотеку
var КолВстСФП	 :Integer;    -- Количество вставленных сторно в с.ф. отгрузок

-- Насколько уменьшили суммы авансов в результате сторнирования
var РВсегоДокП[] :Numeric;
var РСто1П[]	 :Numeric;
var РСто18П[]	 :Numeric;
var РСто2П[]	 :Numeric;
var РСум1П[]	 :Numeric;
var РСум18П[]	 :Numeric;
var РСум2П[]	 :Numeric;
var РСум3П[]	 :Numeric; -- По ставке 0 % (Если значение 0, то не облагается НДС)
var РНеоблП[]	 :Numeric; -- необлагаемая сумма
------
-- Строка со сторно для вставки в картотеку
var СВсегоДокП	 :Numeric;
var ССто1П	 :Numeric;
var ССто18П	 :Numeric;
var ССто2П	 :Numeric;
var ССум1П	 :Numeric;
var ССум18П	 :Numeric;
var ССум2П	 :Numeric;
var ССум3П	 :Numeric; -- По ставке 0 % (Если значение 0, то не облагается НДС)
var СНеоблП	 :Numeric; -- необлагаемая сумма
var НеОтображатьП:Logical; -- Не отображать в книге продаж (для  сторнировании на всю сумму аванса)
var СчетСФП	 :String;  -- счет из счет-фактуры отгрузка
var СчетСФАвП	 :String;  -- счет из счет-фактуры аванса
var ПереносП	 :Logical; -- Перенесли сумму из 18% в 20%
------

-- Строка со сторно для изменения счетов фактур (отгрузки)
var УВсегоДокП	 :Numeric;
var УСто1П	 :Numeric;
var УСто18П	 :Numeric;
var УСто2П	 :Numeric;
var УСум1П	 :Numeric;
var УСум18П	 :Numeric;
var УСум2П	 :Numeric;
var УСум3П	 :Numeric; -- По ставке 0 % (Если значение 0, то не облагается НДС)
var УНеоблП	 :Numeric; -- необлагаемая сумма
var УКоментП	 :String;  -- Например Уменьшающая сумма по с.ф №3;
------


Proc ОчиститьПеремП; -- Очищает массивы и связанные счетчики
  ClearVariable(Раб.Бух.ОтгрузкиП);
  ClearVariable(Раб.Бух.АвансыП);
  ClearVariable(Раб.Бух.КолОтгрП);
  ClearVariable(Раб.Бух.КолАвансыП);
  ClearVariable(Раб.Бух.РВсегоДокП);
  ClearVariable(Раб.Бух.РСто1П);
  ClearVariable(Раб.Бух.РСто18П);
  ClearVariable(Раб.Бух.РСто2П);
  ClearVariable(Раб.Бух.РСум1П);
  ClearVariable(Раб.Бух.РСум18П);
  ClearVariable(Раб.Бух.РСум2П);
  ClearVariable(Раб.Бух.РСум3П);
  ClearVariable(Раб.Бух.РНеоблП);
end;

Proc ВставкаВМассивыП(Тип:Integer;Номер:Integer);
-- Вставка в массивы
-- Параметры:
-- Тип - в какой массив вставлять (1-Отгрузки,2- Авансы)
-- Номер - номер отгрузки или аванса
  if Тип=1:
      КолОтгрП=КолОтгрП+1;
      ОтгрузкиП[КолОтгрП]=Номер;
    |Тип=2:
      КолАвансыП=КолАвансыП+1;
      АвансыП[КолАвансыП]=Номер;
  fi;
end;

Proc ВставкаСторноП(Robl:Integer;Robl2:Integer;Robl3:Integer;i:Integer;n:Integer;ДатаВ:Date);
-- Вставка сторно в специальную картотеку
-- Robl  - отгрузки
-- Robl2 - авансы
-- RObl3 - картотека со сторно
-- i - Номер записи в Robl
-- n - Номер записи в Robl2
-- ДатаВ - Дата отображения строки в книгах
var Зап:Integer; -- новая запись
var РеквП:Record;
  КолВстП=КолВстП+1;
  Зап=InsertRecord(Robl3);

  Зап=PutFieldR(Robl3,Зап,'НАШЕПОДРАЗД',GetFieldR(Robl2,АвансыП[n],'НАШЕПОДРАЗД'));
  РеквП=GetFieldR(Robl2,АвансыП[n],'РЕКВП');


  Зап=PutFieldR(Robl3,Зап,'РЕКВП',РеквП);
  if РеквП<>nil:
    Зап=PutFieldS(Robl3,Зап,'ИНН',GetFieldS(Robl2,АвансыП[n],'РЕКВП.ИНН'));
    Зап=PutFieldS(Robl3,Зап,'КПП',GetFieldS(Robl2,АвансыП[n],'РЕКВП.КПП'));
    Зап=PutFieldS(Robl3,Зап,'Покуп',GetFieldS(Robl2,АвансыП[n],'РЕКВП.ПолнИмя'));
    Зап=PutFieldS(Robl3,Зап,'АНПОК',
			    CARDFILERECSIGN('КОНТРАГЕНТ','ПРИЗНАК','К',РеквП)
			    +' '+GetFieldS(Robl2,АвансыП[n],'ДопАналитика')
			    +' СФП.'+GetFieldS(Robl2,АвансыП[n],'Анкод'));
  else
    Зап=PutFieldS(Robl3,Зап,'ИНН',GetFieldS(Robl2,АвансыП[n],'ИНН'));
    Зап=PutFieldS(Robl3,Зап,'КПП',GetFieldS(Robl2,АвансыП[n],'КПП'));
  fi;

  Зап=PutFieldD(Robl3,Зап,'ДатаВ',ДатаВ);
  Зап=PutFieldD(Robl3,Зап,'Дата',GetFieldD(Robl2,АвансыП[n],'Дата'));
  Зап=PutFieldS(Robl3,Зап,'Номер',GetFieldS(Robl2,АвансыП[n],'НомерБум'));
  Зап=PutFieldD(Robl3,Зап,'ДатаХ',GetFieldD(Robl2,АвансыП[n],'Дата'));

  Зап=PutFieldN(Robl3,Зап,'У',СВсегоДокП+ССум3П+СНеоблП);
  Зап=PutFieldN(Robl3,Зап,'Сто18',ССто18П);
  Зап=PutFieldN(Robl3,Зап,'Сум18',ССум18П);
  Зап=PutFieldN(Robl3,Зап,'Сто2',ССто1П);
  Зап=PutFieldN(Robl3,Зап,'Сум2',ССум1П);
  Зап=PutFieldN(Robl3,Зап,'Сто1',ССто2П);
  Зап=PutFieldN(Robl3,Зап,'Сум1',ССум2П);
  Зап=PutFieldN(Robl3,Зап,'Сум3',ССум3П);
  Зап=PutFieldS(Robl3,Зап,'КОММЕНТ','');
  Зап=PutFieldS(Robl3,Зап,'СЧЕТ',if(СчетСФП='','19.3',СчетСФП));

End;

Proc ИзменениеСторноСФП(Robl:Integer;i:Integer;Валюта:String;ДПересчета:Date);-- записываем сторно в с.ф.
var Ком:String;
var СчВсегоПок,СчСто1,СчСто18,СчСто2,СчСум1,СчСум18,СчСум2,СчСум3:Numeric; -- Считанное сторно
var ВсВсегоДок,ВсСто1,ВсСто18,ВсСто2,ВсСум1,ВсСум18,ВсСум2,ВсСум3:Numeric; -- Сторно для вставки
var СчКом:String;

  if УВсегоДокП+УНеоблП+УСум3П>0:Ком=УкоментП;
   else Ком='';
  fi;
  СчВсегоПок= GetFieldN(Robl,ОтгрузкиП[i],'ВсегоПокСт');
  СчСто1=     GetFieldN(Robl,ОтгрузкиП[i],'Сто1Ст');
  СчСто18=    GetFieldN(Robl,ОтгрузкиП[i],'Сто18Ст');
  СчСто2=     GetFieldN(Robl,ОтгрузкиП[i],'Сто2Ст');
  СчСум1=     GetFieldN(Robl,ОтгрузкиП[i],'Сум1Ст');
  СчСум18=    GetFieldN(Robl,ОтгрузкиП[i],'Сум18Ст');
  СчСум2=     GetFieldN(Robl,ОтгрузкиП[i],'Сум2Ст');
  СчСум3=     GetFieldN(Robl,ОтгрузкиП[i],'Сум3Ст');
  СчКом=      GetFieldS(Robl,ОтгрузкиП[i],'КоммАванса');

  ВсВсегоДок=ПересчетВВалюту(УВсегоДокП+УНеоблП+УСум3П,Валюта,ДПересчета);
  ВсСто1=ПересчетВВалюту(УСто1П,Валюта,ДПересчета);
  ВсСто18=ПересчетВВалюту(УСто18П,Валюта,ДПересчета);
  ВсСто2= ПересчетВВалюту(УСто2П,Валюта,ДПересчета);
  ВсСум1= ПересчетВВалюту(УСум1П,Валюта,ДПересчета);
  ВсСум18=ПересчетВВалюту(УСум18П,Валюта,ДПересчета);
  ВсСум2= ПересчетВВалюту(УСум2П,Валюта,ДПересчета);
  ВсСум3= ПересчетВВалюту(УСум3П,Валюта,ДПересчета);

  if СчВсегоПок<>ВсВсегоДок or СчСто1<>ВсСто1 or СчСто18<>ВсСто18 or СчСто2<>ВсСто2 or
     СчСум1<>ВсСум1 or СчСум18<>ВсСум18 or СчСум2<>ВсСум2 or СчСум3<>ВсСум3 or СчКом<>Ком:
    КолВстСФП=КолВстСФП+1;
    ОтгрузкиП[i]=PutFieldN(Robl,ОтгрузкиП[i],'ВсегоПокСт',ВсВсегоДок);
    ОтгрузкиП[i]=PutFieldN(Robl,ОтгрузкиП[i],'Сто1Ст',ВсСто1);
    ОтгрузкиП[i]=PutFieldN(Robl,ОтгрузкиП[i],'Сто18Ст',ВсСто18);
    ОтгрузкиП[i]=PutFieldN(Robl,ОтгрузкиП[i],'Сто2Ст',ВсСто2);
    ОтгрузкиП[i]=PutFieldN(Robl,ОтгрузкиП[i],'Сум1Ст',ВсСум1);
    ОтгрузкиП[i]=PutFieldN(Robl,ОтгрузкиП[i],'Сум18Ст',ВсСум18);
    ОтгрузкиП[i]=PutFieldN(Robl,ОтгрузкиП[i],'Сум2Ст',ВсСум2);
    ОтгрузкиП[i]=PutFieldN(Robl,ОтгрузкиП[i],'Сум3Ст',ВсСум3);
    ОтгрузкиП[i]=PutFieldS(Robl,ОтгрузкиП[i],'КоммАванса',Ком);
  fi;
End;

Proc РасчитатьСторноП(Robl:Integer;Robl2:Integer;Robl3:Integer); -- Расчитывает необходимое сторно
-- Robl  - отгрузки
-- Robl2 - авансы
-- RObl3 - картотека со сторно
var i,n:Integer;
var ОВСЕГОПОК,ОСто1,ОСто18,ОСто2,ОСум1,ОСум18,ОСум2,ОСум3,ОНеобл:Numeric; -- Суммы отгрузки
var АВсегоДок,АСто1,АСто18,АСто2,АСум1,АСум18,АСум2,АСум3,АНеобл:Numeric; -- Суммы авансов
var ДатаОтгр:Date; -- Дата текущей отгрузки
var ДатаАв  :Date; -- Дата аванса
var ОВал,АВал:String; -- Валюта отгрузки и аванса
var ЗакрытьАванс:Logical; -- закрыть аванс
  for i=1..КолОтгрП do
    УВсегоДокП=0;УСто1П=0;УСто18П=0;УСто2П=0;УСум1П=0;УСум18П=0;УСум2П=0;УСум3П=0;УНеоблП=0;УКоментП='Уменьшающая сумма по с.ф №';
    ОВал     =GetFieldS(Robl,ОтгрузкиП[i],'Валюта');
    ДатаОтгр =GetFieldD(Robl,ОтгрузкиП[i],'Дата');
    СчетСФП   =GetFieldS(Robl,ОтгрузкиП[i],'Кре');
    ЗакрытьАванс=false;
--    ЗакрытьАванс=GetFieldL(Robl,ОтгрузкиП[i],'ЗакрытьАванс');
    НеОтображатьП=ЗакрытьАванс;
    ОВСЕГОПОК=ПересчетВРуб(GetFieldN(Robl,ОтгрузкиП[i],'ВсегоПок'),Овал,ДатаОтгр);
    ОСТО2    =ПересчетВРуб(GetFieldN(Robl,ОтгрузкиП[i],'Сто2'),ОВал,ДатаОтгр);
    ОСУМ2    =ПересчетВРуб(GetFieldN(Robl,ОтгрузкиП[i],'Сум2'),ОВал,ДатаОтгр);

    ОСТО18   =ПересчетВРуб(GetFieldN(Robl,ОтгрузкиП[i],'Сто18'),ОВал,ДатаОтгр);
    ОСУМ18   =ПересчетВРуб(GetFieldN(Robl,ОтгрузкиП[i],'Сум18'),ОВал,ДатаОтгр);

    ОСТО1    =ПересчетВРуб(GetFieldN(Robl,ОтгрузкиП[i],'Сто1'),ОВал,ДатаОтгр);
    ОСУМ1    =ПересчетВРуб(GetFieldN(Robl,ОтгрузкиП[i],'Сум1'),ОВал,ДатаОтгр);

    ОСУМ3    =ПересчетВРуб(GetFieldN(Robl,ОтгрузкиП[i],'Сум3'),ОВал,ДатаОтгр);

    ОНеобл   =ОВСЕГОПОК-(ОСТО1+ОСТО18+ОСТО2+ОСУМ1+ОСУМ18+ОСУМ2)-ОСУМ3;
    for n=1..КолАвансыП do
      ДатаАв=GetFieldD(Robl2,АвансыП[n],'Дата');
      СчетСФАвП=GetFieldS(Robl2,АвансыП[n],'Кре');
      if ДатаАв<=ДатаОтгр:
	АВал	 =GetFieldS(Robl2,АвансыП[n],'Валюта');
	АВСЕГОДОК=ПересчетВРуб(GetFieldN(Robl2,АвансыП[n],'ВсегоПок'),АВал,ДатаАв)-РВСЕГОДОКП[n];
	АСТО1	 =ПересчетВРуб(GetFieldN(Robl2,АвансыП[n],'Сто1'),АВал,ДатаАв)	  -РСТО1П[n];
	АСТО18	 =ПересчетВРуб(GetFieldN(Robl2,АвансыП[n],'Сто18'),АВал,ДатаАв)-РСТО18П[n];
	АСТО2	 =ПересчетВРуб(GetFieldN(Robl2,АвансыП[n],'Сто2'),АВал,ДатаАв)	  -РСТО2П[n];
	АСУМ1	 =ПересчетВРуб(GetFieldN(Robl2,АвансыП[n],'Сум1'),АВал,ДатаАв)	  -РСУМ1П[n];
	АСУМ18	 =ПересчетВРуб(GetFieldN(Robl2,АвансыП[n],'Сум18'),АВал,ДатаАв)-РСУМ18П[n];
	АСУМ2	 =ПересчетВРуб(GetFieldN(Robl2,АвансыП[n],'Сум2'),АВал,ДатаАв)	  -РСУМ2П[n];
	АСУМ3	 =ПересчетВРуб(GetFieldN(Robl2,АвансыП[n],'Сум3'),АВал,ДатаАв)	  -РСУМ3П[n];
	АНеобл	 =АВСЕГОДОК-(АСТО1+АСТО18+АСТО2+АСУМ1+АСУМ18+АСУМ2)-АСУМ3-РНеоблП[n]-РСУМ3П[n];
	ПереносП = false;
	if Not ЗакрытьАванс:
	  ССто1П    = min(АСТО1,ОСТО1);
	  ССто18П   = min(АСТО18,ОСТО18);
	  ССто2П    = min(АСТО2,ОСТО2);
	  ССум1П    = min(АСУМ1,ОСУМ1);
	  ССум18П   = min(АСУМ18,ОСУМ18);
	  ССум2П    = min(АСУМ2,ОСУМ2);
	  ССум3П    = min(АСУМ3,ОСУМ3);
	  СВсегоДокП= ССто1П+ССто18П+ССто2П+ССум1П+ССум18П+ССум2П;
	  СНеоблП   = min(АНеобл,ОНеобл);
	else
	  ССто1П    = АСТО1;
	  ССто18П   = АСТО18;
	  ССто2П    = АСТО2;
	  ССум1П    = АСУМ1;
	  ССум18П   = АСУМ18;
	  ССум2П    = АСУМ2;
	  ССум3П    = АСУМ3;
	  СВсегоДокП= ССто1П+ССто18П+ССто2П+ССум1П+ССум18П+ССум2П;
	  СНеоблП   = АНеобл;
	fi;
	if СВсегоДокП+СНеоблП+ССум3П<>0: ВставкаСторноП(Robl,Robl2,Robl3,i,n,GetFieldD(Robl,ОтгрузкиП[i],'ДатаОприх'));fi;

	УВсегоДокП=УВсегоДокП+СВсегоДокП;
	УСто1П=УСто1П+ССто1П;
	УСто18П=УСто18П+ССто18П;
	УСто2П=УСто2П+ССто2П;
	УСум1П=УСум1П+ССум1П;
	УСум18П=УСум18П+ССум18П;
	УСум2П=УСум2П+ССум2П;
	УСум3П=УСум3П+ССум3П;
	УНеоблП=УНеоблП+СНеоблП;
	УКоментП=УКоментП+GetFieldS(Robl2,АвансыП[n],'НомерБум')+';';

	ОВСЕГОПОК=ОВСЕГОПОК-СВсегоДокП; -- уменьшаем сумму отгрузки
	ОСТО1	 =ОСТО1    -ССто1П;
	ОСТО18	 =ОСТО18   -ССто18П;
	ОСТО2	 =ОСТО2    -ССто2П;
	ОСУМ1	 =ОСУМ1    -ССум1П;
	ОСУМ18	 =ОСУМ18   -ССум18П;
	ОСУМ2	 =ОСУМ2    -ССум2П;
	ОСУМ3	 =ОСУМ3    -ССум3П;
	ОНеобл	 =ОНеобл   -СНеоблП;
	РВСЕГОДОКП[n]=РВСЕГОДОКП[n]+СВсегоДокП; -- уменьшаем сумму аванса
	РСТО1П[n]    =РСТО1П[n]    +ССто1П;
	РСТО18П[n]   =РСТО18П[n]   +ССто18П;
	РСТО2П[n]    =РСТО2П[n]    +ССто2П;
	РСУМ1П[n]    =РСУМ1П[n]    +ССум1П;
	РСУМ18П[n]   =РСУМ18П[n]   +ССум18П;
	РСУМ2П[n]    =РСУМ2П[n]    +ССум2П;
	РСУМ3П[n]    =РСУМ3П[n]    +ССум3П;
	РНеоблП[n]   =РНеоблП[n]   +СНеоблП;
      else
	ССто1П=0;
	ССто18П=0;
	ССто2П=0;
	ССум1П=0;
	ССум18П=0;
	ССум2П=0;
	СВсегоДокП=0;
	СНеоблП=0;
	ССум3П=0;
      fi;
    end;
    ИзменениеСторноСФП(Robl,i,ОВал,ДатаОтгр);-- записываем сторно в с.ф.
  end;
end;

proc СторнироватьСФПост(КодАванса:String);
-- КодАванса - Код аванса для сторнирования, если пустоя строка, то сторнирует все коды аванса.
var Robl,i,RObl2,RObl3,n:Integer;
var Аванс:String; -- текущий аванс отгрузки
var АвансПред:String; -- предыдущий аванс отгрузки
var flag:Logical; -- Была вставка отгрузки
var Flag2:Logical; -- Следующая отгрузка такая же
var КолЗап:Integer; -- количество записей для вставки пакета
var Flag3:Logical; -- был ли аванс для отгрузки
  if VerSQL:
      КолЗап=1000;
  else
      КолЗап=100;
  fi;

  АвансПред='';
  Аванс='';
  ОчиститьПеремП;
  КолВстП=0;
  КолВстСФП=0;
  hint('Рассчитываются сторно по с.ф. поставщика...');
  if КодАванса<>'': КодАванса=' and КодАванса="'+КодАванса+'"'; fi;
  Robl=OpenWorkArea('СчетФактПост','КодАванса;Дата','Проводить and КодАванса>"" and Not Аванс'+КодАванса); -- отгрузки
  Try
    Robl2=OpenWorkArea('СчетФактПост','КодАванса;Дата','Проводить and КодАванса>"" and Аванс'+КодАванса);  -- авансы
    Try
      hint('Удаляются предыдущие записи о сторно...');
      RObl3=OpenWorkArea('Сторно_СФПОСТ','','');  -- картотека со сторно
      Try
	DeleteAllRecords(Robl3);
      Finally
	CloseWorkArea(Robl3);
      End;
      hint('Рассчитываются сторно по с.ф. поставщика...');
      RObl3=OpenWorkArea('Сторно_СФПОСТ','','1=0');  -- картотека со сторно
      Try
	BeginChanging(Robl);
	Try
	  BeginChanging(Robl3);
	  Try
	    n=1;
	    for i=1..records(robl2) do
	      Аванс=GetFieldS(Robl2,i,'КодАванса');
	      flag2=false;
	      if i<records(robl2):
		if Аванс<>GetFieldS(Robl2,i+1,'КодАванса'):flag2=true;fi;
	      fi;

	      if Аванс=АвансПред or АвансПред='': -- Запоминаем номер если такой же как и предыдущий
		ВставкаВМассивыП(2,i);
		АвансПред=Аванс;
		flag=true;
	      else
		flag=false;
	      fi;

	      if (Flag2) or (Not flag) or (i=records(robl2)): -- искать ли отгрузки
		Flag3=false;
		n=1; -- если база без несуществующих кодов авансов, то строку можно убрать, что бы работало быстрее
		while n<=records(Robl) do -- Ищем отгрузки с той же сделкой
		  if GetFieldS(Robl,n,'КодАванса')=АвансПред:
		    ВставкаВМассивыП(1,n);
		    n=n+1;
		    flag3=true;
		  elsif flag3:break;
		  else n=n+1;
		  fi;
		end;
		РасчитатьСторноП(Robl,Robl2,Robl3);
		if КолВстП>=КолЗап:
		  КолВстП=0;
		  hint('Сохраняем часть посчитанных сторно..');
		  EndChanging(Robl3);
		  hint('Рассчитываются сторно по с.ф. поставщика...');
		  BeginChanging(Robl3);
		fi;
		if КолВстСФП>=КолЗап:
		  КолВстСФП=0;
		  hint('Сохраняем часть посчитанных сторно..');
		  EndChanging(Robl);
		  hint('Рассчитываются сторно по с.ф. поставщика...');
		  BeginChanging(Robl);
		fi;
		ОчиститьПеремП;
		АвансПред='';
	      fi;
	    end;
	  hint('Сохранение записей.');
	  EndChanging(Robl3);
	  Except
	    CancelChanging(Robl3);
	    raise;
	  End;
	  hint('Сохранение записей.');
	  EndChanging(Robl);
	Except
	  CancelChanging(Robl);
	  raise;
	End;
      Finally
	CloseWorkArea(Robl3);
      End;
    Finally
      CloseWorkArea(Robl2);
    End;
  Finally
    CloseWorkArea(Robl);
  End;
end;

proc Отмена(Obj:s);
   Close;
end;

Конец

