import{_ as i,c as a,a3 as n,o as l}from"./chunks/framework.CUlkWZrb.js";const o=JSON.parse('{"title":"Основы синтаксиса","description":"","frontmatter":{},"headers":[],"relativePath":"learn/syntax-basics.md","filePath":"learn/syntax-basics.md"}'),h={name:"learn/syntax-basics.md"};function t(p,s,e,k,d,r){return l(),a("div",null,s[0]||(s[0]=[n(`
OneScript реализует спецификацию языка 1С (BSL) в версии для 1С:Предприятие 8. Данная документация не ставит себе целью полностью повторить описание языка, которое предоставляет фирма 1С. Для полного руководства по языку обратитесь к документации 1С.
Тем не менее, все больше пользователей начинают использовать OneScript, не будучи знакомыми с 1С. Для них краткий ввод в синтаксис языка.
Единицей структурирования является модуль. Модуль это текстовый файл с расширением .os Каждый модуль может содержать 3 секции:
В самом простейшем случае минимальный скрипт выглядит следующим образом:
Сообщить("Привет, Мир!");В примере выше модуль содержит только секцию тела модуля. Тело модуля это код, который начинает выполняться сразу при запуске. Тело модуля обязательно находится в самом низу файла. Обычно в теле модуля размещают код инициализации.
В самом верху модуля размещаются переменные уровня модуля целиком. Объявляются с помощью ключевого слова Перем
// Секция переменных
Перем МояПеременная; // объявление переменной МояПеременная
// Секция тела модуля
МояПеременная = "Привет"; // инициализация переменной МояПеременнаяСекция методов находится между секцией переменных и телом модуля. Видов методов два: процедуры и функции. Функции могут возвращать результат своей работы в виде значения. Процедуры просто выполняют некий код и не возвращают результат.
Метод (процедура или функция) объявляется вот так:
Процедура МояПроцедура(ВходнойПараметр1, ВходнойПараметр2)
// Тут идут операторы процедуры
КонецПроцедуры
Функция МояФункция(ВходнойПараметр1, ВходнойПараметр2)
// Тут идут операторы процедуры
Возврат ВходнойПараметр1 + ВходнойПараметр2; // возврат результата функции
КонецФункцииТипизация динамическая нестрогая. Переменная может принимать любое значение. Есть примитивные типы: Строка, Число, Булево, Дата и есть объектные, к которым мы обращаемся через точку от экземпляра объекта.
Также есть специальные типы-значения Неопределено и Null. Они обозначают отсутствие значения.
Литерал числа это цифры, с возможной десятичной точкой: 12345.899. Максимальная точность ограничена типом decimal платформы .NET
Литерал строки это любая последовательность внутри двойных кавычек. Экранирование кавычки внутри строки выполняется удваиванием символа кавычки.
"Это Строка"
"А это строка с неким названием ""Название"". Чтобы вывести кавычку нужно продублировать ее. На печать будет выведена одна кавычка"
"Многострочные строки оформляются переносом
|текста на следующую строку и выделением новой строки с
|помощью вертикальной черты.
| Пробельные символы до этой черты - игнорируются. После - сохраняются"Даты оформляются одинарными кавычками и задаются в формате 'ГГГГММДДччммсс'. Например,
ДатаЗаданнаяЛитералом = '20250212235959'; // 12.02.2025 23:59:59
ДопускаютсяРазделители = '2025年02月12日 23:59:59'; // 12.02.2025 23:59:59Если ЛогическоеВыражение Тогда
// тело операции, когда ЛогическоеВыражение равно Истина
ИначеЕсли ДругоеЛогическоеВыражение Тогда
// альтернативное условие
Иначе
// альтернативная ветка, когда все условия оказались ложными
КонецЕсли;Обычный цикл со счетчиком. Объявляется переменная, задается ее начальное и конечное значение
Для Счетчик = 0 По 10 Цикл
Сообщить("Счетчик = " + Счетчик);
КонецЦикла;Цикл-итератор по объекту коллекции
НекийМассив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(3);
Для Каждого Элемент Из Массив Цикл
Сообщить("Элемент = " + Элемент);
КонецЦикла;Цикл с предусловием
Пока ЛогическоеУсловие Цикл
// Исполняется пока ЛогическоеУсловие = Истина
КонецЦикла;Отлов исключений выполняется конструкцией Попытка..Исключение. Исключения нетипизированные, любое выбрасываемое из пользовательского кода значение приводится к строке.
В отличие от 1С есть возможность выброса исключения с дополнительной информацией, см. про это в разделе "Отличия от 1С".
Попытка
А = 2 / 0;
Исключение
Сообщить(ОписаниеОшибки());
Сообщить(ИнформацияОбОшибке().НомерСтроки);
Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение; // повторный выброс пойманного исключения (rethrow)
КонецПопытки;Генерация исключений вызывается оператором ВызватьИсключение
ВызватьИсключение "Это моя собственная ошибка, которую я хочу выбросить";Перейти и меткиДобавитьОбработчик, УдалитьОбработчик не поддерживают события COM-объектов.#Использовать, предназначенная для подключения внешних библиотек.Для параметра ДФ добавлен формат р (кириллица) или f для отображения дробных частей секунды.
Строка = Формат(Дата, "ДФ=ЧЧ:мм:сс.ррр");
// Строка = "20:02:53.345"Допускается указывать до 6 разрядов дробной части.
В OneScript разрешается обращаться к результату вызова конструктора сразу же через точку в том же операторе. Т.е. вызов конструктора является полноценным выражением. В 1С такое запрещено.
Если Новый Файл("myfile.txt").Существует() Тогда
// файл сконструирован и сразу же мы обращаемся к методу Существует()
КонецЕсли;Существует возможность выброса параметризованных исключений, а не только строк. В OneScript объект ИнформацияОбОшибке имеет конструктор, в котором можно указать дополнительные параметры исключения.
ВызватьИсключение Новый ИнформацияОбОшибке("Текст ошибки", ДополнительныеДанные);При перехвате такого исключения в ИнформацияОбОшибке будет заполнено свойство Параметры, и оно будет иметь то значение, которое было передано в конструктор исключения при генерации исключения.
Обычно, для перевыброса исключения в 1С мы вызываем оператор ВызватьИсключение без параметров. Это не создает новое исключение, а перевыбрасывает старое и позволяет сохранить стек исключения и обработать его дальше.
В OneScript есть расширение этого поведения. Если у нас имеется уже значение типа ИнформацияОбОшибке, например, полученная из фонового задания, то мы тоже можем сделать генерацию исключения, у которого в свойстве "Причина" будет находиться оригинальное исключение. Для этого, ИнформацияОбОшибке может быть указана в качестве аргумента оператора ВызватьИсключение
ОшибкаВЗадании = МоеФоновоеЗадание.ИнформацияОбОшибке;
Если ОшибкаВЗадании <> Неопределено Тогда
ВызватьИсключение ОшибкаВЗадании; // Здесь выбрасывается исключение, у которого свойство Причина равно ОшибкаВЗадании.
КонецЕсли;