Заметки из Зазеркалья

03.06.2020

1C:Исполнитель

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

Практически все распространенные операционные системы обладают таким понятием как "командный интерпретатор" или "интерпретатор командной строки". Это часть ОС, которая обеспечивает управление компьютером посредством интерактивных команд, вводимых с клавиатуры. Как правило, командный интерпретатор обладает каким-либо скриптовым языком программирования.

В Windows это интерпретатор командной строки cmd.exe и язык командных файлов (.bat-файлов). В Linux и macOS это командный интерпретатор bash и его язык сценариев.

Появится похожий инструмент и в системе программ 1С:Предприятие. Это 1C:Исполнитель.

1C:Исполнитель - это:

  • Кроссплатформенный язык сценариев; интерпретатор языка работает во всех поддерживаемых операционных системах: Linux, macOS и Windows.

  • Этот язык сценариев базируется на встроенном языке разработки 1С:Предприятие (но имеет ряд отличий от него).

  • Этот язык сценариев обладает библиотекой времени исполнения, очень схожей с таковой в системе программ "1С:Предприятие", поддерживая, в том числе, и очень специфические объекты (например, доступ к кластеру серверов 1С:Предприятия).

1C:Исполнитель – это инструмент для автоматизации и администрирования информационных систем, созданных на платформе 1С:Предприятие. 1C:Исполнитель может применяться для автоматизации развёртывания информационных систем, поддержки практики Continuous Integration и других задач.

Вместе с 1C:Исполнителем выпускается среда разработки и отладки  1C:Executor IDE на базе 1С:Enterprise Development Tools. Также доступен плагин для разработки и отладки в среде Visual Studio Code.  

В настоящий момент 1C:Исполнитель используется нами:

  • В облачном сервисе https://1cfresh.com/ - для задач администрирования и публикации инфобаз на веб-серверах

  • В сервисе 1С:Готовое Рабочее Место (ГРМ) - для управления инфраструктурой (создание и удаление виртуальных машин и контейнеров и их настройка), для управления информационными базами 1С (создание, удаление, резервное копирование, публикация на веб-серверах)

Для работы 1С:Исполнителя требуется Java Runtime Envinronment (JRE) или Java Development Kit (JDK) версии 1.8 или более новой.

Для работы среды разработки 1С:Исполнителя требуется Liberica JDK (необходим 64-разрядный дистрибутив из последней таблицы с заголовком «Полная версия Liberica включает LibericaFX и Minimal VM, где это применимо»).

Язык разработки

Как сказано выше, язык сценариев базируется на языке разработки "1С:Предприятие", но имеет от него ряд существенных отличий. Мы постарались сделать язык современным, лаконичным и простым в освоении.

Несколько характеристик языка:

  • Язык является статически типизированным.

  • В языке присутствует иерархия типов.

  • Нет разделения на функции и процедуры – используется единое ключевое слово метод. Если метод возвращает значение, на это указывает тип возвращаемого значения в сигнатуре метода.

  • Поддерживается  повторное определение (перегрузка) методов. Перегруженные методы могут отличаться количеством и/или типом параметров и типом возвращаемого значения. Перегруженные методы не могут различаться только типом возвращаемого значения.

  • Поддерживаются пользовательские структуры, перечисления и исключения.

  • Нет точки с запятой ";" в конце операторов. В программе каждая инструкция располагается на отдельной строке. Символ ";" является универсальным символом, завершающим группировку инструкций: оператор или метод. Можно сказать, что символ ";" является заменой ключевых слов КонецЕсли, КонецЦикла, КонецФункции, КонецПроцедуры.
    Объявления исключений, структур и перечислений также заканчиваются символом ";".

img-001.png

  • Поддерживаются многострочные комментарии /*  */.

  • Поддерживается интерполяция строк. Интерполяция строк – это возможность сослаться из строки через символ % на переменную или выражение.  Другими словами - это более понятный и удобный синтаксис для конкатенации строк, совмещенный с возможностями форматирования значений.

  • В многострочных литералах не надо писать «|» в начале каждой новой строки.

  • Язык поддерживает русский и английский синтаксис.

Скриншот Visual Studio Code со скриптом 1С:Исполнителя (демонстрирует описанные выше 4 фичи языка - многострочные комментарии, интерполяцию строк, многострочные литералы и английский синтаксис) и выводом результата работы скрипта в терминальную консоль:
img-002.png

Типизация

Язык статически типизированный. У каждой переменной, параметра и метода, возвращающего значения, должны быть заданы типы. Проверка типов происходит в момент компиляции.

метод СократитьДо(Строка: Строка, Длина: Число): Строка
    если Строка.Длина() > Длина
        возврат Строка.ПодстрокаСНачала(Длина - 3) + "..."
    ;

    возврат Строка
;

 Возможна также динамическая типизация. В случае языка с явной типизацией переменных мы не можем просто описать переменную, не указывая ее типа. Для таких ситуаций существует тип любой. Фактически, данный тип существует исключительно во время компиляции исходного текста программы. Его назначение: отключить проверку типов компилятора. Все проверки будут выполняться во время исполнения, когда станет ясно, значение какого типа размещено в переменной, объявленной с типом любой.

метод СократитьДо(Строка: любой, Длина: любой): любой
    если Строка.Длина() > Длина
        возврат Строка.ПодстрокаСНачала(Длина - 3) + "..."
    ;

    возврат Строка
;


Если есть метод А(Число)и перегруженный метод А(любой), то при вызове метода А с численным параметром будет вызван первый метод, с любым другим типом параметра – второй (перегруженный) метод.
Переменные необходимо явно объявлять через ключевое слово пер(var) или знч(val). В последнем случае создается переменная, доступная только для чтения.
При объявлении переменной необходимо объявить её тип и (опционально) инициализировать значением (или выражением) объявленного типа. При наличии инициализации указывать тип необязательно — он будет выведен неявно. 

пер А: Строка = "абв"

пер Б: Число //'Б' будет неявно инициализировано в 0

пер В = "" //тип переменной 'В' будет выведен как Строка

пер Г = ["раз", "два", "три"] //тип переменной 'Г' будет выведен как Массив 

Можно объявлять переменные составного типа (перечисляя типы через вертикальную черту «|»); в этом случае переменная может принимать значение нескольких типов, которые указаны при объявлении переменной. Пример объявления такой переменной:

пер А: Строка|Число?
На этапе компиляции можно присваивание переменной типа <Тип> значения типа <Тип>? – это будет значить <Тип>|Неопределено. Т.е. запись выше эквивалентна такой:
пер А: Строка|Число|Неопределено
Единственное место, где можно явно не объявлять переменную – это оператор цикла для:

для Повтор = 1 по Количество
    Консоль.Записать("Привет Мир!")
;

Иерархия типов

Тип - это множество допустимых значений и набор операций, которые можно выполнять над данными, принадлежащими этому типу. При описании типов будет использоваться понятие контракт. Контрактом называется набор свойств и методов, присущих тому или иному типу, а также поведение этих свойств и методов. Другими словами контракт - это те обязательства, которые берет на себя система, когда программист оперирует значением некоторого типа. Таким образом, можно сказать, что тип - это множество допустимых значений и контракт.

Типы образуют иерархию. Это означает, что в отношении типов можно рассмотреть отношение предок-потомок. При этом потомок какого-либо типа наследует контракт своего предка, но каким-либо образом расширяет или допустимые значения или контракт или оба этих параметра. Также можно сказать, что предок какого-либо типа будет называться базовым типом. Соответственно потомок типа будет называться производным типом. У одного типа может быть несколько базовых типов. Если тип А выступает базовым для типа Б, то в переменную типа А можно присвоить значение типа Б.

В языке существует специальный тип Тип, который предназначен для идентификации типов значений. Этот тип необходим для определения и сравнения типов, а также для получения информации об иерархии типов.

В основании всей иерархии типов лежит тип Объект. Этот тип является базовым для всех типов, кроме типа Неопределено. У каждого из этих типов существует метод ПолучитьТип(), который возвращает значение типа Тип. У любого объекта языка можно вызвать метод ПолучитьТип(). Это - пример наследования контракта.

Базовые типы

Перечислим некоторые базовые типы языка.

  • Число

  • Булево

  • Строка

  • Ууид - уникальный идентификатор.

  • Неопределено. Значение данного типа применяется, когда необходимо использовать пустое значение, не принадлежащее ни к одному другому типу. Например, такое значение изначально имеют переменные, объявленные с типом любой.

  • Закрываемое. Закрываемое является базовым типом для типов, использующих системные ресурсы. При создании объекта, являющегося потомком типа Закрываемое, выполняется получение системного ресурса. В тот момент, когда ресурс становится ненужным, следует вызвать метод Закрыть(), который является контрактом типа Закрываемое. Во время вызова метода Закрыть() гарантируется, что ресурс будет возвращен операционной системе.

  • Байты. С помощью типа Байты можно хранить набор произвольных значений, заданных 16-ричными цифрами.

пер НаборБайт = Байты(4d 5a)

Типы для работы с датой и временем

  • Время - тип предназначен для работы исключительно со временем, без учета даты.
  • Дата - тип предназначен для работы исключительно с датой, без учета времени.
  • ДатаВремя - даёт возможность использовать одновременно дату и время.
  • Момент – тип для описания абсолютного момента времени. Это дата и время, указанные для временной зоны UTC. Использование этого типа позволяет располагать на одной шкале времени события, которые происходят в различных временных зонах, т.к. дата и время в конкретной временной зоне всегда имеет прямое отображение в UTC, путем корректировки на время смещения конкретной временной зоны.
  • Длительность - описывает временную продолжительность.

Коллекции

В языке существуют следующие типы для работы с коллекциями:

  • Массив - список элементов, без контроля уникальности. Коллекция поддерживает доступ по индексу.

  • Множество – это коллекция, содержащая только уникальные элементы. Не поддерживается доступ по индексу.

  • Соответствие - словарь, список пар "ключ-значение". В соответствии поддерживается уникальность по ключу. Поддерживается доступ по индексу. Соответствие позволяет хранить элементы произвольных типов.

Перечисление

Перечисление - это специальный тип данных, множество значений которого представляет собой явно заданный набор идентификаторов. После объявления собственного перечисления, разработчик может использовать его наряду с перечислениями, которые уже существуют в языке. Для обращения к элементу перечисления следует указать имя самого перечисления и, через точку, требуемый элемент перечисления.

перечисление ОперационныеСистемы
    Windows,
    macOS,
    Linux
;

Структура

Структура - это тип, имеющий фиксированный набор полей и конструкторов. Каждое поле имеет тип, указанный при разработке структуры. Структура может содержать только данные и не может содержать описания методов. После описания структуры, ее можно использовать в программах наряду с другими типами данных.

структура ОписаниеФайла
    пер ИмяФайла: Строка = "" // имя файла
    знч Исполняемый: Булево = Ложь // тип файла   
    пер ПолныйПуть: Строка = "" // полный путь
    пер РазмерФайла: Число = 0 // размер файла
;

Стандартная библиотека

Кроме базовых объектов, которые рассматривались ранее, система 1С:Исполнитель включает стандартную библиотеку. Стандартная библиотека - это набор объектов, который является составной частью системы 1С:Исполнитель и позволяет выполнять различные действия, в том числе с внешним, по отношению к системе 1С:Исполнитель окружением.

Стандартная библиотека включает в себя большое количество различных объектов. Сюда входят  объекты для работы с:

  • Процессами операционной системы

  • Системным окружением (переменные среды и т.д.)

  • Файловой системой

  • Протоколами HTTP, SMTP

  • JSON, XML, ZIP

  • Системой взаимодействия

  • Администрированием кластера 1C:Предприятия 

Пример использования

Код ниже подключается а Системе взаимодействия и выводит в консоль непрочитанные сообщения первых 10 непрочитанных обсуждений.

метод РаботаССВ()
    // Адрес сервера Системы взаимодействия для создания приложения 
    пер АдресСервера = "wss://address.ecs:9094?transport=websocket&version=4"

    // Путь к файлу с хранилищем ключей, содержащему сертификат сервера СВ
    пер ФайлХранилищаJKS = "C:\\keystore.jks"

    // Строка с паролем к хранилищу 
    пер ПарольХранилища = "keystorePass"

    // Строка с паролем к сертификату 
    пер ПарольКлюча = "certPass"

    // Таймаут операции 
    пер Таймаут = 15с //15 секунд

    // Уникальный идентификатор пользователя приложения 
    пер ПользовательПриложения = новый Ууид("84eb3ebb-95ae-4dea-a025-adfa8961703c")

    // Строка с именем пользователя приложения 
    пер ИмяПользователя = "Иван"

    // Строки с полным именем пользователя приложения 
    пер ПолноеИмяПользователя = "Иванов Иван"

    // Код, который присылает сервер СВ для регистрации нового приложения 
    пер КодАктивации = "123456"

    // Адрес эл. почты для регистрации приложения на сервере СВ
    пер ПочтовыйАдрес = "ivanov@company.com"

    // ИмяПриложения подключаемой информационной базы
    пер ИмяПриложения = "myApp"

    // 1. Подключение
    СистемаВзаимодействия.Подключиться(АдресСервера, ФайлХранилищаJKS, 
        ПарольХранилища, ПарольКлюча, Таймаут)

    // 2.1. Подготовить ключи
    пер Ключи = новый КлючиПриложения()

    // 2.2. Создание приложения
    пер ПараметрыПриложенияСВ = СистемаВзаимодействия.СоздатьПриложение(Ключи, 
        ПользовательПриложения, ИмяПользователя, 
        ПолноеИмяПользователя, КодАктивации, 
        ПочтовыйАдрес, ИмяПриложения)

    // Ответ от сервера системы взаимодействия
    пер ИДПриложенияСВ: Ууид = ПараметрыПриложенияСВ.ИдентификаторПриложения   
    пер ОткрытыйКлючПриложенияСВ: Строка = ПараметрыПриложенияСВ.ОткрытыйКлюч

    // Сохранить параметры приложения для последующего использования
    Консоль.Записать(Ключи.ОткрытыйКлюч.ВСтроку())
    Консоль.Записать(Ключи.ЗакрытыйКлюч.ВСтроку())
    Консоль.Записать(ИдентификаторПриложенияСВ.ВСтроку())
    Консоль.Записать(ОткрытыйКлючПриложенияСВ.ВСтроку())

    // 3. Аутентификация 
    пер ИдПользователяСВ = СистемаВзаимодействия.Войти(Ключи, ПользовательПриложения, 
        ИмяПользователя, ПолноеИмяПользователя, ПараметрыПриложенияСВ)

    // 4. Работа с системой взаимодействия
    //Получаем первые 10 непрочитанных обсуждений и выводим в консоль
    попытка
        // получаем непрочитанные обсуждения
        пер МассивИДНепрочитанныхОбсуждений = 
            СистемаВзаимодействия.ПолучитьНепрочитанныеОбсуждения(, 10)     

        // получаем непрочитанные сообщения каждого непрочитанного обсуждения 
        //(выдаются в хронологическом порядке)
        для ИДНепрочитанногоОбсуждения из МассивИДНепрочитанныхОбсуждений
            Консоль.Записать("Обсуждение № " + ИДНепрочитанногоОбсуждения.Формат)

            пер МассивНовыхСообщений =
                СистемаВзаимодействия.ПолучитьНепрочитанныеСообщения(
                            ИДНепрочитанногоОбсуждения)

            для Сообщение из МассивНовыхСообщений
                Консоль.Записать("Сообщение # " + Сообщение.Идентификатор + 
                                    " : " + Сообщение.Текст)

            // устанавливаем прочитанное сообщение как последнее прочитанное
            СистемаВзаимодействия.УстановитьПоследнееПрочитанноеСообщение(
                ИДНепрочитанногоОбсуждения, Сообщение.Идентификатор)
            ;
        ;

    поймать Искл : ИсключениеСистемыВзаимодействия
        Консоль.ЗаписатьОшибку("Ошибка системы взаимодействия: " + Искл)
    ;

    // 5. Отключение
    СистемаВзаимодействия.Отключиться()
;


Нынешний вариант языка – предварительный. В нем в ходе приближения к релизу могут быть сделаны изменения, нарушающие обратную совместимость. И обязательно будет добавляться новая функциональность.

Теги: 1С:Исполнитель 

Рассказать друзьям: