Встроенный язык
Описание возможностей и особенностей встроенного языка¶
Данный раздел является справочно-учебным. Он описывает язык целиком: синтаксис, семантику, ограничения и типовые особенности. Разделы можно читать выборочно.
1. Лексика и базовые правила языка (символы, ключевые слова, формат кода)¶
1.1 Регистр и язык ключевых слов¶
Язык регистронезависим:
Если,ЕСЛИ,если— эквивалентны.
Язык двуязычный:
- почти все ключевые слова имеют русское и английское написание;
- можно смешивать языки в одном модуле.
1.2 Идентификаторы¶
Имена переменных, процедур и функций:
- начинаются с буквы или
_; - содержат буквы, цифры и
_; - не должны совпадать с ключевыми словами языка;
- не должны совпадать с именами свойств/методов, доступных в текущем контексте.
Примеры корректных идентификаторов:
1.3 Комментарии¶
Комментарий начинается с // и заканчивается концом строки.
После // на той же строке нельзя продолжать писать код.
1.4 Разделитель операторов¶
Операторы отделяются точкой с запятой ;.
Конец строки не завершает оператор. Оператор может переноситься.
Можно писать несколько операторов в одной строке:
1.5 Метки и переходы¶
Метка — это специальный идентификатор, начинающийся с ~ и заканчивающийся :.
Метки используются оператором Перейти (аналог Goto). Это редкий инструмент, применяйте только при реальной необходимости.
1.6 Специальные символы (что означает каждый)¶
//— комментарий до конца строки|— перенос строки в многострочной строке (строка-продолжение)~— начало метки:— конец метки;— разделитель операторов()— параметры вызова и управление приоритетом[]— доступ к свойству по имени / доступ к элементу коллекции,— разделитель параметров""— строковый литерал''— литерал даты.— доступ к свойствам/методам+ - * / %— арифметика и/или конкатенация> >= < <= = <>— сравнение
1.7 Ключевые слова (зарезервированные)¶
Эти слова нельзя использовать как имена переменных/процедур/функций.
Управление потоком:
Если/If,Тогда/Then,ИначеЕсли/ElsIf,Иначе/Else,КонецЕсли/EndIfДля/For,Каждого/Each,Из/In,По/ToПока/While,Цикл/Do,КонецЦикла/EndDoПродолжить/Continue,Прервать/Break,Возврат/ReturnПерейти/Goto
Процедуры/функции и переменные:
Процедура/Procedure,КонецПроцедуры/EndProcedureФункция/Function,КонецФункции/EndFunctionПерем/Var
Логика:
И/And,Или/Or,Не/Not
Исключения:
Попытка/Try,Исключение/Except,КонецПопытки/EndTry,ВызватьИсключение/Raise
Прочее:
Новый/NewВыполнить/ExecuteЖдать/Await
2. Типы данных и значения¶
2.1 Примитивные типы¶
Число
- десятичное;
- до 38 значащих цифр;
Строка
- Unicode;
- произвольной длины;
- поддерживает многострочные литералы.
Дата
- дата и время;
- точность до 1 секунды;
- арифметика с секундами.
Булево
Истина/Ложь;- результат логических выражений.
Неопределено
- отсутствие значения;
- используется по умолчанию.
Null
- отсутствие данных БД;
- применяется при соединениях и запросах.
2.2 Тип¶
Используется для:
- проверки типов;
- сравнения типов;
- динамической логики.
3. Выражения и вычисления (все операции с примерами)¶
Выражение — это формула, которая вычисляет значение. Выражения состоят из литералов, переменных, вызовов функций и операций.
3.1 Арифметические операции¶
Ниже перечислены все арифметические операции, доступные в языке.
Сложение +
Число + ЧислоДата + Число(число — секунды)
Вычитание -
Число - ЧислоДата - Число(число — секунды)Дата - Дата(результат — секунды)
Умножение *
Деление /
Остаток от деления %
Унарный минус -
Примечание: семантика операции определяется типом первого операнда. Если тип второго операнда не подходит, платформа пытается привести тип автоматически; если нельзя — возникает ошибка выполнения.
3.2 Операция конкатенации строк¶
Конкатенация использует тот же оператор +.
3.3 Операции сравнения¶
Операции сравнения возвращают Булево: Истина или Ложь.
Больше >
Больше или равно >=
Меньше <
Меньше или равно <=
Равно =
Не равно <>
Операции сравнения определены для:
- Число, Строка, Дата (для > >= < <=)
- любых типов (для = и <>)
3.4 Булевы операции (логика)¶
И / And
Или / Or
Не / Not
Короткое замыкание Вычисляются только необходимые части выражения.
Если (Цена > 0) И ПроверкаСуммы() Тогда
// Если Цена <= 0, функция ПроверкаСуммы() не вызовется
КонецЕсли;
3.5 Приоритет операций¶
Операторы с одинаковым приоритетом вычисляются слева направо.
- Скобки:
() НеИИли- Сравнение:
< <= = >= > <> + -* / %- Унарные:
- + - Доступ/вызов:
.и()
Практическое правило:
- если есть сомнения — ставьте скобки.
4. Операторы управления (все базовые конструкции с примерами)¶
4.1 Условие: Если / ИначеЕсли / Иначе¶
Если Сумма > 1000 Тогда
Сообщить("Скидка применена");
ИначеЕсли Сумма > 0 Тогда
Сообщить("Без скидки");
Иначе
Сообщить("Сумма не задана");
КонецЕсли;
4.2 Цикл Для ... По ...¶
Числовой цикл.
Шаг цикла задать невозможно, шак всегда равен 1;
4.3 Цикл Для Каждого ... Из ...¶
Обход коллекций.
4.4 Цикл Пока ...¶
Цикл с предусловием.
4.5 Управление циклом¶
Продолжить — перейти к следующей итерации:
Для Индекс = 1 По 5 Цикл
Если Индекс = 3 Тогда
Продолжить;
КонецЕсли;
Сообщить(Индекс); // выведет 1,2,4,5
КонецЦикла;
Прервать — выйти из цикла:
4.6 Возврат из функции¶
Возврат завершает функцию и возвращает значение.
4.7 Переход Перейти (Goto)¶
Используйте только если действительно нужен линейный сценарий с редкими ветвлениями.
4.8 Исключения: Попытка / Исключение / ВызватьИсключение¶
Попытка
// потенциально опасный код
Рез = 10 / 0;
Исключение
Сообщить("Произошла ошибка");
КонецПопытки;
Явный выброс исключения:
4.9 Новый (создание объекта)¶
Новый создает объект указанного типа.
Конкретные имена типов объектов зависят от доступного контекста (платформа и конфигурация).
4.10 Выполнить (Execute)¶
Выполняет строку как код.
Используйте осторожно: ухудшает читаемость, сложнее отлаживать, повышает риск ошибок.
4.11 Асинх (Async)¶
Ключевое слово языка для определения процедур и функций на клиенте как асинхронных.
Асинхронное исполнение возможно только у асинхронных функций. Ждать асинхронные функции можно, а асинхронные процедуры нельзя. Из асинхронных процедур можно вызывать асинхронные функции. Из простых процедур нельзя вызывать асинхронные функции.
При добавлении Асинх к процедуре или функции все ее параметры начинают передаваться по значению, так, как будто перед ними стояло бы ключевое слово Знач.
4.12 Ждать (Await)¶
Ключевое слово языка для ожидания (использование зависит от поддерживаемых механизмов в окружении).
5. Процедуры и функции¶
5.1 Процедуры¶
- выполняют действие;
- не возвращают значение;
- могут быть экспортируемыми.
5.2 Функции¶
- возвращают значение через
Возврат; - могут использоваться в выражениях;
- допускают досрочный возврат.
5.3 Параметры¶
- по значению (при использовании
Значи в асинхронных методах); - по ссылке (по умолчанию);
- значения по умолчанию.
6. Программный модуль¶
6.1 Разделы модуля¶
- Переменные (
Перем) - Процедуры и функции
- Основной код (инициализация)
7. Контекст выполнения¶
7.1 Глобальный контекст¶
- функции платформы;
- системные перечисления;
- глобальные общие модули.
7.2 Локальный контекст¶
Зависит от:
- типа модуля;
- объекта конфигурации;
- режима запуска.
8. Клиент-серверная модель¶
8.1 Среды выполнения¶
- клиентское приложение;
- сервер приложения.
8.2 Директивы компиляции¶
&НаКлиенте&НаСервере&НаСервереБезКонтекста&НаКлиентеНаСервере
Директива:
- определяет место выполнения;
- влияет на доступные данные;
- влияет на сетевые вызовы.
9. Препроцессор¶
9.1 Назначение¶
- исключение кода;
- платформозависимая логика;
- группировка.
9.2 Инструкции¶
#Если / #Иначе / #КонецЕсли#Область / #КонецОбласти#Вставка / #Удаление
Препроцессор выполняется до компиляции.
10. Аннотации¶
&Перед&После&Вместо&ИзменениеИКонтроль
Используются только в расширениях.
11. Особенности и ограничения языка¶
- динамическая типизация;
- отсутствие классов в классическом смысле;
- сильная зависимость от контекста;
- ориентация на бизнес-логику;
- высокая роль архитектурных решений.
Итог¶
Встроенный язык:
- прост синтаксически;
- сложен контекстуально;
- требует архитектурного мышления.
- ориентирован на бизнес-логику.
Его нужно изучать не как язык общего назначения, а как инструмент платформы.
Главное для начинающего:
- понимать, где выполняется код;
- понимать, в каком контексте он работает;
- писать простой и читаемый код.