Основы синтаксиса
OneScript реализует спецификацию языка 1С (BSL) в версии для 1С:Предприятие 8. Данная документация не ставит себе целью полностью повторить описание языка, которое предоставляет фирма 1С. Для полного руководства по языку обратитесь к документации 1С.
Тем не менее, все больше пользователей начинают использовать 1Скрипт, не будучи знакомыми с 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)
КонецПопытки;
Генерация исключений вызывается оператором ВызватьИсключение
ВызватьИсключение "Это моя собственная ошибка, которую я хочу выбросить";
Отличия от 1С
- Не поддерживается оператор
Перейти
и метки - Функции
ДобавитьОбработчик
,УдалитьОбработчик
не поддерживают события COM-объектов. - Добавлена нестандартная директива препроцессора
#Использовать
, предназначенная для подключения внешних библиотек. - Не используется механика "подсчета ссылок", принятая в 1С. Вместо этого применяется штатный сборщик мусора .NET. Это порождает непривычные специалисту 1С эффекты недетерминированного уничтожения объектов. Для явной очистки объектов введены функции:
- ОсвободитьОбъект()
- ВыполнитьСборкуМусора()
- Отличается внутренняя реализация типа Число. В 1Script используется тип .NET System.Decimal, который имеет меньшую размерность, чем тип числа в 1С.
- Есть возможность создавать собственные обходимые типы и параметризованные конструкторы классов. См. раздел "Расширенные возможности"
Отличия в функции Формат
Для параметра ДФ
добавлен формат р
(кириллица) или f
для отображения дробных частей секунды.
Строка = Формат(Дата, "ДФ=ЧЧ:мм:сс.ррр");
// Строка = "20:02:53.345"
Допускается указывать до 6 разрядов дробной части.
Отличия в вызове конструктора
В 1Скрипт разрешается обращаться к результату вызова конструктора сразу же через точку в том же операторе. Т.е. вызов конструктора является полноценным выражением. В 1С такое запрещено.
Если Новый Файл("myfile.txt").Существует() Тогда
// файл сконструирован и сразу же мы обращаемся к методу Существует()
КонецЕсли;
Параметризованные исключения
Существует возможность выброса параметризованных исключений, а не только строк. В 1Скрипт объект ИнформацияОбОшибке
имеет конструктор, в котором можно указать дополнительные параметры исключения.
ВызватьИсключение Новый ИнформацияОбОшибке("Текст ошибки", ДополнительныеДанные);
При перехвате такого исключения в ИнформацияОбОшибке
будет заполнено свойство Параметры
, и оно будет иметь то значение, которое было передано в конструктор исключения при генерации исключения.
rethrow имеющегося исключения
Обычно, для перевыброса исключения в 1С мы вызываем оператор ВызватьИсключение
без параметров. Это не создает новое исключение, а перевыбрасывает старое и позволяет сохранить стек исключения и обработать его дальше.
В 1Скрипт есть расширение этого поведения. Если у нас имеется уже значение типа ИнформацияОбОшибке
, например, полученная из фонового задания, то мы тоже можем сделать генерацию исключения, у которого в свойстве "Причина" будет находиться оригинальное исключение. Для этого, ИнформацияОбОшибке может быть указана в качестве аргумента оператора ВызватьИсключение
ОшибкаВЗадании = МоеФоновоеЗадание.ИнформацияОбОшибке;
Если ОшибкаВЗадании <> Неопределено Тогда
ВызватьИсключение ОшибкаВЗадании; // Здесь выбрасывается исключение, у которого свойство Причина равно ОшибкаВЗадании.
КонецЕсли;