gifts2017

1Script – язык для автоматизации рутины в жизни специалиста по 1С

Опубликовал Андрей Овсянкин (Evil Beaver) в раздел Программирование - Теория программирования

Мы все здесь – автоматизаторы бизнеса. Мы занимаемся этим каждый день и делаем это хорошо. Но практика показывает, что специалисты по 1С очень редко, очень мало автоматизируют сами себя. Есть много мелких задач, которые мы, 1С-ники, привыкли делать руками, хотя большой класс из этих задач можно было бы переложить на работу машины. Именно об этом и хотелось бы сегодня поговорить.

Что можно автоматизировать?

Что такое вообще «автоматизация специалиста по 1С»? Что такое автоматизация автоматизатора? Что он может делать автоматически?

  • Самое очевидное – это бэкапы. Автоматические бэкапы приходят в голову в первую очередь.
  • Сюда же относятся такие простые, но очень важные и очень экономящие время вещи, как:
    • автоскачивание релизов;
    • обновления;
    • какие-то выгрузки, которые не нужны бизнесу, но нужны вам лично, и т.д.

Эти задачи встречаются абсолютно у каждого, и очень многие 1С-ники делают их руками. Как вы обычно делаете выгрузку базы? Заходите в конфигуратор, нажимаете «Выгрузить» и т.д.? А почему бы не сделать себе кнопку, которая будет запускать выгрузку автоматически? Эти вещи вообще не должны делаться руками.

Мы можем автоматизировать и более интересные задачи – например, собирать для себя такие показатели, как:

  • Статистику качества кода по различным метрикам;
  • Как часто изменяется тот или иной объект метаданных;
  • Какая корреляция между количеством изменений и количеством ошибок в этом объекте метаданных.
  • А если мы интегрируем получение этой статистики в процесс автоматических сборок, мы сможем отслеживать даже такие важные показатели, как, например - кто чаще и полезнее всего коммитит в наше хранилище 1С и т.д.

На каком языке удобнее всего писать скрипты автоматизации?

Ни для кого не секрет, что современная автоматизация IT-шников преимущественно выполняется на скриптах. Скрипты – это сценарии, которые написаны в обычных текстовых файлах. Для них не нужен отдельный компилятор, не нужно создавать проект в VisualStudio – это просто текстовики, которые можно запускать на исполнение. Это просто несложные программы, написанные в текстовом виде.

На чем можно писать скрипты автоматизации применительно к 1С? Существует масса инструментов для скриптинга:

  • Есть замечательный PowerShell, которым можно сделать очень много всего интересного и полезного. Правда, он есть только на Windows и у него довольно специфичный синтаксис.
    Не знаю, кому как, но мне, когда я что-то делал на Powershell (сейчас уже не делаю, потому что у меня есть OneScript), его синтаксис показался очень неудобным. Если оставить его использование на пару месяцев, то потом при возвращении приходится изучать его заново – настолько он быстро забывается из-за своей необычной специфики.
  • Есть VBScript, который также доступен только на Windows. Это довольно «бедный язык» и без обвязок в виде COM-объектов на нем писать не очень интересно. Он не то чтобы не мощный – он, скорее, просто скучный.
  • Есть прекрасные Python и Ruby, которые работают уже не только на Windows. Они кроссплатформенные, у них богатейшая библиотека объектов, огромные возможности – это прекрасные языки. Но они, опять же, требуют от 1С-ника специальной квалификации, поскольку это – отдельная область знаний, которую нужно изучить дополнительно к тем задачам по автоматизации бизнеса, которые у нас уже есть. И когда помимо бизнеса, который требует от нас автоматизации, нам нужно автоматизировать еще и самих себя, нам приходится изучать для этого целый отдельный спектр языков и их библиотек. Это неудобно.
  • Поэтому и появился OneScript. Это скриптовый язык, который выполняет текстовые файлы (маленькие, большие, какие угодно), но при этом не требует изучения нового языка и новых библиотек. Это – язык 1С, который выполняется независимо от платформы: может выполняться в Windows, в Linux, даже под управлением HTTP-сервера – где угодно. При этом он может расширяться, может добавлять новые библиотеки и т.д. Это – средство написания скриптов для 1С-ников на любимом нами языке 1С.

Что такое 1Script?

Итак, OneScript – это независимый от платформы 1С (никаким образом не использующий библиотеки платформы), кроссплатформенный интерпретатор языка 1С с полнофункциональной прикладной библиотекой.

Там есть работа с сетью, работа с файлами, с операционной системой.

Есть несколько режимов, несколько окружений работы.Это может быть:

  • Независимый скриптинг.
  • Разработка самостоятельных модульных консольных утилит.
  • А также несложные веб-службы, которые позволяет запускать специальный режим работы в качестве CGI-приложения под управлением HTTP-сервера. В этом режиме мы можем даже писать на 1С сайты. Но это, конечно, не самое правильное применение OneScript, потому что для написания сайтов есть соответствующие инструменты.

Как мы используем 1Script?

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

  • Итак, самое основное и самое полезное, что мы делаем – это синхронизация хранилища 1С с GIT. Решение этой задачи дало нам очень много дополнительных возможностей.
  • Кроме этого, с помощью скриптов на OneScript мы строим нашу непрерывную интеграцию:
    • В частности, мы автоматизировали сборку для наших решений на базе 1С.
    • И настроили автоматическое развертывание из собранного дистрибутива в рабочий контур.
  • И наконец, мы автоматически собираем метрики кода. Это позволяет нам анализировать общую статистику по качеству того кода, который выдают наши разработчики 1С.

Синхронизация с GIT

Итак, синхронизация хранилища 1С с GIT. Зачем нам это вдруг понадобилось?

Ответ, на самом деле, простой: такая синхронизация позволяет увеличить скорость доступа к истории кода.

Как мы привыкли работать с хранилищем 1С? Например, придя рано утром на работу, мы поняли, что у нас в коде есть некая строчка, которая все ломает. Кто внес эту строчку и когда? Мы открываем историю кода, отматываем пару версий назад, запускаем сравнение, идем пить чай, возвращаемся, смотрим: не та версия, строчка все еще есть. Выбираем новую историю, запускаем сравнение, выпиваем чай, смотрим: не та версия. Ругаемся матом, выбираем другую версию и т.д. Получается, что из-за несовершенства инструмента мы тратим наше драгоценное время, неэффективно расходуем его, выполняя разбор полетов – кто и когда внес эту строчку.

А имея код исходников 1С в GIT, мне достаточно написать: git blame, и через секунду я уже вижу, кто внес эту строчку и когда. Таким образом, синхронизация хранилища 1С с GIT не заставляет меня пить чай литрами.

Для синхронизации хранилища с GIT мы используем специальное приложение на OneScript, о нем – чуть позже.

Пример выгруженных в GIT исходников 1С показан на скриншоте. В качестве сервера репозиториев мы используем Stash (это корпоративный аналог BitBucket).

У нас в компании внедрен стек Atlassian – это Stash, Jira, Codereview в виде Crucible и т.д., причем все эти инструменты  замечательно интегрированы. Это дает очень полезный совокупный эффект.

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

Особенности синхронизации:

  • Для каждого коммита в таблице указан его автор – ссылка на соответствующего пользователя домена Stash.
    Естественно, что в хранилище 1С свои пользователи, они сохраняют туда результаты своей работы и пишут комментарии к закладкам. Причем пользователи хранилища 1С могут называться совсем по-другому,  чем соответствующие им пользователи Stash. А при запуске приложения gitsync пользователи хранилища 1С автоматически отображаются на пользователей домена Stash. И результаты мы видим уже в разрезе доменных пользователей – кто сделал закладку и когда.
  • Также для каждого коммита отображается соответствующий ему текст закладки из хранилища 1С
  • А если в комментарии к закладке был указан код задачи, то мы в отдельной колонке видим ссылку для ее открытия в Jira.И наоборот, рассматривая задачу в Jira, мы можем увидеть, какие строки кода были изменены в ходе работы над ней.

Самое главное здесь то, что мы при этом ничего не ждем. В мире и так сделано очень много полезных инструментов, и мы можем успешно их друг с другом интегрировать. Например, изобретен GIT, а с ним уже по умолчанию работает масса инструментов, включая и те, о которых я говорю. Поэтому, получая исходники в GIT, мы автоматически получаем доступ ко всем наработкам мирового сообщества. Это очень удобно.

Точно так же доступен быстрый контроль изменений в рамках коммита – я сразу вижу, кто, что и где менял, по каким модулям.

Еще один момент, от которого мы получили пользу практически сразу, как только внедрили – это обзоры кода. Это та штука, которая дала моментальный положительный эффект– мы сразу сказали: «Вау, как классно получается!»

Обзор кода мы выполняем с помощью Atlassian Crucible. Это продукт также из стека Atlassian, он тоже успешно интегрируется.

Какие положительные моменты мы получаем? Их несколько.

  • В первую очередь, это обмен знаниями, даже на нескольких уровнях. Мы выделили экспертную группу, которой команда доверяет, разрешая смотреть и критиковать код:
    • во-первых, идет обмен знаниями от экспертов к менее опытным коллегам, когда они передают какой-то опыт и говорят – так делать можно, а так нельзя и т.д.
    • а во-вторых, когда эксперты комментируют одну и ту же задачу, они еще и обучают друг друга: один заметил одно, другой – другое, научили друг друга. Это активизирует обмен знаниями и накопление опыта в команде.
  • При проведении обзоров кода удалось решить еще одну важную проблему. Дело в том, что разработчики, когда пишут, не знают, что делает их коллега. Они в соседний модуль не лезут: «я там ничего не знаю, ничего не понимаю, и знать не хочу». А сейчас, после внедрения обзоров кода, они волей-неволей становятся в курсе проблем своих коллег. И в случае, например, какого-то форс-мажора или чьей-то болезни, они тоже могут подключиться к разработке, потому что теперь они также владеют темой этого модуля (хотя, в принципе, это произошло автоматически – их никто не заставлял). Получается, что, изучая код, разработчики учатся тому, что происходит в соседних модуляхлучше понимают архитектуру системы, меньше пишут костылей, меньше копипаста и т.д.
    Этот полезный эффект мы получили практически в первые дни после внедрения обзоров кода.
  • И третий момент – у нас стали быстро находиться баги. Они стали находиться еще даже до попадания в сборку, не говоря уже про рабочий контур. Это стало возможным именно благодаря таким просмотрам кода. Когда смотришь свой код, в нем тяжело найти ошибку, но стоит отдать его чужому человеку, он находит ошибки очень быстро. Это очень эффективно, попробуйте!

Как мы получили все эти прелести?

Мы взяли инструмент  v83unpack, который написал очень уважаемый мною Евгений Сосна. Если кто не знает, v83unpack – внешняя обработка, которая выложена на github. А поскольку она написана на 1С, то мы обычным копированием через буфер обмена можем просто перенести ее код в скрипт и выполнять там (с небольшими изменениями). На базе этой обработки и было написано приложение gitsync.

Приложение gitsync – это именно консольная утилита. Поэтому запуская ее, вы даже не думаете, на каком языке она написана, вы прямо в командной строке пишете:

gitsync <путь к хранилищу> <url удаленного репозитория>

Нажимаете Enter – и все, пошла синхронизация.

Сборка релиза

У нас внедрено релизное управление – это означает, что на рабочий контур накатывается не какая-то закладка в хранилище 1С, а выпускается специальный новый релиз, для которого мы собираем полноценный setup.exe (такой же полноценный дистрибутив, с каким поставляются типовые конфигурации и который устанавливается в каталог шаблонов).

Этот дистрибутив включает в себя не только код, но и документацию, приемочные тесты, какие-то внешние обработки и т.д. Все это мы также храним в GIT. Получается, что у нас не только код, но и вся сопроводительная документация, все материалы к релизу также версионируются в едином хранилище.

И, когда мы запускаем цикл сборки, все это компонуется в файл релиза (файл setup.exe), который мы выкладываем на сетевое хранилище, чтобы команда поддержки могла его оттуда забрать и развернуть в рабочей базе.

Развертывание релиза

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

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

Здесь показана выдержка из лога билд-сервера. Обратите внимание, что в результатах сборки отображается сообщение о работающих сеансах, которое было прописано в скрипте – соответственно, мы можем отследить, как происходил процесс развертывания.

Билд-сервер для непрерывной интеграции

В качестве билд-сервера мы у себя используем TeamCity – он показан на скриншоте. Здесь можно увидеть наши проекты и состояние по ним. Например:

  • по первому проекту показано, что его код уже синхронизирован с GIT,
  • а по второму – релиз уже развернут в нужный контур и в нем успешно проведены тесты.

Просто открываем браузер и смотрим статистику, где какая версия в каком состоянии у нас находится, и т.д.

Чтобы раскатать релиз в базу, нам достаточно нажать кнопку Runв консоли билд-сервера, и мы получаем либо развертывание, либо сборку нового релиза.

Метрики кода

Что касается метрик кода, мы в основном используем уже существующие инструменты – либо с Инфостарта, либо те, которые получили в сообществе.

  • Например,у нас идет расчет покрытия кода тестами, которое реализовано, опять же, силой таланта Леонида Паутова и Евгения Сосны.
  • Есть анализ цикломатической сложности кода, когда мы смотрим, какие модули у нас наиболее запутанные и наиболее плохие – мы каждую сборку собираем статистику по цикломатике и, если она куда-то прыгает, значит, где-то кто-то что-то плохо, непонятно написал.
  • Еще мы используем известную обработку «Копипастамер» от ildarovich – это анализ повторяющихся фрагментов кода по всей конфигурации. В результате мы можем видеть  статистику, и если какой-то показатель превышает порог, значит, кто-то, не разобравшись в коде соседа или в общих модулях, просто взял и что-то «скопипастил», хотя эту процедуру надо было просто вынести с директивой Экспорт в отдельный модуль для повторного использования. Ну и начинается сразу разбор.

Как разрабатывать скрипты?

Мы для этого используем программу Notepad++. На Инфостарте можно найти подсветку синтаксиса языка 1С для Notepad++, а всплывающая подсказка там есть прямо «из коробки».

Необходимо сделать всего лишь пару настроек, и программа Notepad++ превращается в неплохую среду разработки, которая позволяет:

  • Писать код с подсветкой синтаксиса и со всплывающей подсказкой;
  • В отдельной панели видеть файлы проекта;
  • И, что самое главное: прямо отсюда мы можем запустить этот код на выполнение и увидеть внизу его непосредственные результаты. Например, я написал код, нажал F6 и внизу пронаблюдал результат его выполнения.

Я никуда не переключаюсь – это одно окно, где есть все, что нужно для разработки скриптов. Буквально в три нажатия кнопки Notepad++ превращается в такой редактор кода. Очень удобно.

Устройство языка 1Script. Доступная документация по проекту

Как устроен OneScript внутри?

  • Это – приложение.NET, которое довольно стабильно работает и под LinuxMono 3.12 и под .NET 4.0.
  • Он написан на C#.
  • Его исходные коды открыты.
  • Есть встроенная стандартная библиотека для взаимодействия с операционной системой.
  • И еще есть набор полезных наработок – инструментов, уже написанных на OneScript.

Есть сайт – oscript.io, на котором находится вся документация по проекту.

Там описан процесс установки, запуска: как разрабатывать, расширять и т.д.

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

Новое в проекте. Библиотеки. Пакеты приложений

В прошлом году я уже делал доклад по OneScript, но тогда это был просто анонс инструмента, наработок непосредственно на скриптах на тот момент было еще очень мало, но мы уже довольно успешно использовали его у себя внутри, и нам это очень нравилось.

Постепенно накопилась кодовая база, которую захотелось использовать повторно.

Поэтому я добавил в движок возможность использовать библиотеки – была внедрена нестандартная директива препроцессора, которая так и называется: #Использовать (на скриншоте ее видно).

И теперь, если мы вначале скрипта пишем:

#Использовать <некую библиотеку>

у нас в области видимости скрипта появляются объекты этой библиотеки (классы или модули).

Например, если мы пишем:

#Использовать tempfiles

У нас подключается модуль «временные файлы», который содержит полезные функции для работы с временными файлами (автоудаление и пр.).

А для того, чтобы подключить мощную библиотеку строковых функций, нужно написать:

#Использоватьstrings

Более того, с тех пор появились пакеты программ:

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

Схема загрузки библиотек

Как организована инфраструктура для загрузки библиотек?

  • В системе есть каталог, в котором лежат установленные пакеты. Их может быть несколько – это прописывается в конфигурации.
  • И есть модуль загрузчика (это тоже скрипт), который эти пакеты загружает в область видимости движка, в область видимости скриптов.

При этом, как я уже сказал, внутреннее устройство отдельной библиотеки никак не регламентируется, никак не диктуется.

Единственное, чтобы упростить задачу разработчика, есть стандартное соглашение о том, как строить пакет так, чтобы с ним было удобно работать.

В соответствии с этим соглашениеммы можем складывать зависимые скрипты пакета в предопределенные каталоги «Классы» и «Модули»: если скрипт лежит в каталоге «Классы», значит, что это объект, который можно создавать с помощью оператора«Новый».

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

Новый Пользователь().

А если мы положим скрипт в папку «Модули», то мы сможем использовать его как общий модуль (сразу через точку, как свойство глобального контекста):

УправлениеПользователями.Удалить();
РаботаСФайлами.Существует(“log.txt”);

Если автор пакета захочет структурировать свои модули согласно этой схеме, ему надо всего лишь разложить соответствующие файлы в нужные папочки и добавить в свой пакет отдельный модуль загрузчика package-loader.os (помимо основного файла загрузчика, который лежит в корневой папке библиотек). Стандартный код такого «дополнительного» загрузчика показан на следующем слайде. При желании, его можно кастомизировать – внести туда свои правки или вообще написать свой вариант.

Что такое загрузчик? Это тоже скрипт. Поскольку вся логика загрузки библиотеки не прошита в движке, а точно так же заскриптована, мы можем просто поправить в этом скрипте событие ПриЗагрузкеБиблиотеки (здесь видно, что оно заключается в банальном переборе файлов каталога).

Как происходит загрузка библиотеки?

Когда компилятор встречает в скрипте директиву #Использовать, он ищет каталог, в котором лежит эта библиотека,инициализирует еемодуль загрузчика и выполняет его обработчик события ПриЗагрузкеБиблиотеки (там прописан алгоритм интерпретации загрузкиэтой библиотеки).

Пакетный менеджер

У нас есть облачное онлайн-хранилище пакетов, куда мы выкладываем сформированные нами наработки – вы можете их устанавливать и повторно использовать.

Для удобной работы с этими наработками есть пакетный менеджер, я назвал его opm (OneScriptPackageManager). Он также написан на OneScript и представляет собой консольную утилиту.

Вы открываете консоль и сразу пишете:

opm install gitsync

И дальше приложение запускается, идет в облако, скачивает приложение gitsync и устанавливает его. Поэтому следующим вашим шагом будет:

gitsync <хранилище такое-то> <urlрепозитория такой-то>

Это уже не просто скрипты, это приложения, которые запускаются сразу в командной строке под собственным именем.

Для того, чтобы opm мог как-то идентифицировать пакет при скачивании, автору пакета достаточно подготовить специальный файл манифеста, который пишется в стиле «конфигурирование через код». По сути, это код, но он выглядит, как конфигурационный файл.

Мы пишем в нем:

  • имя пакета такое-то,
  • версия такая-то,
  • зависит от пакетов 1, 2, 3…
  • И, если это – приложение с исполняемой точкой входа, то мы прописываем еще и эту точку входа (исполняемый файл).

В случае, если у приложения прописана исполняемая точка входа, при установке через пакетный менеджер автоматически сгенерируется shell-скрипт, который будет эту точку входа запускать. И в результате мы получаем утилиту командной строки, пользователю которой неважно, на каком языке она написана – он просто ее запускает.

Примеры библиотек

Немного о тех библиотеках, которые у нас уже есть.

Самой полезной по отдаче для нас стала библиотека v8runnerобъектная обертка для конфигуратора.

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

Конф = Новый УправлениеКонфигуратором();

Конф.ЗагрузитьКонфигурациюИзФайла(ПутьКФайлу)

И она загружает этот файл конфигурации в нужную базу.

Мы можем создать информационную базу и указать версию платформы, которая должна быть при этом использована: v8runner сам определит, где установлена платформа, каких версий, найдет максимальную или определит наиболее близкую по маске. Эти низкоуровневые и неинтересные вещи закрыты там внутри, они не отвлекают ваш мозг от решения основной задачи.

Эта библиотека оказалась очень полезной – мы ее активно применяем.

Даже если вы не будете использовать OneScript (что делать нельзя), вы можете просто использовать этот код в своих разработках 1С – поскольку синтаксис одинаковый, код можно портировать просто переносом через буфер обмена.

Вторая библиотека, которая имела такой же полезный эффект – это библиотека логирования logos, которая была написана под впечатлением от log4j (библиотека логирования для Java). Получилось логирование в стиле log4j на языке 1С.

Выглядит это так: мы у себя в коде приложения прописываем сообщения разного уровня, говорим, что это сообщение – об ошибке, это – вообще отладочное сообщение (оно нам не нужно) и т.д. А потом уже при эксплуатации приложения мы просто регулируем его «болтливость», устанавливая уровень лога (сейчас хочу отладочные сообщения, а сейчас – не хочу). Мы получаем нужный нам в данный момент уровень детализации лога, не переписывая код. Это очень удобно.

Если я не ошибаюсь, сейчас уже накоплено порядка десяти библиотек, которые родились в процессе применения OneScript в нашей компании. А поскольку мы ничего не прячем, то в проекте появляются библиотеки повторно используемого кода.

Заключение

В заключение, хотелось бы резюмировать:

  • Все, что мы делаем руками, нужно постараться автоматизировать. Если вы несколько раз подряд что-то проделали вручную, нажимая мышкой, надо задуматься: если вы сделали какую-то последовательность действий один раз – бог с ней, а если вы ее сделали два и даже три раза –надо писать скрипт автоматизации.
  • Для этого есть инструмент – OneScript, который достаточно стабильно работает (уже больше года в крупной компании в режиме боевой эксплуатации).
  • Этот инструмент – уже не просто скриптовый движок, это уже некая экосистема наработок для автоматизации 1С-ников.
  • В этой экосистеме естьоблачный пакетный менеджер, с помощью которого мы можем инсталлировать или удалять пакеты по мере необходимости, выполняя пару команд в консоли.

Язык 1С – это такая linguafranca для 1С-ников. Когда наши коллеги в соседнем отделе внедряли у себя непрерывную интеграцию, я отдал им наши скрипты и какую-то документацию. Потом через пару дней встречаю в коридоре: «ну как, получилось?» Он говорит: «да, было что-то непонятно, но я посмотрел в код и разобрался». Смысл в том, что мы говорим с ним на одном языке и, когда ему непонятно, он может просто посмотреть в код. А если бы я написал это, не дай бог, на ruby, то он бы посмотрел в код и сказал: «Что это? Не буду я разбираться, внедрять не буду». А здесь он смог посмотреть в код, разобраться и внедрить у себя полезный инструмент непрерывной интеграции (о ее пользе мы говорить не будем, она очевидна).

Ресурсы проекта:

  • В первую очередь, это oscript.ioсайт проекта, на котором есть синтаксис-помощник и документация,
  • Также это hub.oscript.iohub пакетов. Пока не богатый, но я думаю, что он будет развиваться.
  • Это https://github.com/oscript-library –репозиторий скриптов
  • И https://github.com/EvilBeaver/OneScript  – репозиторий самого движка.

****************

Данная статья написана по итогам доклада, прочитанного на конференции INFOSTART EVENT 2015 CONNECTION 15-17 октября 2015 года.

Приглашаем вас на новую конференцию INFOSTART EVENT 2016 DEVELOPER

От автора:

За год, прошедший с момента данного выступления, часть информации несколько потеряла актуальность, мы не стояли на месте и многое улучшили. В частности, активные участники сообщества @nixel2007, @bambr1975, @pumbaEO (кого забыл, напомните), создали новый редактор кода на 1С, взамен упомянутого здесь Notepad++. Рекомендую пользоваться именно этим редактором на базе Visual Studio Code.

https://github.com/xDrivenDevelopment/vsc-language-1c-bsl/blob/master/README.md

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Eugene Mc (emc2) (0.65 $m)
Подписаться Добавить вознаграждение

Комментарии

1. Артур Аюханов (artbear) 14.09.16 12:42
+1 Хорошее выступление и хорошее статья
kraynev-navi; +1 Ответить 1
2. Евгений Плешивцев (infosoft-v) 14.09.16 15:01
на сайте http://www.oscript.io/ выводится:

No Application Found

Unable to find a matching application for request:

Host www.oscript.io
Port 80
Request Path /Home
Physical Path /var/www/oscript.io/Home


Инфостарт эффект?
3. Евгений Плешивцев (infosoft-v) 14.09.16 15:09
Спасибо за отличную статью.
Коллеги, поделитесь опытом, как отлаживать скрипты? Какие инструменты доступны?
4. Евгений Плешивцев (infosoft-v) 14.09.16 15:11
Ещё вопрос. Разработка в среде VSC возможна?
5. Евгений Сосна (pumbaE) 14.09.16 15:19
(3) infosoft-v, отлаживать принтами, скажите спасибо, что не алертами.
6. Евгений Плешивцев (infosoft-v) 14.09.16 15:39
7. Пишу код как картины (yurii_host) 14.09.16 16:39
А существует ли аналог процедуры Состояние() для индикации долговыполняющихся процессов?
8. white mount (white-mount) 14.09.16 18:05
9. Кирилл Краснов (kirillkr) 14.09.16 18:52
10. Сергей (ret-Phoenix) 14.09.16 20:40
(7) yurii_host, Можно реализовать используя GUI библиотеку. синтаксис практически идентичен 1С: https://github.com/ret-Phoenix/oscript-simple-gui
11. Призрак (davdykin) 14.09.16 23:27
Спасибо! Интересно и познавательно
12. Пишу код как картины (yurii_host) 15.09.16 00:24
(10) ret-Phoenix, спасибо
Круто что даже формы есть (правда пока обычные)) )
13. Сергей (ret-Phoenix) 15.09.16 00:31
(12) yurii_host, а какие хочется?
для решения текущих задач этого хватает, даже больше чем нужно.
14. Сергей Старых (tormozit) 15.09.16 00:46
С ростом количества и сложности кода на любом языке будет расти и потребность в отладчике. У всех распространенных скриптовых языков есть отладка. Так что по-прежнему очень ждем ее.
Также была бы полезна и подсказка после точки. Какие здесь перспективы?
shalimski; alanto23; artbear; ABudnikov; Evil Beaver; pumbaE; +6 Ответить 3
15. Евгений Сосна (pumbaE) 15.09.16 09:15
Мы помним свой вопрос (14)
16. С К (kraynev-navi) 15.09.16 09:15
В разделе "На каком языке удобнее всего писать скрипты автоматизации?" еще можно упомянуть AutoIt. Вторая колонка как у PowerShell ))

(0)
Необходимо сделать всего лишь пару настроек, и программа Notepad

Я бы сюда ссылку на вашу же статью подставил
18. Сергѣй Батанов (baton_pk) 15.09.16 10:24
(0)
И https://bitbucket.org/EvilBeaver/1script/ – репозиторий самого движка.

я понимаю, что это по мотивам 2015-го года, но как бы это... https://github.com/EvilBeaver/OneScript


и https://github.com/oscript-library
19. Андрей Овсянкин (Evil Beaver) 15.09.16 11:09
(14) tormozit, если помнишь, на хабре я писал про проблему роста. Я бы с удовольствием занялся отладчиком, но куча более актуальных дел (поддержка библиотеки скриптов, багфиксы, работа, личная жизнь) не дают задаче вспыть на поверхность.
cleaner_it; +1 Ответить
20. Андрей Овсянкин (Evil Beaver) 15.09.16 11:10
21. Андрей Овсянкин (Evil Beaver) 15.09.16 11:12
(18) baton_pk, да, это чистый транскрипт выступления 2015 года, сделанный командой Инфостарта. Помимо того, что ты сказал, еще и Notepad++ стал неактуален, с выходом Visual Studio Code.

Поправлю.
22. Андрей Овсянкин (Evil Beaver) 15.09.16 11:24
23. Андрей Овсянкин (Evil Beaver) 15.09.16 11:26
(14) tormozit, А что ты про подсказку после точки спрашивал? Есть же она.
24. Сергей Старых (tormozit) 15.09.16 11:54
25. Андрей Овсянкин (Evil Beaver) 15.09.16 13:16
(24) tormozit, я имел в виду VSC, она не такая умная, какую ты хочешь, но ее хватает за глаза
26. Alex M (LeXXuS_ju) 15.09.16 15:39
Доброго времени суток.
Вот решил попробовать Gitsync, но опыта нет. Может ткнете носом почему может выдавать ошибку как на скрине.
Прикрепленные файлы:
27. Капитан Немо (capitan) 15.09.16 16:57
Все скриптовые языки рано или поздно упираются в отсутствие форм.
А затем в отсутствие БД в которой можно хранить настройки/результаты.
Но если в упомянутых выше и упомянутом всуе AutoIt, который я например считаю самым быстрым стартом в автоматизацию рутинных операций, их изначально не было, то в 1С изначально все это есть.
И упрощение - это на любителя.
ИМХО при всех упомянутых выше операциях было бы неплохо хранить результаты их выполнения.
В чем выигрыш по сравнению с БД 1С в которой живут те же скрипты, кроме свободной лицензии?
Хотя задания по администрированию обычно запускаются при отключенных пользователях и проблемы с этим не должно быть.
28. Сергей (ret-Phoenix) 15.09.16 17:05
(27) capitan,
для OneScript есть и формы (ссылка ранее приводилась https://github.com/ret-Phoenix/oscript-simple-gui) и работа с БД (https://github.com/ret-Phoenix/oscript-sql). При этом поддерживаются СУБД: MS SQL Server, PostgreSQL, MySQL, Sqlite. Операции DDL + DML

Создание бекапов - самое простое применение. сейчас на язые OneScript написано много чего, стоит глянуть библиотеку скриптов.
29. Сергей (necropunk) 15.09.16 17:56
Задумываюсь о полноценной работе с git, но c v8unpack не хватило времени разобраться, а без нее git не очень для меня полезен. В основном работаю не с самой конфигурацией, а с внешними обработками и алгоритмами в Инструментах разработчика, то есть все хранится вне базы, с промежуточными версиями в каталоге разработки. Можно ли с помощью 1Script связать каталог с git, чтобы в версиях хранился именно код внешних обработок? Если кто делал, подскажите, где почитать об этом? Пока попробую с 1Script поразбираться.
30. Сергей (ret-Phoenix) 15.09.16 17:59
31. Капитан Немо (capitan) 15.09.16 18:25
(28) ret-Phoenix, сегодня и ежедневно вчера оба сайта oscript.io в уставшем состоянии.
Но это только подтверждает мои слова - вы делаете аналог БСП, только почему то за пределами базы 1С.
32. Сергей (ret-Phoenix) 15.09.16 18:37
(31) capitan, Аналог БСП? Что за бред?
БСП - каркас для конфигураций.
На OneScript у многих из нас сделано
- бекапирование
- проверка обновлений
- чистка кеша
- управление списком баз
- синхронизация с git (как вместе с хранилищем так и без, например для внешних отчетов)
- различные схемы разворота рабочего места как пользователя так и разработчика
и много прочего. Тот же парсинг текста, приведение его в порядок. расширения конфигуратора как снегопатовские, так и мои.
33. Олег Филиппов (comol) 16.09.16 00:05
По-моему этой публикацией ты лишил денег с десяток консалтинговых компаний :)))
34. Олег Филиппов (comol) 16.09.16 00:08
Ещё бы подсветку синтаксиса 1С при codereview кто-нибудь доделал либо в gitlab либо в Atlassian
35. Андрей Овсянкин (Evil Beaver) 16.09.16 01:47
(31) capitan, сайт работает, падений не залогировано. Что именно не работает? Он не открывается по префиксу www, но это так и задумано.
36. Андрей Овсянкин (Evil Beaver) 16.09.16 01:48
(34) comol, насколько я знаю, в гитлабе уже сделали подсветку
37. Сергей (ret-Phoenix) 16.09.16 09:53
(36) Evil Beaver, На GitLab есть, но какая-то плохенькая, до того, что сделали на GitHub далеко.
38. ффф ыыы (zqzq) 16.09.16 10:22
(27) capitan, у меня вот уже более 1.5 года живёт "карманная" база 1С для административных работ: обмены, обновления и т.д..
Плюсы: быстрый старт, всё в одном месте (без внешних программ и текстовых файликов) в одной базе, можно код версионировать стандартным хранилищем и настройки забивать в справочники и логи хранить в журнале регистрации.
Минусы: так и не смог настроить, чтобы из регламентного задания 1С запускался exe конфигуратора, что-то с правами, поэтому из планировщика винды запускаю толстый клиент базы с параметрами запуска, а он уже парсит параметры и выполняет обработки.
39. Василий Зайцев (vasiliy_b) 16.09.16 11:22
(26) LeXXuS_ju, У Вас не установлен Git
40. Капитан Немо (capitan) 16.09.16 12:57
(38) zqzq, аналогично, шеф.
Я думаю, у каждого, у кого за плечами около полсотни баз имеет такую базу.
41. Eugene Mc (emc2) 16.09.16 15:36
Спасибо! За огромный труд в облегчении рутинной работы. Спасибо! Жду дальнейших новинок!
42. Alex M (LeXXuS_ju) 16.09.16 15:54
(39) vasiliy_b, да так и было))
Теперь выдает ошибку 128.
У меня возник вопрос как скрипт получает доступ к гитхабу, если мы нигде пароль не указываем?
Я пробовал генерировать ключ SSH и он даже мне отозвался через Git Bash, но после вызова
gitsync init <каталог или файл хранилища> <локальный каталог git> [-email домен почты пользователей]
пишет: Не удалось получить изменения с удаленного узла (код : 128).
Прописал еще это:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
P.S. [-email домен почты пользователей] - это просто email,под которым зарегистрирован на Гитхабе?
43. Василий Зайцев (vasiliy_b) 16.09.16 18:07
(42) LeXXuS_ju, пароль будет спрашиваться тогда когда вы будете выполнять обмен с сервером например после команды "git push -u origin master"
44. Максим Евсенкин (tehas) 19.09.16 17:21
Крутая вещь!
Есть маленький недочет (я так думаю).
Что бы передать переменную с текстом (например) а = "1C:Enterprise 8.3 Server Agent";
Приходится писать примерно так:
Служба = Символ("34") + "1C:Enterprise 8.3 Server Agent"+Символ("34");

Иначе на выходе имеем 1C:Enterprise 8.3 Server Agent (то есть уже без кавычек).
Может не совсем ясно описал, попробую привести пример:

Так команда не выполнится, так как есть пробелы между слов:
Служба = "1C:Enterprise 8.3 Server Agent";
ЗапуститьПриложение("net stop "+Служба,,Истина);

Сейчас выполнится, так как передастся именно с кавычками:
Служба = Символ("34") + "1C:Enterprise 8.3 Server Agent"+Символ("34");
ЗапуститьПриложение("net stop "+Служба,,Истина);
45. Василий Зайцев (vasiliy_b) 19.09.16 17:55
(44) tehas, я тоже пока изучаю возможности, поэтому задам наводящий вопрос, а так писать пробовали:
Служба = """1C:Enterprise 8.3 Server Agent""";
?
т.е как в 1с поставить 3 кавычки в начале и 3 в конце
46. Максим Евсенкин (tehas) 19.09.16 21:24
(45) нашел у них в скриптах функцию
Функция ОбернутьВКавычки(Знач Строка);
	Если Лев(Строка, 1) = """" и Прав(Строка, 1) = """" Тогда
		Возврат Строка;
	Иначе
		Возврат """" + Строка + """";
	КонецЕсли;
КонецФункции
...Показать Скрыть

Думаю не зря именно ее используют.
47. Василий Зайцев (vasiliy_b) 20.09.16 10:28
(46) tehas, Все правильно, там как раз используется принцип двойных кавычек. Так что все отрабатывается как в 1с
48. raevsky раевский (raevsky@e1.ru) 20.09.16 14:24
Так и не открывается:

При получении URL http://oscript.io/downloads произошла следующая ошибка

Соединение с 212.116.121.15 не удалось

Система вернула: (113) No route to host

Удаленный узел или сеть недоступен. Повторите запрос позднее
49. Андрей Овсянкин (Evil Beaver) 21.09.16 23:49
(48) raevsky@e1.ru, ну я не знаю....



http://prntscr.com/cksi5h

Вот сайт на текущий момент. Позавчера действительно был остановлен на несколько часов, но это только и всего.
50. Андрей Овсянкин (Evil Beaver) 21.09.16 23:54
(44) (46) tehas, экранирование кавычек работает точно так же, как в 1С. Дублированием символа кавычки.

Непонятно, почему у вас возникла необходимость использовать Символ( 34 ).
51. Сергѣй Батанов (baton_pk) 22.09.16 10:41
(49) Evil Beaver, было-было. не ругайте человека. не был вчера сайт доступен.
52. Андрей Овсянкин (Evil Beaver) 22.09.16 14:20
(51) baton_pk, не ругаю ) Кстати, если нужно просто скачать дистрибутив, то на гитхабе есть раздел releases, куда также выкладываются файлы программы.
53. s e (dreadlord) 22.09.16 14:56
Оч познавательная статья, спасибо. Инструмент обновляем
54. Игорь Фелькер (Brawler) 24.09.16 20:41
Не зря 1С навела паники по поводу вирусов)))
Скоро их реально станет больше и их налобают даже на 1Script )))
55. Андрей Овсянкин (Evil Beaver) 26.09.16 19:43
(54) Brawler, ну да. Чтобы заразить машину нужно поставить движок, скачать вредный файл, запустить его с полными правами... А так, конечно, язык виноват, что на нем вирусы пишут, да )
56. Сергей (necropunk) 04.10.16 15:12
Пытаюсь осваивать потихоньку, но есть проблемы.
Поставил Notepad++, подсветку, поставил плагин NppExec, по F6 прописал oscript "$(FULL_CURRENT_PATH)" но у меня при запуске любого файла, даже просто с кодом Сообщить("!"); выдается ошибка:
oscript "C:\Work\test.os"
CreateProcess() failed with error code 2:
Не удается найти указанный файл.

Не подскажете в чем может быть дело? И подсказок через точку нет, можно их как-то включить?
57. Сергей (necropunk) 04.10.16 16:49
(56) necropunk, Хм, я запускал из тоталкоммандера, по F4, а надо запускать от администратора. Не особо удобно, но ладно, будем дальше попробовать.
58. Serg (serg_infostart) 07.10.16 16:21
Пытаюсь начать пользоваться gitsync....
Получаю следующую ошибку:
E:\test_gitsync_src\001>git status
fatal: Not a git repository (or any of the parent directories): .git

E:\test_gitsync_src\001>gitsync -init "E:\test_gitsync\001"
ИНФОРМАЦИЯ - Начинаю синхронизацию хранилища 1С и репозитария GIT
ИНФОРМАЦИЯ - Получение изменений с удаленного узла (pull)
ИНФОРМАЦИЯ - fatal: Not a git repository (or any of the parent directories): .gi
t

ОШИБКА - {Модуль C:\Program Files (x86)\OneScript\lib\gitsync\src\gitsync.os / О
шибка в строке: 321 / Не удалось получить изменения с удаленного узла (код: 128)
}

E:\test_gitsync_src\001>
...Показать Скрыть


Обратил внимание, что
E:\test_gitsync_src\001>gitsync
Синхронизация хранилища конфигураций 1С с репозитарием GIT.
Использование:
        gitsync <storage-path> <git-url> [local-dir] [ключи]
        gitsync <команда> <параметры команды> [ключи]
Параметры:
 <ПутьКХранилищу> - Файловый путь к каталогу хранилища конфигурации 1С.
 <URLРепозитория> - Адрес удаленного репозитория GIT.
 <ЛокальныйКаталогГит> - Каталог исходников внутри локальной копии git-репозитар
ия.
 -email - <домен почты для пользователей git>
 -v8version - Маска версии платформы (8.3, 8.3.5, 8.3.6.2299 и т.п.)
 -debug - <on|off>
 -verbose - <on|off>
 -branch - <имя ветки git>
 -format - <hierarchical|plain>

Возможные команды:
 clone        - Клонирует существующий репозиторий и создает служебные файлы
 init         - Создает новый репозиторий и создает служебные файлы
 all          - Запускает синхронизацию по нескольким репозиториям
 set-version  - Устанавливает необходимую версию в файл VERSION
 help         - Вывести справку по параметрам команды
 export       - Выполнить локальную синхронизацию, без pull/push
Для подсказки по конкретной команде наберите gitsync help <команда>
ОШИБКА - Указаны некорректные аргументы командной строки
...Показать Скрыть


Пытаюсь без "-" выполнить:
E:\test_gitsync_src\001>gitsync init "E:\test_gitsync\001"
ОШИБКА - {Модуль C:\Program Files (x86)\OneScript\lib\gitsync\src\gitsync.os / О
шибка в строке: 201 / Метод объекта не обнаружен (ПроверитьНаличиеРепозитарияГит
)}

E:\test_gitsync_src\001>
...Показать Скрыть
59. Андрей Овсянкин (Evil Beaver) 10.10.16 12:32
(58) serg_infostart, для gitsync и других полезных пакетов есть отдельный канал обсуждения - https://gitter.im/EvilBeaver/oscript-library.

Там будет быстрее и продуктивнее.
60. Андрей Ильин (su_mai) 19.10.16 11:51
Подскажи, что можно придумать для эмуляции нажатия кнопок экранных форм, например, по координатам. Может есть что-то уже готовое в 1Script? Может есть готовый подход, попроще?
61. Андрей Овсянкин (Evil Beaver) 19.10.16 16:02
(60) su_mai, есть AutoIt и Sikuli. Последнее активно используется в vanessa-behavior, примеры можно посмотреть там же.
62. Роман афанасьев (aromait) 19.10.16 16:52
Спасибо. Отличная статья. Надо обязательно посмотреть, более подробно, что он из себя представляет.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа