Описание языка picoRelations, используемого в ПППС для написания контрольных соотношений по проверке правильности показателей. 1. Синтаксис и примеры написания контрольных соотношений Основными терминами языка являются: ФОРМА, РАЗДЕЛ, ТАБЛИЦА, СПИСОК, ФРАГМЕНТ. ФОРМА – это любая форма отчетности. Каждая форма имеет некий код, делающий форму уникальной в отчетности. Код формы должен состоять из цифр и латинских букв, расположенных в произвольном порядке. ТАБЛИЦА – обособленная часть формы. РАЗДЕЛ ФОРМЫ – это специально выделенная из формы таблица. Форма может включать нескольких разделов. Разбиение на разделы зависит исключительно от организации – автора отчетности и никак не связано с количеством таблиц. По умолчанию в Форме есть только один раздел – раздел 1. Также как и Форма, каждый раздел должен иметь цифробуквенный код, однозначно определяющий его в данной форме. СПИСОК - таблица с нефиксированным количеством строк. ФРАГМЕНТ. Некоторые разделы могут содержать переменное число повторений одной и той же таблицы, но с разными данными и признаком, отличающим одну такую таблицу от другой. Например, в случаях, если надо заполнить одинаковую таблицу для разных субъектов РФ. Каждая такая таблица называется фрагментом. Каждый фрагмент имеет одно или несколько полей в заголовке, одно из которых должно быть уникальным, чтобы однозначно идентифицировать таблицу среди ей подобных. Адресация ячейки. Для доступа к самим цифрам отчетности используется адрес. Адрес значения представляет собой разделенные двоеточием элементы, содержащие либо числа, либо цифробуквенные коды (для обозначения форм и разделов), либо имена специальных переменных line, nextline и col, nextcol. Полный адрес задается как Форма : Раздел : Строка : Графа. Минимальным адресом является Строка : Графа, в этом случае значения Форма и Раздел берутся из текущих значений, назначенных операторами FORM, PART, FORPARTS. Форма может быть пропущена всегда. Если же Форма задана, а Раздел пропущен, то пропуск заменяется символом ::. Строку и Графу опускать нельзя. Внутри операторов FOREACHLINE, FORLINES, ANYLINES, SUMLINES, FORCOLS и FOREACHCOL номера строк и граф могут быть заменены специальными переменными line, nextline и col, nextcol, которые содержат значения строки или графы для текущей итерации цикла. Если искомым значением является строковое (например, код ценной бумаги), может потребоваться использовать какой-либо из его разрядов. Для выделения одного разряда из всего значения используется конструкция ^N, где N – номер разряда. Допустимы следующие конструкции адреса значения: Код_строки : Номер_графы (10:3), Код_раздела : Код_строки : Номер_графы (1r:910:4), Код_формы : Код_раздела : Код_строки : Номер_колонки (1:1r:910:4), Код _формы :: Код_строки : Номер_графы (1::910:4), Код_строки : Номер_колонки ^ Номер_разряда (line:4^5), Код_раздела : Код_строки : Номер_графы ^ Номер_разряда (2:line:4^5), Код _формы : Код_раздела : Код_строки : Номер_графы ^ Номер_разряда (7:2:line:4^5), Код _формы :: Код_строки : Номер_ графы ^ Номер_разряда (7::line:4^5). Код строки, номер графы и номер разряда могут быть записаны как с лидирующими нулями, так и без них. Система измерений останется десятичной. Шаблоны Для сравнения могут быть использованы шаблоны, позволяющие проверять отдельные разряды показателя. Шаблон записывается после слова LIKE в квадратных скобках и представляет собой последовательность конструкций: 2 * (1|2|3|4) - Разряд должен содержать цифру 2 - Разряд может иметь любое значение - Разряд может принимать любое из значений 1,2,3,4 Допустимо указывать несколько шаблонов, разделяя их знаком точка с запятой. При этом условие оказывается выполненным, если значение удовлетворяет хотя бы одному из шаблонов. Пример шаблона, проверяющего пятую графу текущей строки: #IF line:5 LIKE [11*(4|5|7); *(2|3)1*(1|2|3|4|5|7)] … #END Шаблоны могут использоваться в условиях, а также в операциях над группой строк списка, таких как FOREACHLINE, SUMLINES. Правила составления файла соотношений. Т.к. практически во всех операторах используются адреса ячеек, а при этом неуказанные элементы при извлечении значения заменяются значениями по умолчанию, назначаемыми операторами FORM, PART , то в самом начале файла необходимо установить код формы и код раздела по умолчанию с помощью операторов (FORM, PART). Основными блоками программы (Файла) являются конструкции, являющиеся проверками соотношений. Их всего три: #ERROR ... #ENDERR #DETAILS ... #ENDERR #STRUCTURE ... #ENDERR Каждая такая проверка содержит текст соотношения и расчеты, необходимые для проверки. Внутреннее содержание и смысл всех трех конструкций одинаковы, название говорит только о типе соотношения (ERROR - ошибка, DETAILS - требует пояснения и т.д.). #ERROR N Текст соотношения ## Начало соотношения № N ## Область текста, который будет выводиться #END ## нарушении соотношения ## Конец области текста при Тело (необходимые расчеты) #ENDERR ## Тело соотношения ## Конец соотношения № N Внутри себя эти операторы могут содержать различные условия и(или) циклы. И, в свою очередь, сами могут находиться внутри условия(ий) и(или) цикла(ов). Но никогда оператор проверки соотношения не может находиться внутри другого аналогичного оператора. Одним из основных операторов языка является оператор TEST. Им осуществляется проверка заданного условия соотношения, и, в случае его невыполнения, создается и выводится текст нарушения соотношения. TEST не содержит вложенных операторов. Присвоение и условие. Для присвоения значения переменной или ячейке таблицы используется оператор SET. Левая часть должна содержать адрес ячейки или имя переменной, правая – выражение для присвоения. Пример. #SET a = 10:3 + 10:4 #SET 1:1:100:4 = 1::90:3*(a+b) Для создания условий используется оператор #IF Условие ... #END В качестве условий могут быть использованы обозначения: =, !=, <, <=, >, >= (равно, не равно, меньше, меньше или равно, больше, больше или равно). Для конструирования сложных условий используются слова NOT, AND, OR, IN и скобки. Пример условий. (110:3 < 110:4) AND (110:3 > 110:4*2) (line:4^3=1) AND ((line:4^5=2) OR (line:4^5=6) OR (line:4^5=7)) (7:4:5:3 in [’aaa’, ‘bbb’, ‘ccc’]) Пример файла проверки соотношений. #FORM 1 #PART 1 #ERROR 1 Стр. 110, гр. 3, 4 = сумма показателей строк 111, 112, 113, 114, гр. 3, 4. #END ## Сами проверки #TEST 110:3=111:3+112:3+113:3+114:3 #TEST 110:4=111:4+112:4+113:4+114:4 #ENDERR ## Соотношение, требующее пояснения #DETAILS 2 Если (стр. 274, гр. 3, 4)/(стр. 300, гр. 3, 4) расшифровку в пояснительной записке. #END х 100% >= 5%, требуется дать ## Обратите внимание. В операторе проверки для соотношений, требующих пояснений указывается ## условие, обратное тому, что содержится в тексте пояснения. ## Это связано с тем, что оператор TEST срабатывает при невыполнении условия. ## Если же условие выполняется, то пояснения не возникает. #TEST (274:3/300:3)*100<5 #TEST (274:4/300:4)*100<5 #ENDERR #IF (110:3 < 110:4) AND (110:3 > 110:4*2) #ERROR 3 Стр. 110, гр. 3, 4 = сумма показателей строк 111, 112, 113, 114, гр. 3, 4. #END #SET s=line:1 #SET a =0 #FIND 2, 1, s #SET a=a+line:2 #END #TEST line:2=a #ENDERR #ERROR 4 Стр. 110, гр. 3, 4 = сумма показателей строк 111, 112, 113, 114, гр. 3, 4. #END #TEST 110:3=111:3+112:3+113:3+114:3 #TEST 110:4=111:4+112:4+113:4+114:4 #ENDERR #END Работа с циклами. Циклы используются для просмотра всех элементов по заданному условию. Это может быть либо перебор по графам и строкам внутри таблицы или списка, перебор клонов (вариантов таблиц) внутри раздела, перебор разделов внутри формы. Для перебора граф внутри таблицы используется цикл FORCOLS. Условием данного цикла является перечень граф для обработки. Значения кода формы и раздела должны быть указаны ранее операторами FORM и PART. Графы для обработки могут быть заданы как просто перечислением, так и диапазоном. Или комбинацией перечисления и диапазона. Значение текущей графы содержится в переменной col, значение следующей – в nextcol. Пример: ... #FORCOLS 3, 5, 7..10, 13 … #END … #ERROR 23 Показатель каждой строки с 020 по 220 проверяется: с графы 5 по графу 10 каждая следующая графа должна быть больше предыдущей. #END #FORLINES 020..200 #FORCOLS 5..10 #TEST line:col >= line:nextcol #END #END Внутри циклов FORLINES, FOREACHLINE переменная line содержит значение текущей обрабатываемой строки, а nextline - значение строки, следующей за обрабатываемой строкой. Для работы со строками внутри таблицы используется цикл FORLINES. Это оператор, аналогичный FORCOLS, но используемый для строк таблицы. Для работы со списками используется цикл FOREACHLINE, который обрабатывает все строки заданного раздела, кроме итоговой строки. Параметром цикла FOREACHLINE является только номер раздела, т.к. строки списка не нумеруются, а их количество нефиксировано. Единственной пронумерованной строкой списка является строка, содержащая суммарное (итоговое) значение, ее номер - нуль (0). Внутри циклов FORLINES, FOREACHLINE переменная line содержит значение текущей обрабатываемой строки, а nextline - значение строки, следующей за обрабатываемой. Пример. #FORM 3 #PART 1 #ERROR 1 Показатели каждой строки разделов 1 проверяются: гр. 6 = гр. 3 + гр. 4 - гр. 5. #END ## Использование конструкции FORLINES для диапазонов строк #FORLINES 10..79,80..89,90..99 #TEST line:6=line:3+line:4-line:5 #END #ENDERR #PART 2 #ERROR 4 Строка "Итого", гр. 3, 4 = сумма показателей предыдущих строк раздела, гр. 3, 4. #END #SET a=0 #SET b=0 ## Накапливание суммы по всем строкам раздела 2 #FOREACHLINE 2 #SET a=a+line:3 #SET b=b+line:4 #END #TEST 0:3=a #TEST 0:4=b #ENDERR При работе со списками также можно использовать операторы SUMLINES и ANYLINE. SUMLINES является простым оператором, который не содержит вложенных элементов. При выполнении условия суммирует значения заданной графы всех строк заданного раздела в заданную переменную. Если условие не задано, суммируются все строки. Пример. Предыдущее соотношения можно записать с помощью оператора SUMLINE без условия. #PART 2 #ERROR 4 Строка "Итого", гр. 3, 4 = сумма показателей предыдущих строк раздела, гр. 3, 4. #END #SET a=0 #SET b=0 ## Накапливание суммы по всем строкам раздела 2 #SUMLINES a, 2, 3 #SUMLINES b, 2, 4 #TEST 0:3=a #TEST 0:4=b #ENDERR ## Использование SUMLINE с условием. #ERROR 5 Стр. 024, гр. 3, 4 раздела 1 = сумма вложений в облигации в подразделе 4.1, гр. 5, 6, третий и пятый разряды кода которых (гр. 4 подраздела 4.1) Х3 = 1, Х5 = 4 или 5 или 6 или 7. #END #PART 1 #SET a=0 #SET b=0 #SUMLINES a, 4.1, 5, (line:4^3=1) AND ((line:4^5=2) OR (line:4^5=6) OR (line:4^5=7)) #SUMLINES b, 4.1, 6, (line:4^3=1) AND ((line:4^5=2) OR (line:4^5=6) OR (line:4^5=7)) #TEST 24:3=a #TEST 24:4=b #ENDERR Оператор ANYLINE также не содержит вложенных элементов. Оператор последовательно перебирает все строки цикла и срабатывает в случае выполнения условия. Результатом работы оператора (т.е. если существует хоть одна строка, удовлетворяющая условию), как и у оператора TEST, является вывод текста соотношения. Если в условии задействованы строки раздела, для их обозначения используются переменные line и nextline. Пример. #Part 1 #DETAILS 1 Если гр. 7 <> 0, то в специальном разделе пояснительной записки требуется указать наименование банка, векселя которого приобретены страховой организацией, номер его лицензии (разрешения) на осуществление банковских операций и наименование уполномоченного органа, выдавшего лицензию. #END #ANYLINE 5, line:7=0 #ENDERR Для обработки нескольких разделов используется оператор FORPARTS, параметром которого является перечень разделов, который может быть задан как просто перечислением разделов, так и диапазоном, если коды разделов являются целочисленными. Внутри оператора текущий раздел обозначается переменной PART. Пример. #ERROR 1 Показатель каждой строки с 030 по 220 разделов 3.7,3.8,3.9,3.10 проверяется: гр.3 >= гр. 6 #END #FORPARTS 3.7,3.8,3.9,3.10 #FORLINES 30..220 #TEST line:3 >= line:6 #END #END 2. Структура выходного файла проверки соотношений Структура файла tests.xml, сформированного модулем picotests.htm и содержащего результаты проверки контрольных соотношений: <?xml version="1.0" encoding="windows-1251"?> <kinds regno="ИНН или другой уникальный атрибут субъекта" period="Отчетный период в формате ДД.ММ.ГГ" compname="Название субъекта" testdate="Дата проверки в формате ДД.ММ.ГГГГ" programname="Название проверяющей программы"> <hats> <!—Дополнительные заголовки --> <hat caption="" value=""> <hat caption="" value=""> ... </hats> <present> <!—Информация о проверке комплектности представленных файлов --> <formpresent id="1" required="1" present="1"/> <formpresent id="2" required="1" present="1"/> <formpresent id="2a" required="0" presented="0"/> .. </present> <kind id="1"> <!—Информация о нарушениях в соотношениях --> <relform id="7"> <!—В какой форме нарушение --> <ref cloneset="6.2" table="6.2"> <!—В каком фрагменте и таблице нарушение --> <error no="2" cut="1"> <!—Номер контрольного соотношения --> <text>...</text> <!—Текст контрольного соотношения --> <details clone="1" <!—Детали нарушения, фрагмент --> line="10" <!—строка --> col="3" <!—графа --> rank="0" <!—разряд --> diff="0"> <!—расхождение --> <param name=""></param> <!—Значения параметров фрагмента --> <param name=""></param> … <col id="1">..</col> <!—Значения граф для отображения ИНН и т.п. --> <col id="2">..</col> <col id="3">..</col> </details> </error> .. </ref> .. </relform> .. </kind> </kinds>