1С 8.3 Исполнитель
Данные > Примеры кода 1С > 1С 8.3 Исполнитель
1C:Исполнитель - это кроссплатформенный язык сценариев который базируется на встроенном языке разработки 1С:Предприятие (но имеет ряд отличий от него). Является аналогом командного интерпретатора ОС (cmd.exe) и обладает библиотекой времени исполнения, схожей с таковой в системе программ "1С:Предприятие", поддерживая, в том числе, и очень специфические объекты (например, доступ к кластеру серверов 1С). 1C:Исполнитель предназначен для автоматизации и администрирования информационных систем, созданных на платформе 1С:Предприятие.
Характеристики языка:
✔ Является статически типизированным
✔ Поддерживает английский и русский синтаксис
✔ Присутствует иерархия типов
✔ Поддерживаются пользовательские структуры, перечисления и исключения
✔ Нет разделения на функции и процедуры – используется единое ключевое слово "метод". Если метод возвращает значение, на это указывает тип возвращаемого значения в сигнатуре метода
✔ Поддерживается повторное определение (перегрузка) методов. Перегруженные методы могут отличаться количеством и/или типом параметров и типом возвращаемого значения. Перегруженные методы не могут различаться только типом возвращаемого значения
✔ В многострочных литералах не надо писать «|» в начале каждой новой строки
✔ Нет точки с запятой «;» в конце операторов. В программе каждая инструкция располагается на отдельной строке. Символ ";" является универсальным символом, завершающим группировку инструкций: оператор или метод. ";" является заменой ключевых слов КонецЕсли, КонецЦикла, КонецФункции, КонецПроцедуры.
✔ Объявления исключений, структур и перечислений заканчиваются символом ";"
✔ Поддерживаются многострочные комментарии /* */
✔ Поддерживается интерполяция строк (возможность сослаться из строки через символ % на переменную или выражение)
Параллельно c 1C:Исполнителем выпускается среда разработки и отладки 1C:Executor IDE (на базе 1С:Enterprise Development Tools). Для работы требуется JRE или JDK v.1.8 (или выше), для среды разработки требуется Liberica JDK (64x).
Существует два варианта поставки
(развиваются параллельно):
1С:Исполнитель U (Universal) – Требует предустановленной Java.
1С:Исполнитель X (eXecutable) – Выпущен в апреле 2021. Работает без Java и для конкретной ОС (Windows, Linux, macOS), используется,
когда критично время запуска скриптов и нежелательна установка Java. Реализован на
виртуальной машине GraalVM.
Содержание установленного каталога с программой:
/bin - каталог с исполняемыми файлами
- executor.cmd - утилита для запуска скриптов в Windows
- executor.sh - утилита для запуска скриптов в Linux или macOS
/config - конфигурационные файлы, необходимые для работы системы
/lib - подгружаемые библиотеки
Командная строка запуска системы 1С:Исполнитель:
executor -s имя файла[-m метод] [-v] [-d номер порта] [--] [параметры сценария]
Параметры командной строки:
-s (source-path) - имя файла со скриптом(*.sbsl). Является обязательным, только в том случае, если имя запускаемого сценария не является единственным параметром при запуске executor.
-m (method) - имя метода, с вызова которого стартует исполнение скрипта. Если параметр не заполнен, то исполнение скрипта начнется с вызова метода Скрипт (Script).
-v (version) - для получения версии исполнителя скриптов.
-d (debug-port) - номер порта (диапазон от 0 до 65535, исключая первый и последний номер), который будет использоваться сервером отладки.
-- - признак прекращения разбора аргументов командной строки. Если параметр указан, то будет отключен разбор оставшейся части командной строки и все оставшиеся значения передаются как параметры сценария (разделитель: пробел). Данный параметр так же используется при необходимости передать в качестве значения другого параметра командной строки системы последовательность символов, начинающихся с -.
параметры сценария - в случае, когда после определения именованных параметров в командной строке запуска сценария
остались значения, то они будут переданы в запускаемый сценарий (в качестве параметров).
Пример простой командной строки: “%ПапкаИсполнителя%\executor_j11.cmd” –s “%ПапкаСкрипта%\ИмяСкрипта.sbsl” –m ИмяМетода
При работе скрипта исполнитель выводит информацию в стандартный поток вывода: stdout.
При наличии ошибок в работе, используется стандартный поток ошибок: stderr.
Примечание: кодировка выводимой информации зависит от ОС (windows - cp866; linux и macOS - UTF-8)
Результат выполнения скрипта при завершении выводится в виде кода завершения:
- 0 - скрипт и исполнитель успешно завершил работу.
- 255 - завершение работы с ошибкой.
Особенностей языка Исполнитель и отличия от 1С 8.3:
- Скрипт начинается с метода Скрипт(Script). Это основной метод для запуска скрипта, который стартует, если выполнить файл sbsl без параметров.
- Отсутствуют процедуры и функций, используется только ключевое слово метод (method).
- Вместо КонецЕсли, КонецЦикла используется точка с запятой «;» и её теперь не нужно ставить в конце каждой строки, достаточно установить при завершении всего блока.
- Язык является регистрозависимым. Ключевые слова всегда должны быть с маленькой буквы, все остальные - как и в 1С - в ГорбатомРегистре.
- Для вывода результата используется Консоль.Записать.
Пример метода Скрипт:
метод Скрипт()
Консоль.Записать("Hello World!")
;
Консоль.Записать("Hello World!")
;
Пример объявления переменных:
метод Скрипт()
// Объявление переменных
пер AAA: любой // Неопределено
пер BBB: Строка // Пустая строка
пер CCC: Число // 0
пер DDD: Строка? // Неопределено
пер EEE: Строка|Число = 15 // 15
// Недопустимые значения при объявлении переменных
пер XXX: Строка|Число // Не указано значение инициализации
пер YYY: Строка = [5,7] // Не совпадение с указанным типом
;
// Объявление переменных
пер AAA: любой // Неопределено
пер BBB: Строка // Пустая строка
пер CCC: Число // 0
пер DDD: Строка? // Неопределено
пер EEE: Строка|Число = 15 // 15
// Недопустимые значения при объявлении переменных
пер XXX: Строка|Число // Не указано значение инициализации
пер YYY: Строка = [5,7] // Не совпадение с указанным типом
;
Пример показа базовых типов выбранного:
метод Скрипт()
ВывестиБазовыеТипы(Тип(Число))
ВывестиБазовыеТипы(Тип(Массив))
ВывестиБазовыеТипы(Тип(ПотокЗаписи))
ВывестиБазовыеТипы(Тип(ИсключениеНедопустимыйАргумент))
;
метод ВывестиБазовыеТипы(Параметр: Тип)
Консоль.Записать("Базовые типы для " + Параметр)
пер Результат: Множество= ПеречислитьПредков(Параметр)
для Элемент из Результат
Консоль.ЗаписатьСтроковоеПредставление(Элемент)
;
;
метод ПеречислитьПредков(Значение: Тип, Предки: Множество= {}): Множество
для ТекущийБазТип из Значение.БазовыеТипы
Предки.Добавить(ТекущийБазТип)
ПеречислитьПредков(ТекущийБазТип, Предки)
;
возврат Предки
ВывестиБазовыеТипы(Тип(Число))
ВывестиБазовыеТипы(Тип(Массив))
ВывестиБазовыеТипы(Тип(ПотокЗаписи))
ВывестиБазовыеТипы(Тип(ИсключениеНедопустимыйАргумент))
;
метод ВывестиБазовыеТипы(Параметр: Тип)
Консоль.Записать("Базовые типы для " + Параметр)
пер Результат: Множество= ПеречислитьПредков(Параметр)
для Элемент из Результат
Консоль.ЗаписатьСтроковоеПредставление(Элемент)
;
;
метод ПеречислитьПредков(Значение: Тип, Предки: Множество= {}): Множество
для ТекущийБазТип из Значение.БазовыеТипы
Предки.Добавить(ТекущийБазТип)
ПеречислитьПредков(ТекущийБазТип, Предки)
;
возврат Предки
Пример проверки соответствия типу:
ЭлементНаПроверку это[не] КонтрольныйСписокТипов // Оператор это выполняет проверку: является ли присваиваемым список типов выражения в список типов (справа за оператором)
Пример проверки на указанный тип:
метод Скрипт()
ЭтоКоллекция(1)
ЭтоКоллекция(новый Массив())
ЭтоКоллекция(новый ФиксированныйМассив([]))
ЭтоКоллекция(новый Соответствие())
ЭтоКоллекция(новый Множество())
;
метод ЭтоКоллекция(Параметр: Объект)
Консоль.ЗаписатьСтроковоеПредставление("Тип параметра = " + Параметр.ПолучитьТип())
если Параметр это ФиксированнаяКоллекция
Консоль.Записать("Это фиксированная коллекция")
иначе
Консоль.Записать("Это не фиксированная коллекция")
;
;
ЭтоКоллекция(1)
ЭтоКоллекция(новый Массив())
ЭтоКоллекция(новый ФиксированныйМассив([]))
ЭтоКоллекция(новый Соответствие())
ЭтоКоллекция(новый Множество())
;
метод ЭтоКоллекция(Параметр: Объект)
Консоль.ЗаписатьСтроковоеПредставление("Тип параметра = " + Параметр.ПолучитьТип())
если Параметр это ФиксированнаяКоллекция
Консоль.Записать("Это фиксированная коллекция")
иначе
Консоль.Записать("Это не фиксированная коллекция")
;
;
Пример проверки соответствия типу:
метод Скрипт()
пер X: Строка|Число = ""
пер Y: Строка|Число|Ууид = 0
пер Z: любой
// Разрешенные операции
если X это Строка
;
Z = Y как Число
X = Y как Строка|Число
СкриптСПриведением("строка")
СкриптСПриведением(7)
// Запрещенные операции
X = Y
Z = Y как ДатаВремя
метод СкриптСПриведением(Параметр: Объект)
если Параметр это Строка // "строка"
МетодСтрока(Параметр как Строка)
иначе если Параметр это Число // 7
МетодЧисло(Параметр как Число)
иначе если Параметр это Булево
МетодБулево(Параметр как Булево)
иначе
// действие для других типов
;
;
пер X: Строка|Число = ""
пер Y: Строка|Число|Ууид = 0
пер Z: любой
// Разрешенные операции
если X это Строка
;
Z = Y как Число
X = Y как Строка|Число
СкриптСПриведением("строка")
СкриптСПриведением(7)
// Запрещенные операции
X = Y
Z = Y как ДатаВремя
метод СкриптСПриведением(Параметр: Объект)
если Параметр это Строка // "строка"
МетодСтрока(Параметр как Строка)
иначе если Параметр это Число // 7
МетодЧисло(Параметр как Число)
иначе если Параметр это Булево
МетодБулево(Параметр как Булево)
иначе
// действие для других типов
;
;
Пример области видимости имен:
метод Скрипт()
пер Z = СкриптВычисление()
;
метод СкриптВычисление(): Число
пер Y: Число
Y = 5
возврат Y
;
пер Z = СкриптВычисление()
;
метод СкриптВычисление(): Число
пер Y: Число
Y = 5
возврат Y
;
Пример видимости имен с вложенными областями:
метод Скрипт()
пер МаркаАвто: Строка
МаркаАвто = Консоль.СчитатьСтроку("Введите марку автомобиля: ")
// Область видимости переменной "МаркаАвто" распространяется до конца скрипта
если МаркаАвто == "BMW"
пер ДизельныеДвигатели: Массив
// Видимые переменные: МаркаАвто, ДизельныеДвигатели
иначе если МаркаАвто == "Audi"
пер БензиновыеДвигатели: Массив
// Видимые переменные: МаркаАвто, БензиновыеДвигатели
иначе
область
пер СписокМарокАвто: Массив
// Видимые переменные: МаркаАвто, СписокМарокАвто
для КонкретнаяМаркаАвто из СписокМарокАвто
// Видимые переменные: МаркаАвто, СписокМарокАвто, КонкретнаяМаркаАвто
;
// Видимые переменные: МаркаАвто, СписокМарокАвто
;
область
пер СписокКонтактов: Массив
// Видимые переменные: МаркаАвто, СписокМарокАвто
;
// Видимые пременные: МаркаАвто
;
;
пер МаркаАвто: Строка
МаркаАвто = Консоль.СчитатьСтроку("Введите марку автомобиля: ")
// Область видимости переменной "МаркаАвто" распространяется до конца скрипта
если МаркаАвто == "BMW"
пер ДизельныеДвигатели: Массив
// Видимые переменные: МаркаАвто, ДизельныеДвигатели
иначе если МаркаАвто == "Audi"
пер БензиновыеДвигатели: Массив
// Видимые переменные: МаркаАвто, БензиновыеДвигатели
иначе
область
пер СписокМарокАвто: Массив
// Видимые переменные: МаркаАвто, СписокМарокАвто
для КонкретнаяМаркаАвто из СписокМарокАвто
// Видимые переменные: МаркаАвто, СписокМарокАвто, КонкретнаяМаркаАвто
;
// Видимые переменные: МаркаАвто, СписокМарокАвто
;
область
пер СписокКонтактов: Массив
// Видимые переменные: МаркаАвто, СписокМарокАвто
;
// Видимые пременные: МаркаАвто
;
;
Пример работы с числами:
метод Скрипт()
пер pNumb: Число
pNumb = 75 // целое 10-ое число
pNumb = 2.7182818284 // дробное 10-ое число
pNumb = 75/15 // выражение с использованием 10-х чисел
pNumb = 0x5A3 // 16-ое число
pNumb = -0x5A3 // отрицательное 16-ое число
pNumb = 0b101 // 2-ое число
;
пер pNumb: Число
pNumb = 75 // целое 10-ое число
pNumb = 2.7182818284 // дробное 10-ое число
pNumb = 75/15 // выражение с использованием 10-х чисел
pNumb = 0x5A3 // 16-ое число
pNumb = -0x5A3 // отрицательное 16-ое число
pNumb = 0b101 // 2-ое число
;
Пример подключения к системе взаимодействия и показ в консоль первых 20 непрочитанных обсуждений:
метод ТестРаботыССВ()
// Адрес сервера для создания приложения (протокол+адрес сервера+порт сервера)
пер АдресСервераWSS = "wss://address.ecs:9094?transport=websocket&version=4"
// Путь к файлу с хранилищем ключей, содержащему сертификат сервера СВ
пер ФайлХранилищаJKS = "C:\\key.jks"
// Строка с паролем к хранилищу
пер ПарольХранилища = "keyPass"
// Строка с паролем к сертификату
пер ПарольКлюча = "certPass"
// Таймаут операции
пер ТаймаутОперации = 10с //10 секунд
// Уникальный идентификатор пользователя приложения
пер ПользовательПриложения = новый Ууид("89eb3eb1-d32e-45ea-a308-a7ua8301by3c")
// Строка с именем пользователя приложения
пер ИмяПользователя = "Артур"
// Строки с полным именем пользователя приложения
пер ПолноеИмяПользователя = "Коржан Артур"
// Код, который присылает сервер СВ для регистрации нового приложения
пер КодАктивации = "9876543210"
// Адрес эл. почты для регистрации приложения на сервере СВ
пер ПочтовыйАдрес = "artur@1cnik.by"
// ИмяПриложения подключаемой информационной базы
пер ИмяПриложения = "myApp"
// Подключение...
СистемаВзаимодействия.Подключиться(АдресСервераWSS, ФайлХранилищаJKS, ПарольХранилища, ПарольКлюча, ТаймаутОперации)
// Подготовка ключа...
пер Ключи = новый КлючиПриложения()
// Создание приложения...
пер ПарПриложенияСВ = СистемаВзаимодействия.СоздатьПриложение(Ключи, ПользовательПриложения, ИмяПользователя, ПолноеИмяПользователя, КодАктивации, ПочтовыйАдрес, ИмяПриложения)
// Ответ сервера...
пер ИдентификаторПриложенияСВ: Ууид = ПарПриложенияСВ.ИдентификаторПриложения
пер ОткрытыйКлючПриложенияСВ: Строка = ПарПриложенияСВ.ОткрытыйКлюч
// Сохранение параметров приложения (для последующего использования)
Консоль.Записать(Ключи.ОткрытыйКлюч.ВСтроку())
Консоль.Записать(Ключи.ЗакрытыйКлюч.ВСтроку())
Консоль.Записать(ИдентификаторПриложенияСВ.ВСтроку())
Консоль.Записать(ОткрытыйКлючПриложенияСВ.ВСтроку())
// Аутентификация...
пер ИдПользователяСВ = СистемаВзаимодействия.Войти(Ключи, ПользовательПриложения, ИмяПользователя, ПолноеИмяПользователя, ПарПриложенияСВ)
// Работа с системой взаимодействия...
// Получение первых 20-ти непрочитанных обсуждений и вывод в консоль
попытка
// Получение непрочитанных обсуждений
пер МассивИДНепрочитанныхОбсуждений = СистемаВзаимодействия.ПолучитьНепрочитанныеОбсуждения(, 20)
// Получение непрочитанных обсужденийкаждого непрочитанного обсуждения (в хронологическом порядке)
для ИДНепрочитОбсуждения из МассивИДНепрочитанныхОбсуждений
Консоль.Записать("Обсуждение № " + ИДНепрочитОбсуждения.Формат)
пер МассивНовыхСообщений = СистемаВзаимодействия.ПолучитьНепрочитанныеСообщения(ИДНепрочитОбсуждения)
для Сообщение из МассивНовыхСообщений
Консоль.Записать("Сообщение # " + Сообщение.Идентификатор + " : " + Сообщение.Текст)
// Установка прочитанного сообщения как последнее прочитанное
СистемаВзаимодействия.УстановитьПоследнееПрочитанноеСообщение(ИДНепрочитОбсуждения, Сообщение.Идентификатор)
;
;
поймать Искл : ИсключениеСистемыВзаимодействия
Консоль.ЗаписатьОшибку("Ошибка системы взаимодействия: " + Искл)
;
// Отключение...
СистемаВзаимодействия.Отключиться()
;
// Адрес сервера для создания приложения (протокол+адрес сервера+порт сервера)
пер АдресСервераWSS = "wss://address.ecs:9094?transport=websocket&version=4"
// Путь к файлу с хранилищем ключей, содержащему сертификат сервера СВ
пер ФайлХранилищаJKS = "C:\\key.jks"
// Строка с паролем к хранилищу
пер ПарольХранилища = "keyPass"
// Строка с паролем к сертификату
пер ПарольКлюча = "certPass"
// Таймаут операции
пер ТаймаутОперации = 10с //10 секунд
// Уникальный идентификатор пользователя приложения
пер ПользовательПриложения = новый Ууид("89eb3eb1-d32e-45ea-a308-a7ua8301by3c")
// Строка с именем пользователя приложения
пер ИмяПользователя = "Артур"
// Строки с полным именем пользователя приложения
пер ПолноеИмяПользователя = "Коржан Артур"
// Код, который присылает сервер СВ для регистрации нового приложения
пер КодАктивации = "9876543210"
// Адрес эл. почты для регистрации приложения на сервере СВ
пер ПочтовыйАдрес = "artur@1cnik.by"
// ИмяПриложения подключаемой информационной базы
пер ИмяПриложения = "myApp"
// Подключение...
СистемаВзаимодействия.Подключиться(АдресСервераWSS, ФайлХранилищаJKS, ПарольХранилища, ПарольКлюча, ТаймаутОперации)
// Подготовка ключа...
пер Ключи = новый КлючиПриложения()
// Создание приложения...
пер ПарПриложенияСВ = СистемаВзаимодействия.СоздатьПриложение(Ключи, ПользовательПриложения, ИмяПользователя, ПолноеИмяПользователя, КодАктивации, ПочтовыйАдрес, ИмяПриложения)
// Ответ сервера...
пер ИдентификаторПриложенияСВ: Ууид = ПарПриложенияСВ.ИдентификаторПриложения
пер ОткрытыйКлючПриложенияСВ: Строка = ПарПриложенияСВ.ОткрытыйКлюч
// Сохранение параметров приложения (для последующего использования)
Консоль.Записать(Ключи.ОткрытыйКлюч.ВСтроку())
Консоль.Записать(Ключи.ЗакрытыйКлюч.ВСтроку())
Консоль.Записать(ИдентификаторПриложенияСВ.ВСтроку())
Консоль.Записать(ОткрытыйКлючПриложенияСВ.ВСтроку())
// Аутентификация...
пер ИдПользователяСВ = СистемаВзаимодействия.Войти(Ключи, ПользовательПриложения, ИмяПользователя, ПолноеИмяПользователя, ПарПриложенияСВ)
// Работа с системой взаимодействия...
// Получение первых 20-ти непрочитанных обсуждений и вывод в консоль
попытка
// Получение непрочитанных обсуждений
пер МассивИДНепрочитанныхОбсуждений = СистемаВзаимодействия.ПолучитьНепрочитанныеОбсуждения(, 20)
// Получение непрочитанных обсужденийкаждого непрочитанного обсуждения (в хронологическом порядке)
для ИДНепрочитОбсуждения из МассивИДНепрочитанныхОбсуждений
Консоль.Записать("Обсуждение № " + ИДНепрочитОбсуждения.Формат)
пер МассивНовыхСообщений = СистемаВзаимодействия.ПолучитьНепрочитанныеСообщения(ИДНепрочитОбсуждения)
для Сообщение из МассивНовыхСообщений
Консоль.Записать("Сообщение # " + Сообщение.Идентификатор + " : " + Сообщение.Текст)
// Установка прочитанного сообщения как последнее прочитанное
СистемаВзаимодействия.УстановитьПоследнееПрочитанноеСообщение(ИДНепрочитОбсуждения, Сообщение.Идентификатор)
;
;
поймать Искл : ИсключениеСистемыВзаимодействия
Консоль.ЗаписатьОшибку("Ошибка системы взаимодействия: " + Искл)
;
// Отключение...
СистемаВзаимодействия.Отключиться()
;
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Исполнитель:
Рекомендую к просмотру: Обзор 1С: Исполнитель
Рекомендую к просмотру: Вводный урок по 1С: Исполнитель
3
комментарии
HRom
29 ноя 2021
Добрый день,
подскажите как в 1С:Исполнителе отправить https-запрос с использованием авторизации по Сертификату.
Во встроенном языке 1С это такой код:
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Неопределено,
Неопределено);
Соединение = Новый HTTPСоединение("xxxx",,,,,,ssl);
в исполнителе:
метод Скрипт()
пер МойКлиент = КлиентHttp.СБазовымUrl("https://xxxx")
пер Запрос = МойКлиент.ЗапросGet("/api/v1/yyyyyy")
Запрос.Выполнить()
;
возвращает:
Unknown input/output error: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
подскажите как в 1С:Исполнителе отправить https-запрос с использованием авторизации по Сертификату.
Во встроенном языке 1С это такой код:
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Неопределено,
Неопределено);
Соединение = Новый HTTPСоединение("xxxx",,,,,,ssl);
в исполнителе:
метод Скрипт()
пер МойКлиент = КлиентHttp.СБазовымUrl("https://xxxx")
пер Запрос = МойКлиент.ЗапросGet("/api/v1/yyyyyy")
Запрос.Выполнить()
;
возвращает:
Unknown input/output error: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Сергей
27 окт 2020
Там еще будет куча ошибок. Вот когда устранят, тогда и скачаем
off
27 окт 2020
Кстати вчера вышел 1С:Исполнитель 2020.2.2
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник