<?xml version="1.0" encoding="windows-1251"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" encoding="windows-1251" indent="yes" />
	<xsl:strip-space elements="*"/>
	<xsl:variable name="accept">№ !"#$%'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя</xsl:variable>
	<!-- Блок функций проверки -->
	<xsl:template name="CheckSym">
		<xsl:param name="sym"/>
		<xsl:param name="count"/>
		<xsl:param name="name"/>
		<xsl:if test="not(contains($accept,substring($sym,$count,1)))">
			<xsl:element name="error">
				<xsl:attribute name="must">1</xsl:attribute>
				<xsl:text/>Поле "<xsl:value-of select="$name"/>" содержит недопустимый "<xsl:value-of select="substring($sym,$count,1)"/>"символ на позиции <xsl:value-of select="$count"/>
			</xsl:element>
		</xsl:if>
		<xsl:if test="$count &lt; string-length($sym)">
			<xsl:call-template name="CheckSym">
				<xsl:with-param name="sym" select="$sym"/>
				<xsl:with-param name="name" select="$name"/>
				<xsl:with-param name="count" select="$count+1"/>
			</xsl:call-template>
		</xsl:if>
	</xsl:template>
	<xsl:template name="CheckS">
		<xsl:param name="value"/>
		<xsl:param name="name"/>
		<xsl:param name="must"/>
		<xsl:param name="length"/>
		<xsl:variable name="labs">
			<xsl:choose>
				<xsl:when test="$length &gt; 0">
					<xsl:value-of select="$length"/>
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of select="-1*$length"/>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:variable>
		<xsl:if test="string-length($value)=0 and not($must=-1) ">
			<xsl:element name="error">
				<xsl:attribute name="must">
					<xsl:value-of select="$must"/>
				</xsl:attribute>
				<xsl:choose>
					<xsl:when test="$must=1">Обязательное поле </xsl:when>
					<xsl:otherwise>Поле </xsl:otherwise>
				</xsl:choose>
				<xsl:text/>"<xsl:value-of select="$name"/>" не заполнено.</xsl:element>
		</xsl:if>
		<xsl:if test="string-length($value)&gt;0">
			<xsl:call-template name="CheckSym">
				<xsl:with-param name="sym" select="$value"/>
				<xsl:with-param name="name" select="$name"/>
				<xsl:with-param name="count" select="1"/>
			</xsl:call-template>
			<xsl:if test="string-length($value) &gt; $labs">
				<xsl:element name="error">
					<xsl:attribute name="must">1</xsl:attribute>
					<xsl:text/>Поле "<xsl:value-of select="$name"/>" превышает максимальную длину (<xsl:value-of select="$labs"/>)</xsl:element>
			</xsl:if>
			<xsl:if test="(string-length($value) &lt; $length) and ($length &gt; 0)">
				<xsl:element name="error">
					<xsl:attribute name="must">1</xsl:attribute>
					<xsl:text/>Поле "<xsl:value-of select="$name"/>" меньше обязательной длины (<xsl:value-of select="$length"/>)</xsl:element>
			</xsl:if>
		</xsl:if>
	</xsl:template>
	<!-- параметры проверки конкретного документа -->
	<xsl:template name="validate" match="PP">
		<xsl:element name="errors">
			<xsl:if test="UCH_TB=0">
				<xsl:element name="error">
					<xsl:attribute name="must">1</xsl:attribute>
					Флаг 'Учитывать' в платежном поручении не установлен</xsl:element>
			</xsl:if>
			<!--Уровень бюджета принимает следующие значения:
			2 – «бюджет субъекта РФ»;
			3 – «местный бюджет»;
			6 – «средства ЮЛ».-->
			<xsl:if test="not(PAY/BUDG_LEVEL='2' or PAY/BUDG_LEVEL='3' or PAY/BUDG_LEVEL='6') ">
				<xsl:element name="error">
				<xsl:attribute name="must">1</xsl:attribute>Поле "Код бюджета" может принимать только значения "2", "4" или "6" (указано "<xsl:value-of select="PAY/codebudg"/>")</xsl:element>
			</xsl:if>
			
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">КБП Плательщика</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">5</xsl:with-param>
				<xsl:with-param name="value" select="PAY/KOD_UBP"/>
				<!-- При значении поля BUDG_LEVEL = «6», заполняется в соответствии с регистрационными данными, присвоенными ОрФК. При остальных значениях поля BUDG_LEVEL заполняется в соответствии с ПУБП. -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Полное наименование Плательщика</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-2000</xsl:with-param>
				<xsl:with-param name="value" select="PAY/NAME_UBP"/>
				<!-- Полное наименование клиента. Если значение поля BUDG_LEVEL  =  «6», заполняется в соответствии с регистрационными данными, присвоенными ОрФК. При остальных значениях поля BUDG_LEVEL уровня бюджета заполняется в соответствии с ПУБП. -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">КОД ТОФК</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">4</xsl:with-param>
				<xsl:with-param name="value" select="PAY/KOD_TOFK"/>
				<!-- Заполняется в соответствии с централизованным справочником ФК. -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Наименование органа ФК Плательщика</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-2000</xsl:with-param>
				<xsl:with-param name="value" select="PAY/NAME_TOFK"/>
				<!-- Полное наименование ОрФК. Заполняется в соответствии с централизованным справочником ФК. -->
			</xsl:call-template>
			<xsl:if test="round(SUM*100)=0">
				<xsl:element name="error"><xsl:attribute name="must">1</xsl:attribute>Не указана сумма платежного поручения</xsl:element>
			</xsl:if>
			<xsl:if test="DATE=''">
				<xsl:element name="error"><xsl:attribute name="must">1</xsl:attribute>Не указана дата платежного поручения</xsl:element>
			</xsl:if>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Номер платежного поручения</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-10</xsl:with-param>
				<xsl:with-param name="value" select="NOM"/>
			</xsl:call-template>
			<xsl:if test="not(VID_OPER='01')">
				<xsl:element name="error">
					<xsl:attribute name="must">1</xsl:attribute>
					Допустимое значение вида операции "01" (указано "<xsl:value-of select="VID_OPER"/>")</xsl:element>
				<!-- (поле 18)*.  Допустимые значения: 01. -->	
			</xsl:if>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">ИНН Плательщика</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-12</xsl:with-param>
				<xsl:with-param name="value" select="PAY/INN"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">КПП Плательщика</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-9</xsl:with-param>
				<xsl:with-param name="value" select="PAY/KPP"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Наименование Плательщика - по требованию банка</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-160</xsl:with-param>
				<xsl:with-param name="value" select="PAY/CNAME"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Расчетный счет органа ФК Плательщика</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">20</xsl:with-param>
				<xsl:with-param name="value" select="PAY/BS"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">БИК банка Плательщика</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">9</xsl:with-param>
				<xsl:with-param name="value" select="PAY/BIC"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Наименование банка Плательщика</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-255</xsl:with-param>
				<xsl:with-param name="value" select="PAY/NAME_BIC"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Местонахождение банка Плательщика</xsl:with-param>
				<xsl:with-param name="must">-1</xsl:with-param>
				<xsl:with-param name="length">-255</xsl:with-param>
				<xsl:with-param name="value" select="PAY/CITY_BIC"/>
			</xsl:call-template>
			<xsl:if test="string-length(concat(PAY/CITY_BIC,PAY/NAME_BIC)) &gt; 160">
				<xsl:element name="error">
					<xsl:attribute name="must">1</xsl:attribute>Поле "Наименование банка Плательщика" превышает максимальную длину(160)</xsl:element>
			</xsl:if>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Коррсчет банка Плательщика в РКЦ</xsl:with-param>
				<xsl:with-param name="must">-1</xsl:with-param>
				<xsl:with-param name="length">20</xsl:with-param>
				<xsl:with-param name="value" select="PAY/BS_KS"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">ИНН Получателя</xsl:with-param>
				<xsl:with-param name="must">0</xsl:with-param>
				<xsl:with-param name="length">-12</xsl:with-param>
				<xsl:with-param name="value" select="RCP/INN"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">КПП Получателя</xsl:with-param>
				<xsl:with-param name="must">0</xsl:with-param>
				<xsl:with-param name="length">-9</xsl:with-param>
				<xsl:with-param name="value" select="RCP/KPP"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Наименование Получателя - по требованию банка</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-160</xsl:with-param>
				<xsl:with-param name="value" select="RCP/CNAME"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Расчетный счет Получателя</xsl:with-param>
				<xsl:with-param name="must">0</xsl:with-param>
				<xsl:with-param name="length">20</xsl:with-param>
				<xsl:with-param name="value" select="RCP/BS"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">БИК банка Получателя</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">9</xsl:with-param>
				<xsl:with-param name="value" select="RCP/BIC"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Местонахождение банка Получателя</xsl:with-param>
				<xsl:with-param name="must">-1</xsl:with-param>
				<xsl:with-param name="length">-255</xsl:with-param>
				<xsl:with-param name="value" select="RCP/CITY_BIC"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Наименование банка Получателя</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-255</xsl:with-param>
				<xsl:with-param name="value" select="RCP/NAME_BIC"/>
			</xsl:call-template>
			<xsl:if test="string-length(concat(RCP/CITY_BIC,RCP/NAME_BIC)) &gt; 160">
				<xsl:element name="error">
					<xsl:attribute name="must">1</xsl:attribute>Поле "Наименование банка Получателя" превышает максимальную длину(160)</xsl:element>
			</xsl:if>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Коррсчет банка Получателя в РКЦ</xsl:with-param>
				<xsl:with-param name="must">-1</xsl:with-param>
				<xsl:with-param name="length">20</xsl:with-param>
				<xsl:with-param name="value" select="RCP/BS_KS"/>
			</xsl:call-template>
			<xsl:variable name="ORDER_PAY0">
				<xsl:choose>
					<xsl:when test="starts-with(ORDER_PAY,'0')">
						<xsl:value-of select="substring(ORDER_PAY,2,255)"/>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="ORDER_PAY"/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:variable>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Очередность платежа</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">1</xsl:with-param>
				<xsl:with-param name="value" select="$ORDER_PAY0"/>
				<!-- (поле 21)*.  Поле может принимать значения от 0 до 6 (0 – очередность не указана).	 -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Назначение платежа</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">-210</xsl:with-param>
				<xsl:with-param name="value" select="PURPOSE"/>
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Статус юридического лица</xsl:with-param>
				<xsl:with-param name="must">-1</xsl:with-param>
				<xsl:with-param name="length">2</xsl:with-param>
				<xsl:with-param name="value" select="PAYSTATUS"/>
			</xsl:call-template>
			<xsl:variable name="stat_must">
				<xsl:choose>
					<xsl:when test="PAYSTATUS=''">-1</xsl:when>
					<xsl:otherwise>1</xsl:otherwise>
				</xsl:choose>
			</xsl:variable>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Код бюджетной классификации</xsl:with-param>
				<xsl:with-param name="must">
					<xsl:value-of select="$stat_must"/>
				</xsl:with-param>
				<xsl:with-param name="length">20</xsl:with-param>
				<xsl:with-param name="value" select="KBK"/>
				<!-- (поле 104)*. Обязательно для заполнения, если заполнено поле «PAYSTATUS». -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Код ОКАТО (105)</xsl:with-param>
				<xsl:with-param name="must">
					<xsl:value-of select="$stat_must"/>
				</xsl:with-param>
				<xsl:with-param name="length">-11</xsl:with-param>
				<xsl:with-param name="value" select="OKATO"/>
				<!-- (поле 105)*. Обязательно для заполнения, если заполнено поле «PAYSTATUS». -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Показатель основания платежа (106)</xsl:with-param>
				<xsl:with-param name="must">
					<xsl:value-of select="$stat_must"/>
				</xsl:with-param>
				<xsl:with-param name="length">-2</xsl:with-param>
				<xsl:with-param name="value" select="OSNPLAT"/>
				<!-- (поле 106)*. Обязательно для заполнения, если заполнено поле «PAYSTATUS» -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Показатель налогового периода (107)</xsl:with-param>
				<xsl:with-param name="must">
					<xsl:value-of select="$stat_must"/>
				</xsl:with-param>
				<xsl:with-param name="length">-10</xsl:with-param>
				<xsl:with-param name="value" select="NAL_PER"/>
				<!-- (поле 107)*. Обязательно для заполнения, если заполнено поле «PAYSTATUS». -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Показатель номера документа (108)</xsl:with-param>
				<xsl:with-param name="must">
					<xsl:value-of select="$stat_must"/>
				</xsl:with-param>
				<xsl:with-param name="length">-15</xsl:with-param>
				<xsl:with-param name="value" select="NUM_DOK"/>
				<!-- (поле 108)*. Обязательно для заполнения, если заполнено поле «PAYSTATUS». -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Показатель даты документа (109)</xsl:with-param>
				<xsl:with-param name="must">
					<xsl:value-of select="$stat_must"/>
				</xsl:with-param>
				<xsl:with-param name="length">-10</xsl:with-param>
				<xsl:with-param name="value" select="DATE_DOK"/>
				<!-- (поле 109)*. Обязательно для заполнения, если заполнено поле «PAYSTATUS». -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Тип платежа (110)</xsl:with-param>
				<xsl:with-param name="must">
					<xsl:value-of select="$stat_must"/>
				</xsl:with-param>
				<xsl:with-param name="length">-2</xsl:with-param>
				<xsl:with-param name="value" select="TYPE_PL"/>
				<!-- (поле 110)*. Обязательно для заполнения, если заполнено поле «PAYSTATUS». -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Лицевой счет Плательщика</xsl:with-param>
				<xsl:with-param name="must">1</xsl:with-param>
				<xsl:with-param name="length">11</xsl:with-param>
				<xsl:with-param name="value" select="PAY/LS"/>
				<!-- Л/с ФО, НУБП, АУ. Не заполняется в случае представления ФО документов по отдельному счету, открытому в банке для учета средств БУ, л/с которых открыты в ФО. -->
			</xsl:call-template>
			<xsl:call-template name="CheckS">
				<xsl:with-param name="name">Лицевой счет Получателя</xsl:with-param>
				<xsl:with-param name="must">-1</xsl:with-param>
				<xsl:with-param name="length">11</xsl:with-param>
				<xsl:with-param name="value" select="RCP/LS"/>
				<!-- Поле заполняется в случае оформления ПП для осуществления внебанковской операции и наличия необ-ходимости указания ин-формации о л/с контраген-та, по которому подлежит отражение поступления.	 -->
			</xsl:call-template>
			<xsl:for-each select="PPST">
				<xsl:call-template name="CheckS">
					<xsl:with-param name="name">Код бюджетной классификации (строка <xsl:value-of select="position()"/>)</xsl:with-param>
					<xsl:with-param name="must">0</xsl:with-param>
					<xsl:with-param name="length">20</xsl:with-param>
					<xsl:with-param name="value" select="KBK"/>
				</xsl:call-template>
				<xsl:call-template name="CheckS">
					<xsl:with-param name="name">Код цели Плательщика (строка <xsl:value-of select="position()"/>)</xsl:with-param>
					<xsl:with-param name="must">-1</xsl:with-param>
					<xsl:with-param name="length">20</xsl:with-param>
					<xsl:with-param name="value" select="ADD_KLASS"/>
				</xsl:call-template>
				<xsl:call-template name="CheckS">
					<xsl:with-param name="name">Код цели Получателя (строка <xsl:value-of select="position()"/>)</xsl:with-param>
					<xsl:with-param name="must">-1</xsl:with-param>
					<xsl:with-param name="length">20</xsl:with-param>
					<xsl:with-param name="value" select="ADD_KLASS_RCP"/>
				</xsl:call-template>
				<xsl:call-template name="CheckS">
					<xsl:with-param name="name">Месяц финансирования (строка <xsl:value-of select="position()"/>)</xsl:with-param>
					<xsl:with-param name="must">-1</xsl:with-param>
					<xsl:with-param name="length">2</xsl:with-param>
					<xsl:with-param name="value" select="MES_FIN"/>
				</xsl:call-template>
				<xsl:call-template name="CheckS">
					<xsl:with-param name="name">Резервное поле (строка <xsl:value-of select="position()"/>)</xsl:with-param>
					<xsl:with-param name="must">-1</xsl:with-param>
					<xsl:with-param name="length">-40</xsl:with-param>
					<xsl:with-param name="value" select="REZERV"/>
				</xsl:call-template>
			</xsl:for-each>
		</xsl:element>
	</xsl:template>
</xsl:stylesheet>
