Переключение темы
Для обеспечения максимальной гибкости настройки система Айтида во многих модулях поддерживает ввод и выполнение пользовательских скриптов, которые позволяют значительно расширить стандартный функционал системы, адаптировав его под конкретные потребности конечного клиента. Выполнением таких скриптов занимается модуль системы, называемый Вычислитель. Основной задачей Вычислителя является выполнение программ (скриптов), написанных на специальном языке. Отличительной особенностью этого языка является то, что он очень тесно взаимодействует с данными в базе данных посредством Понятий. В остальном данный язык является простым функциональным языком, оптимизированным под вычисление различных выражений.
Набор символов
Набор символов Вычислителя состоит из букв, цифр, символа @ и символов пунктуации, которые имеют специальное значение. Вы строите программу в Вычислителе, комбинируя символы в осмысленные операторы.
Буквы, цифры и подчеркивание
Набор символов Вычислителя содержит прописные и строчные буквы латинского и русского алфавитов, 10 десятичных цифр арабской системы исчисления, символ подчеркивания (_) и символ @.
Прописные английские буквы:
A B C D E F G H I J K L M N O P Q R S T U V W X Y ZСтрочные английские буквы:
a b c d e f g h i j k l m n o p q r s t u v w x y zПрописные русские буквы:
А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю ЯСтрочные русские буквы:
а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю яДесятичные цифры:
0 1 2 3 4 5 6 7 8 9Символ подчеркивания
_Символ
@
Эти символы используются для формирования понятий, констант, идентификаторов и ключевых слов, описанных далее.
Интерпретатор Вычислителя обрабатывает прописные и строчные буквы, как одинаковые символы. Например, если в идентификаторе использована строчная буква a, то Вы можете заменить ее на прописную букву A.
Разделительные символы
Пробел, смена строки, возврат каретки и символ новой строки называются разделительными символами, т.к. они выполняют функцию пробелов между словами и строками в напечатанной странице. Эти символы отделяют задаваемые пользователем элементы, например, константы и идентификаторы, от других элементов программы.
Интерпретатор Вычислителя игнорирует разделительные символы, если они не служат для целей разделения или не являются компонентами символьных констант или строковых литералов. Таким образом, можно использовать дополнительные разделительные символы для улучшения восприятия программы. Интерпретатор рассматривает комментарии, как разделительные символы. (Комментарии рассматриваются в разделе "Комментарии".)
Знаки пунктуации и специальные символы
Знаки пунктуации и специальные символы из набора символов имеют самое разное предназначение, от организации текста программы до определения задач, которые будут выполнены программой. В Таблице 1 приведен список знаков пунктуации и специальных символов из набора символов Вычислителя.
Таблица 1. Знаки пунктуации и специальные символы
| Символ | Название | Символ | Название |
|---|---|---|---|
| , | запятая | { | левая фигурная скобка |
| . | точка | } | правая фигурная скобка |
| ; | точка с запятой | < | левая угловая скобка |
| : | двоеточие | > | правая угловая скобка |
| ? | знак вопроса | ! | восклицательный знак |
| ' | одинарная цитатная скобка | / | знак деления |
| " | двойная цитатная скобка | + | плюс |
| ( | левая круглая скобка | % | процент |
| ) | правая круглая скобка | * | звездочка |
| [ | левая прямоугольная скобка | - | минус |
| ] | правая прямоугольная скобка | = | равно |
Все эти символы имеют специальное значение. В данном руководстве описывается их использование. Любой знак пунктуации, не приведенный в Таблице 1, может быть использован только в символьных константах и комментариях.
Операторы
"Операторы" это символы (состоящие из одного символа или комбинации символов), которые задают манипуляции над значениями. Каждый символ интерпретируется как отдельный элемент, называемый "лексемой".
В Таблице 2 содержится список унарных операторов Вычислителя с их именами. В Таблице 3 содержится список бинарных операторов с их именами. Операторы нужно задавать так, как они показаны в таблицах, без разделительных знаков в многосимвольных операторах. Обратите внимание на то, что знак минуса появляется в двух таблицах. Его унарная или бинарная интерпретация зависит от контекста, в котором он появляется.
Таблица 2. "Унарные операторы"
| Оператор | Название |
|---|---|
| ! | логическое НЕ |
| - | арифметическое отрицание |
| ++ | арифметическое инкрементирование |
| -- | арифметическое декрементирование |
Таблица 3. "Бинарные операторы"
| Оператор | Название | Оператор | Название |
|---|---|---|---|
| + | сложение | != | неэквивалентность |
| - | вычитание | AND | логическое И |
| * | умножение | OR | логическое ИЛИ |
| / | деление | XOR | логическое исключающее ИЛИ (XOR) |
| & | битовое И | = | простое присвоение |
| | | битовое ИЛИ | += | присвоение со сложением |
| ^ | битовое исключающее ИЛИ (XOR) | -= | присвоение с вычитанием |
| % | остаток от деления | *= | присвоение с умножением |
| <= | меньше или равно | /= | присвоение с делением |
| > | больше | &= | присвоение с битовым И |
| >= | больше или равно | |= | присвоение с битовым ИЛИ |
| == | эквивалентно (равно) | ^= | присвоение с битовым XOR |
| $ | Вхождение левого строкового оператора в правый. Проверка, входит ли подстрока в другую строку. |
Константы
Константа это число, символ или строка символов, которая в программе используется, как значение. Значение константы нельзя изменить.
В Вычислителе есть четыре вида констант: целые, с плавающей точкой, символьные и константы с типом дата и время.
Целые константы
Синтаксис:
цифры
0xцифры
0Xцифры
"Целая константа" это десятичное, восьмеричное или шестнадцатеричное число, которое представляет собой целое значение в одной из следующих форм:
- "Десятичная константа" имеет форму одной или нескольких цифр (от
0до9). - "Шестнадцатеричная константа" имеет форму
0xцифрыили0Xцифры, где цифры это одна или несколько шестнадцатеричных цифр (от0до9и прописные или строчные буквы отaдоf), указание0xили0Xобязательно.
Таблица 4. Примеры целых констант
| Десятичные | Шестнадцатеричные |
|---|---|
| 10 | 0xa или 0xA |
| 132 | 0x84 |
| 32179 | 0x7db3 или 0x7DB3 |
Целые константы всегда имеют положительные значения. Если нужно использовать отрицательное значение, то поместите знак минус (-) перед константой для формирования выражения с отрицательным значением. В данном случае знак минус интерпретируется как унарный арифметический оператор отрицания.
Каждой целой константе на основании ее значения присваивается соответствующий тип. Целые константы представленные в десятичном виде всегда являются целым числом с диапазоном значений от -2147483648 до 2147483647. Тип целой константы представленной в шестнадцатеричном виде определяется ее значением. Если значение не превосходит 0xFFFFFFFF, то считается что константа является целым числом. В противном случае, константа преобразуется в двоичный массив.
Константы с плавающей точкой
Синтаксис: [цифры][.цифры][E|e-[+]цифры]
"Константа с плавающей точкой" это десятичное число, которое соответствует действительному числу со знаком. Значение действительного числа со знаком состоит из целой части, дробной части и показателя степени. "Цифр" может не быть или их может быть несколько (от 0 до 9), а E (или e) это символ экспоненты. Можно опустить либо цифры до десятичной точки (целая часть числа) либо после десятичной точки (дробная часть числа), но не одновременно. Если используется показатель степени, то только в этом случае можно не вводить десятичную точку. Показатель степени состоит из символа экспоненты (E или e) за которым следует постоянное целое значение. Целое значение может быть отрицательным. Нельзя использовать разделительные символы между цифрами или символами константы.
Константы с плавающей точкой всегда имеют положительные значения. Если нужно использовать отрицательное значение, то поместите знак минус (-) перед константой для формирования выражения с отрицательным значением. В данном случае знак минус интерпретируется как арифметический оператор.
Все константы с плавающей точкой имеют тип вещественное число.
Следующие примеры иллюстрируют некоторые формы констант и выражений с плавающей точкой:
15.75
1.575E1
1575e-2
-0.0025
-2.5e-3
25E-4
Строковые константы
Синтаксис: "символы"["символы"]...
Строковая константа - это последовательность символов, которая заключена в двойные или одинарные кавычки. Например, строковая константа может быть такой:
"Это строковая константа."
В строковой константе "символы" могут содержать любые символы, в том числе перевод строки / возврат каретки. При необходимости указать внутри константы кавычку, которая была использована в качестве ограничителя константы, необходимо дважды повторить данный символ. Например.
"ООО ""Ромашка"" "
Традиционный способ формирования строк литералов, которые не умещаются на одной строке, состоит в том, что константа разбивается на две части и между ними добавляется знак сложения (+). Например, строковая константа
"Эта длинная константа " +
"не помещается на одной строке."
идентична строке
"Эта длинная константа не помещается на одной строке."
Константы, имеющие тип дата и время
Синтаксис: {ДД.ММ.ГГГГ ЧЧ:ММ:СС}
Константа, имеющая тип дата и время – это дата и время, записанное десятичными цифрами с использованием в качестве разделителя дней, месяцев и годов точку (.) или знак деления (/), а в качестве разделителя часов, минут и секунд двоеточие (. При этом дата должна быть отделена от времени пробелом. Поддерживается три формата представления даты:
ДД.ММ.ГГ– два символа номера дня, два символа номера месяца и два символа номера годаДД.ММ.ГГГГ– два символа номера дня, два символа номера месяца и четыре символа номера годаГГГГ.ММ.ДД– четыре символа номера года, два символа номера месяца и два символа номера дня
Время может быть не указано. Если время указано, то оно обязательно должно содержать часы и минуты. Секунды могут быть пропущены. Константы данного типа должны быть расположены в одной строке. Перенос на другую строку не допускается. Между символом открывающей фигурной скобки и первой цифрой могут располагаться только символы пробела. Другие символы разделители не допускаются. Примеры констант с типом дата и время:
{01.01.2010 12:00:00}{2010-03-31 11:58}{2010-03-31}
Константы, задаваемые в справочнике констант системы
Синтаксис: _ИмяКонстанты
Система Айтида в своем составе имеет справочник констант. В данном справочнике пользователь имеет возможность описать необходимые ему константы без использования программирования скриптов. Это удобно, когда необходимо определить какие-либо параметры, используемые во всей системе. Например. Значение константы _БУХУЧЕТ определяет, ведется ли в системе Айтида бухгалтерский учет. Значение этой константы может использоваться в любых скриптах и выражениях используемых при настройке системы Айтида.
Отличительной особенностью использования таких констант, является то, что их значение может изменяться во времени, при этом для каждого интервала времени может быть задано свое значение константы. Для определения какой именно интервал времени для констант должен использоваться задается встроенной функцией ДАТАКОНСТАНТ([Дата]) (CONSTANTSDATE([Дата]))
Идентификаторы
Синтаксис: буква|_|@[буква|цифра|_]...
"Идентификаторы" - это имена, которые Вы присваиваете переменным и функциям в вашей программе. Идентификатор это последовательность из одной или нескольких букв, цифр, знаков подчеркивания (_) или символа @, которая обязательно начинается с буквы, подчеркивания или символа @. Идентификатор может содержать любое число символов. Идентификатор создается его заданием в объявлении переменной ключевым словом PUBLIC или LOCAL, или при первом присвоении ему значения. После этого его можно использовать в операторах программы для ссылки на связанный с ним элемент. Интерпретатор Вычислителя рассматривает прописные и строчные буквы как одинаковые символы, поэтому нельзя создавать разные идентификаторы с одинаковым произношением, но с одной или несколькими буквами иного размера. Идентификаторы не могут иметь произношение и написание, совпадающее с ключевыми словами языка. Ключевые слова описаны в разделе "Ключевые слова".
Понятия
Синтаксис: @буква|_|@[буква|цифра|_]...
Система Айтида в своем составе имеет справочник понятий. В данном справочнике пользователь имеет возможность описать необходимые ему понятия. Понятие – это поименованные правила получения информации из базы данных. Другими словами, понятия содержат в себе информацию о том, как получить значение того или иного элемента из базы данных. Например. В системе есть справочник товаров. Во многих печатных формах используется элемент «Наименование товара». Доступ к данному элементу всегда осуществляется через внутренний код товара в базу данных. Для того чтобы, каждый раз, когда требуется получить наименование товара не писать запрос к базе данных для получения этого наименования, можно описать понятие @НаименованиеТовара, в котором указать правило (запрос) для получения наименования, используя код товара. После этого везде, где необходимо, можно будет использовать вместо запроса к базе данных созданное понятие. Понятия могут использовать в своем описании другие понятия. Уровень вложенности таких описаний не ограничен. Также для понятия можно определить значение по умолчанию, которое будет использовано в случае, если для вычисления значения понятия не хватает какой-либо информации.
Понятия могут быть трех типов.
- Базовое понятие. Это понятие, которое заменяет собой имя в таблице базы данных. Например, понятие @Товар является ссылкой на поле nn. Таким образом, когда Вычислитель встречает данное понятие, он ищет в текущем контексте вычислений поле или переменную с именем nn. Если такая переменная или поле доступны, то будет использовано их значение. Если такого поля нет, то будет использовано значение, указанное в качестве значения по умолчанию для понятия.
- Понятие SQL выражение. Это понятие, для вычисления значения которого необходимо выполнить указанный в описании SQL запрос к базе данных. Например, понятие @НаименованиеТовара является SQL запросом к базе данных "SELECT name FROM sprnn WHERE nn= @Товар". Когда Вычислитель встречает данное понятие, он в первую очередь вычисляет значение использованного вложенного понятия @Товар. Затем Вычислитель выполняет запрос к базе данных, используя текущее соединение, для определения названия товара.
- Понятие выражение. Это понятие, которое является выражением, значение которого необходимо вычислить. Например, понятие @ПолноеНаименованиеТовара можно определить как выражение @НаименованиеТовара + @ТоварОбъем. Далее, в отчетных формах можно будет использовать созданное понятие. В случае, если в будущем возникнет необходимость выводить в отчетах не объем товара, а например, его вес, то для этого не надо будет менять большое количество отчетных форм, а достаточно будет изменить правило формирования полного наименования товара.
Ключевые слова
"Ключевые слова" это заранее определенные идентификаторы, которые имеют для интерпретатора Вычислителя специальное значение. Их можно использовать только так, как они определены. Имя элемента программы не может совпадать по произношению и написанию с ключевым словом. В языке Вычислителя имеются следующие ключевые слова:
IF, WHILE, BREAK, CONTINUE, TRY, CATCH, THROW, BEGIN, END, RETURN, PUBLIC, LOCAL, FUNCTION, ФУНКЦИЯ, CONCEPT, ПОНЯТИЕ, CONSTANT, КОНСТАНТА, OBJECT, ОБЪЕКТ, SQL, SQLAGGREGATE, SQLERROR
Блок команд
Блок команд может состоять из одной или нескольких команд, разделенных точкой с запятой (;). Весь блок заключается в фигурные скобки. Если в блоке только одна команда, то её можно не заключать в фигурные скобки. Если блок команд заключен в фигурные скобки, то после закрывающей фигурной скобки точка с запятой не требуется, а перед ней — требуется.
Блок команд может не содержать команд. В этом случае его требуется заключать в фигурные скобки.
Примеры:
js
if ( Условие )
{} // Блок команд без самих команд.
if ( Условие )
return false; // Блок команд из одной команды без фигурных скобок.
if ( Условие )
{
// Блок команд из нескольких команд, заключенных в фигурные скобки.
Сообщение( "Условие не выполнено." );
return false;
}Слово IF
Условный оператор, который позволяет выполнять действия только в том случае, если выполняется указанное в нем Условие.
Синтаксис
js
IF ( Условие )
БлокКомандИстина
[ELSE БлокКомандЛожь]- Условие. Выражение, значение которого может быть интерпретировано как Истина или Ложь. Допустимые типы:
- Логический.
- Числовой. Значение 0 будет интерпретировано как Ложь, все остальные — как Истина.
- Другие типы значений вызовут ошибку исполнения программы.
- БлокКомандИстина. Блок команд, которые будут выполнены в случае, если значение Условия будет интерпретировано как Истина. Этот блок команд должен присутствовать обязательно.
- Ключевое слово ELSE. Если требуется выполнить блок команд в случае невыполнения условия, то необходимо добавить это ключевое слово. Если такой необходимости нет, то ключевое слово ELSE можно не указывать.
- БлокКомандЛожь. Блок команд, которые будут выполнены в случае, если значение Условия будет интерпретировано как Ложь. Этот блок команд должен присутствовать обязательно, если указано ключевое слово ELSE. Иначе его не должно быть.
Слово WHILE (ПОКА)
Условный оператор цикла, который позволяет выполнять действия до тех пор, пока выполняется указанное в нем УсловиеЦикла.
Синтаксис
js
WHILE ( УсловиеЦикла )
БлокКомандлибо
js
ПОКА ( УсловиеЦикла )
БлокКомандУсловиеЦикла. Выражение, значение которого может быть интерпретировано как Истина или Ложь. Допустимые типы:
- Логический.
- Числовой. Значение 0 будет интерпретировано как Ложь, все остальные — как Истина.
- Другие типы значений вызовут ошибку исполнения программы.
Значение выражения будет вычисляться при входе в цикл и каждый раз при завершении выполнения блока команд. БлокКоманд должен либо влиять на значение выражения, либо содержать ключевое слово BREAK для принудительного выхода из цикла. Иначе цикл будет бесконечным.
БлокКоманд. Блок команд, которые будут выполнены в случае, если УсловиеЦикла выполнилось. Этот блок команд должен присутствовать обязательно.
Слово BREAK
Принудительный выход из цикла. Если блок команд цикла содержит ключевое слово BREAK, то при его выполнении будет произведен выход из цикла без выполнения оставшихся команд блока.
Синтаксис
js
WHILE ( УсловиеЦикла )
{
Команды блока;
BREAK;
Команды блока;
}Обычно это слово помещают в условный оператор, чтобы при выполнении некоего условия прервать выполнение цикла.
Пример:
js
WHILE ( Условие )
{
IF ( СООБЩЕНИЕ( "Продолжить?", "Ожидание", 4 ) == 6 ) // Если нажали "Да"
{
// повторная попытка соединения
}
ELSE // Если нажали "Нет"
{
BREAK;
}
}В данном примере в цикле производятся попытки соединения. Также у пользователя запрашивается согласие на продолжение ожидания соединения. Если пользователь не согласен, то производится принудительный выход из цикла.
Слово CONTINUE
Принудительный повтор цикла без выполнения последующих команд блока. Если блок команд цикла содержит ключевое слово CONTINUE, то при его выполнении будет произведен возврат к проверке условия цикла без выполнения оставшихся команд блока.
Синтаксис
js
WHILE ( УсловиеЦикла )
{
Команды блока;
CONTINUE;
Команды блока;
}Обычно это слово помещают в условный оператор, чтобы при выполнении некоего условия не выполнять другие команды блока.
Пример:
js
// Не чеки продажи/возврата/покупки/возврата покупки пропускаем
WHILE ( !КОНЕЦКОНТЕКСТА( "Чеки" ) )
{
IF ( !ВСПИСКЕ( Чеки.checktype, 0, 1, 2, 3, 6, 11, 12 ) )
{
//------- Если нашли чек,…
ПРОПУСТИТЬ( 1, "Чеки" );
CONTINUE;
}
m_doccode = Чеки.doccode;
m_docic = 0;
// Дальнейшая обработка
}В данном примере в цикле производится обработка загруженных чеков. Но некоторые типы чеков не нуждаются в такой обработке, и они пропускаются. Команды, предшествующие ключевому слову CONTINUE, должны как-то влиять на условие цикла, для того чтобы не произошло зацикливание. В данном примере роль изменения условия играет переход на следующую запись просматриваемой таблицы.
Слово RETURN
Принудительный выход из функции. Если блок команд функции содержит ключевое слово RETURN, то при его выполнении будет произведен выход из функции без выполнения оставшихся команд блока.
Синтаксис
js
RETURN [Выражение];Если указано Выражение, то перед возвратом из функции оно будет вычислено, и его результат будет считаться результатом выполнения функции.
Пример:
js
IF ( ПУСТО( Токен ) )
{
СООБЩЕНИЕ( "Не определен токен.", "Отправка чека" );
RETURN false;
}В данном примере в случае отсутствия обязательного параметра выводится сообщение и выполняется выход из функции со значением Ложь.
Слово TRY/CATCH
Оператор TRY/CATCH позволяет организовать безопасное выполнение блока команд. Безопасное означает, что в случае возникновения ошибок выполнения в блоке команд работа всей программы не завершится ошибкой, а будет продолжена либо с команд блока CATCH, либо с команд, следующих за блоком TRY.
К ошибкам исполнения относятся все возможные проблемы, которые могут произойти. Это могут быть ошибки вычисления выражений: например, в выражении может быть указана неизвестная переменная, тогда это вызовет исключение. Либо вычисление выражения привело к недопустимому индексу в массиве. Либо возникли проблемы во внешних функциях, и они вызвали общее исключение защиты. Во всех этих случаях выполнение программы не будет прервано, если блок команд заключен в TRY. Также возможна программная генерация исключения в необходимых случаях — ключевым словом THROW.
Синтаксис
js
TRY
БлокКоманд
[
CATCH [(Переменная)]
БлокКоманд
]Пример:
js
try
{
ТекстОшибки = "Сервер " + АдресСервера + CHR( 13 ) + "вернул сообщение об ошибке: " + CHR( 13 );
Соединение = HTTPCONNECT( АдресСервера, "", true, BonusAPI.ИМЯФАЙЛАЖУРНАЛА( "", "TEYCA_api_log", true ) );
Ответ = ПЕРЕКОДИРОВАТЬ( HTTPPOST( Соединение, Ресурс, ТелоЗапроса, "Заголовки" ), "UTF-8", "ANSI" );
//сообщение( ответ );
IF ( !BonusAPI.TEYCA_ПРОВЕРКАНАОШИБКИ( @Ответ ) ) THROW ( Ответ );
}
catch ( ТекстСообщения )
{
HTTPCLOSE( Соединение );
IF ( !ПУСТО( ТекстСообщения ) )
СООБЩЕНИЕ( ТекстСообщения, "TEYCA" );
RETURN "";
}
HTTPCLOSE( Соединение );
RETURN Ответ;В данном примере в защищаемый блок помещены команды соединения с сервером по протоколу HTTP. Исключение может возникнуть как во внешнем контуре, связанном с HTTP-клиентом, так и в результате получения ошибочного ответа от сервера. Во втором случае вызывается программное исключение словом THROW. Команды блока CATCH отработают в случае любого из возникших исключений. Если это было программное исключение, т. е. был передан текст сообщения об ошибке, то будет выведено сообщение об ошибке. Иначе будет выведено общее сообщение об ошибке.
Слово PUBLIC
Объявление глобальной переменной. При обычном объявлении переменной (присваивании ей значения) переменная становится локальной и уничтожается при завершении выполнения функции. Если переменную объявить глобальной, то она будет доступна во всех функциях и не будет уничтожаться ни при каких условиях.
Синтаксис
js
PUBLIC ИмяПеременной [, ИмяПеременной[,…]];Список имен может содержать несколько переменных. По умолчанию переменные объявляются логическими со значением Ложь. Переменная может быть объявлена глобальной после присвоения ей значения. В таком случае она будет переведена из локальной в глобальную область.
Примеры:
js
PUBLIC ИмяФайлаЖурнала, АдресСервера;js
PUBLIC ИНДЕКСУСТРОЙСТВАККМ, _ИМЯКАССИРА, _ТИПДОКУМЕНТАОСНОВАНИЯ, _ИДДОКУМЕНТАОСНОВАНИЯ, _ПЕЧАТАТЬНАЛОГИ, _ПЕЧАТАТЬСКИДКИ, _ОПРЕДЕЛЯТЬКОДЫНАЛОГОВ;
PUBLIC ВСЕГОБЕЗНАЛ, ВСЕГОНАЛ, ВСЕГОКРЕДИТ, ВСЕГОСЕРТИФИКАТЫ, ВСЕГОПРОЧАЯОПЛАТА;
PUBLIC _СТАВКАНДС_БЕЗНДС, НомерЧекаККМ, НомерСменыККМ, КОЛИЧЕСТВОСИМВОЛОВЧЕКОВОЙЛЕНТЫ, ШРИФТТЕКСТАДЛЯНЕФИСКАЛЬНОЙПЕЧАТИ;
PUBLIC _РАБОТАСЕГАИС, _ККТ_ШИРИНА_ЛЕНТЫ, _СУММАСКИДКИВСЕГО;
PUBLIC ИмяТаблицыСтрокЧека, _ПЕЧАТАТЬСКИДКИ, ТекстЧека, _ВСЕГООПЛАТАБОНУСАМИ, _ВСЕГОСУММАЧЕКАРАСЧЕТНАЯ, ВерсияФФД;
PUBLIC _КОЛИЧЕСТВОКОПИЙСЛИПА, НомерЛУПлатежнойСистемы, TerminalNumber, ЕстьНеявныеОшибкиПС, БанковскиеПозицииЧека, ИДТЕРМИНАЛАИЗПРОФИЛЯ, _ККТСУММАБЕЗНАЛ;В данных примерах объявляются переменные, значения которых будут доступны во всех функциях и скриптах.
Слово __SQL
Слово позволяет писать текст SQL-запросов не в константных строках, а как простой текст запроса с подсветкой синтаксиса.
Синтаксис
js
__SQL( [ИмяКонтекста] )
{
ТекстЗапроса
}
[
SQLERROR
БлокКоманд
]В заголовке ключевого слова __SQL может быть указано имя контекста, в который необходимо поместить результат выполнения запроса. Текст запроса может содержать вхождения вида [[Выражение]]. Значения выражений будут вычислены, приведены к строковому виду и подставлены в запрос. В случае возникновения ошибки выполнения запроса будет выполнен блок команд из слова SQLERROR.
Примеры:
js
IF ( !ПУСТО( НовоеСвойствоЧека ) )
{
try
{
__SQL( )
{
UPDATE chequelist
SET pex = '[[ STDF( НовоеСвойствоЧека ) ]]'
WHERE fr_code = '[[ КОДОБОРУДОВАНИЯ ]]'
AND identity_column = [[ ИДЕНТИФИКАТОРЧЕКА ]]
}
SQLERROR
{
СООБЩЕНИЕ( _ERRORDESCRIPTION, "ошибка записи фискальных данных в чек" );
RETURN false;
}
}
catch( )
{
РезультатЗаписиСвойств = false;
}
}js
__SQL( "mark_in_spec" )
{
-- ТАБЛИЦА С ТОВАРАМИ ДЛЯ ПОСТУПЛЕНИЯ КОДОВ МАРКИРОВКИ СИСТЕМЫ МАРКИРОВКА
INSERT INTO mark_in_spec ( ic, ent, linenum, nn, name, gtin, cena, kolp, summa, ed, okei, kodn, barcode, article, country )
VALUES ( '[[ ИДДокумента ]]', '[[ STDF( Предприятие ) ]]', [[ НомерСтроки ]], '[[ Товар ]]', '[[ STDF( НаименованиеТовара, 250 ) ]]',
'[[ STDF( мGTIN, 15 ) ]]', [[ STR( Цена, 16, 6 ) ]], [[ STR( Количество, 16, 3 ) ]], [[ STR( Сумма, 16, 3 ) ]],
'[[ STDF( КодЕдиницы, 15 ) ]]', '[[ STDF( ОКЕИ, 15 ) ]]', '[[ STDF( КодНалога ) ]]', '[[ STDF( мШтрихКод ) ]]',
'[[ STDF( Артикул, 50 ) ]]', '[[ STDF( СтранаПроисхождения, 10 ) ]]' );
}
SQLERROR throw( 1 );Комментарии
Синтаксис: /* символы */
"Комментарий" это последовательность символов, которая рассматривается интерпретатором как разделительный символ, но игнорируется им. "Символы" в комментарии могут включать в себя любые комбинации символов, включая символ новой строки, кроме ограничителя "конец комментария" (*/). Комментарии могут занимать более одной строки, но не могут быть вложенными. Комментарии могут появляться везде, где допустимо появление разделительных символов. Комментарий рассматривается интерпретатором как единичный разделительный символ, поэтому нельзя включать комментарии с лексемами. Однако, из-за того, что компилятор игнорирует символы комментария, в его текст можно включать ключевые слова без появления ошибок.
Приведем ряд примеров, иллюстрирующих комментарии:
js
/* Комментарии могут располагаться на
Нескольких строках. */
/* Комментарии могут содержать любые символы
В том числе ключевые слова, например while. */Комментарии не могут содержать вложенные комментарии. Следующий пример вызовет появление ошибки:
js
/* Нельзя создавать /* вложенные */ комментарии */Ошибка происходит из-за того, что интерпретатор распознает первое появление */ после слова nest как конец комментария. Он пытается обработать остальной текст и не может этого сделать, поэтому выдает сообщение об ошибке.
Лексемы
В исходном тексте программы интерпретатор распознает основные элементы из групп символов, называемые "лексемами". Лексема — это текст исходной программы, который интерпретатор не анализирует на входящие в него компоненты. Например, в следующем фрагменте программы слово elsewhere использовано в качестве имени функции. Хотя else и является ключевым словом, конфликта между лексемой имени функции и лексемой ключевого слова не происходит.
c
ФУНКЦИЯ main( )
{
i = 0;
if ( i )
elsewhere( );
}Однако, если ввести elsewhere как else where, с пробелом между словами else и where, то в предыдущем примере Вычислитель будет пытаться выполнить функцию where( ), т.к. указанное условие не выполнится. Примерами лексем могут служить описанные в данной главе операторы, константы, идентификаторы и ключевые слова. Также являются лексемами такие символы пунктуации, как прямоугольные ([]), фигурные ({}) и угловые скобки (<>), двоеточие и запятая. Лексемы отделяются разделительными символами и другими лексемами, например, операторами и символами пунктуации. Для предотвращения разбивки интерпретатором элементов на две или несколько лексем, в идентификаторах, многосимвольных операторах и ключевых словах запрещено использование разделительных символов. Когда интерпретатор интерпретирует лексемы, он пытается включить в отдельную лексему как можно больше символов до перехода к следующей лексеме. Из-за этой особенности интерпретатор может неверно интерпретировать лексемы, если они не выделяются разделительными символами. Пример. Рассмотрим следующее выражение:
i+++j
В данном примере интерпретатор сначала пытается выделить максимально длинный оператор (++) из двух знаков плюс. Оставшийся оператор плюс рассматривается как оператор сложения (+). Т.о. выражение интерпретируется как (i++)+(j), а не как (i)+(++j). В данном случае и в аналогичных случаях нужно использовать разделительные символы и скобки для исключения неоднозначности и обеспечения корректного вычисления выражений.
