Скрипты – наше все!
Что такое скрипт или, по-другому, сценарий? Это простой текстовый файл с кодом, который можно выполнить непосредственно. Без компиляции, без построения промежуточных выполняемых модулей – прямо из текстовика.
Скрипт – это часто одноразовая программа, которая сделает вам нужную работу. Ее просто накидать, просто запустить, просто получить результат.
На windows традиционно была нехватка мощных средств автоматизации с помощью скриптов. Я знаю, что есть виртуозы BAT-файлов, которые могут творить с ними чудеса, но все же овладение этим инструментом занятие не для слабонервных.
Кроме того, на windows есть система Windows Script Host (WSH) которая позволяет уже писать более-менее функциональные скрипты на VBScript или JS, однако, когда дело доходит до работы с кириллицей – начинаются шаманские пляски с бубном.
Еще есть Powershell, который, бесспорно является сильным шагом вперед, но тоже иногда добавляет радостей своими несколько своеобразными подходами к решению задач.
Ну и в Linux, конечно, очень распространен скриптинг. Развитая система родных shell-скриптов, которыми можно делать практически любую автоматизацию системы, в Linux дополняется возможностью подключить любой другой скриптовый язык.
Однако, у всех перечисленных инструментов есть одна проблема.
Все это чужеродные элементы!
Для того, чтобы сделать что-либо вне платформы 1С, нам нужно изучить хотя бы один из этих языков и технологий. Само по себе это неплохо, но, во-первых, это отрыв от реальных задач, а во-вторых, эти технологии имеют обыкновение забываться со временем. И каждое возвращение из 1С в другую экосистему зачастую означает повторное изучение (вспоминание) синтаксиса, основных команд и всего такого прочего.
Есть решение!
Чтобы сделать скрипт, решающий наши проблемы, не нужно переключаться на другой язык. Нужно писать скрипты прямо на языке 1С!
Что может быть автоматизировано?
Если вкратце, то практически все, что угодно :) Приведу простой пример. Не так давно на нашем сервере, который управляет git-репозиториями, поменялся URL. Нужно было переключить все локальные копии на моей машине на этот новый адрес. Таких локальных копий у меня было около 10-ти.
Вручную я должен был войти в каждую папку, набрать там команду git remote, скопировать оттуда старый адрес, преобразовать его в новый и выполнить git remote set-url уже с новым URL.
Я не помню, как все это сделать на Powershell и тем более на BAT/CMD. Более того, я не хочу все это вспоминать. Вместо этого, я взял и написал скрипт на языке 1С. Всего-то перебрать папки из списка, в каждой из них дважды запустить git. Раз плюнуть. Потом скрипт переехал к коллегам, столкнувшимся с той же проблемой.
Что такое 1Script?
На конференции Infostart Event 2014 мною был представлен новый скриптовый движок, позволяющий исполнять код на языке 1С:Предприятия, но без самой платформы 1С. Фактически, это новый инструмент автоматизации, не требующий переключения контекста из 1С в абракадабру другого языка и обратно, и который может быть использован специалистами по 1С для автоматизации той или иной рутинной работы внутри операционной системы.
Технически он устроен, как и любой другой скриптовый движок (Python, JScript, PHP). Это интерпретатор, выполняющий текстовые файлы, как правило, в консольном режиме. Преимущество перед другими языками здесь в том, что вы не переключаетесь в чужеродную экосистему, для выполнения задачи. Вы не тратите время на изучение (или вспоминание) другого языка. Вы просто пишете на 1С. При этом вы не запускаете платформу, вам не нужен лицензионный ключ, вам не нужно выбирать в меню "Файл" внешнюю обработку, которая выполнит нужные действия. Создаете текстовый файл и пишете прямо в нем. Его же запускаете на выполнение.
Кстати, забыл сказать, что это кросс-платформенный инструмент. Вы можете писать скрипты под Linux на языке 1С с той же простотой.
Предлагаю рассмотреть порядок установки и запуска вашего первого скрипта на OneScript. В качестве примера возьмем ту самую задачу с изменением URL для git-репозитория.
Установка интерпретатора.
OneScript имеет открытый исходный код и доступен в публичном репозитарии на bitbucket.
В большинстве открытых проектов, как правило, есть опубликованная стабильная ветка и ветка, которая находится в разработке. Разрабатываемая версия обычно содержит больше функциональных возможностей. Для ознакомления и изучения рекомендую скачать версию из разработки. Она интереснее.
Есть два вида дистрибутива – инсталлятор и просто архив с файлами программы. Нам нужен инсталлятор. Скачиваем и запускаем его.
Далее-далее-далее, ждем завершения установки.
Инсталлятор автоматически пропишет oscript.exe в переменную PATH, чтобы было удобно пользоваться интерпретатором. Для проверки нужно запустить командную строку и набрать там команду oscript. Если все успешно, то должно появится следующее сообщение:
Если система не опознала команду, то нужно выйти и снова войти в систему (перелогиниться в системе), чтобы переменная PATH обновилась.
Настройка окружения для разработки
ВНИМАНИЕ! Информация о редакторе кода на данный момент устарела, поскольку, сообщество уже создало намного более совершенный редактор для кода 1С на базе Visual Studio Code. Неплохое руководство по которому можно прочитать по ссылке //infostart.ru/public/687869/ Разумеется, редактор описываемый ниже, тоже можно использовать, но имейте в виду, что есть намного более удобный способ разработки. С уважением, ваш Evil Beaver. 22.10.2017
В принципе, скрипты можно писать в любом текстовом редакторе, но все-таки хочется подсветки синтаксиса и контекстной подсказки.
Если у вас есть Снегопат, то вы можете писать скрипты в Конфигураторе 1С. При переключении текстового документа в режим встроенного языка Снегопат будет предоставлять контекстную подсказку, как будто это не скрипт, а обычный модуль 1С.
Я этим способом не пользуюсь, а пишу скрипты в Notepad++. Не пугайтесь, это не просто блокнот, а я не чокнутый гик (хотя в последнем не уверен). В Notepad++ есть и подсветка и подсказка и средства выполнения скрипта, который вы в данный момент пишете. Нужно только все это включить. Этот блокнот легко превращается в неплохую среду разработки.
А вот и контекстная подсказка.
Включаем подсветку синтаксиса Notepad++
Во-первых, нужно установить сам Notepad++
Чтобы Notepad++ заиграл красками 1С в нем нужно произвести несколько настроек. Во-первых, установить файл подсветки синтаксиса. Скачать его можно вот здесь или во вложении к статье. Далее, заходим в меню «Синтаксисы/Задать свой синтаксис».
В этом окне нажимаем кнопку «Импорт» и выбираем файл с синтаксисом 1С. Убедитесь что в поле «Расширение» установлено значение «os». При открытии файлов с этим расширением Notepad++ будет автоматически включать нужную подсветку синтаксиса.
Если подсветка не включилась
В Notepad++ есть странный глюк. Подсветка синтаксиса 1С в нем работает только если файл использует кодировку UTF-8. Поэтому, рекомендуется все скрипты кодировать именно так. Если подсветка после импорта из файла не включилась – нужно переключить кодировку в UTF-8 (меню «Кодировки\Преобразовать в UTF-8») и перезапустить блокнот.
Устанавливаем плагины
Существует огромное количество удобных плагинов для NPP. Все они удобным образом устанавливаются через менеджер плагинов, запускаемый из меню «Плагины – Plugin Manager – Show Plugin Manager»
Для разработки скриптов наиболее полезным является плагин NppExec. Он позволяет, не выходя из блокнота, запускать какое-либо приложение и наблюдать его консольный вывод непосредственно в окне Notepad++.
Для разработчика скриптов это означает, что он пишет скрипт, нажимает кнопку и видит результат работы скрипта сразу же, в окне блокнота. Этим обеспечивается быстрый цикл разработки в стиле «Написал-Нажал-Посмотрел результат»
Устанавливаем в менеджере плагинов флажок возле NppExec и запускаем установку. После установки в меню "Плагины" появится пункт NppExec. В подменю этого пункта рекомендуется установить флажок "Follow ($CURRENT_DIRECTORY)". При запуске скрипта на выполнение он автоматически будет стартовать в той директории, где лежит файл запускаемого скрипта.
Настраиваем запуск скрипта
NppExec работает следующим образом:
- Нажимаем кнопку F6 и в открывшемся окне вводим команду для запуска. Жмем ОК и она выполняется. Результат будет выведен в отдельную всплывающую панель
- Далее, жмем Ctrl+F6 и предыдущая команда запускается еще раз
То есть, нам нужно в окне запуска ввести команду oscript $(FULL_CURRENT_PATH) и нажать ОК. В консоли будет выведен результат работы того скрипта, который сейчас открыт в блокноте.
На этом настройка рабочего окружения закончена. Это было несложно:
- Установили Notepad++
- Установили подсветку синтаксиса
- Установили плагин NppExec и настроили команду запуска текущего скрипта
- Профит
Автоматизируемся!
Давайте вернемся к исходной задаче перенастройки git-репозиториев. Итак, есть каталог, внутри которого находятся локальные копии разных репозиториев.
Задача – перенастроить их на другой url.
Создаем новый файл с расширением os. Если у вас блокнот настроен на кодировку ANSI – переключаемся в UTF-8, чтобы работала подсветка.
А дальше – все, как в 1С. Скрипт начинает выполняться «с конца». При запуске выполняется код в самом низу модуля.
Для того, чтобы было проще сориентироваться в возможностях 1Script, имеется своего рода «Синтакс-помощник» в wiki проекта. Он описывает доступные языковые средства, классы, методы и т.п.
РабочийКаталог = "C:\Documents\GITs"; ОбойтиВсеРепозитарииВКаталоге(РабочийКаталог);
Теперь создаем процедуру «ОбойтиВсеРепозитарииВКаталоге»
// Перерегистрация репозитариев Процедура ОбойтиВсеРепозитарииВКаталоге(Знач РабочийКаталог); Каталоги = НайтиФайлы(РабочийКаталог, "*.*", Ложь); Для Каждого НайденныйФайл Из Каталоги Цикл Если НайденныйФайл.ЭтоКаталог() Тогда ОбработатьКаталог(НайденныйФайл.ПолноеИмя); КонецЕсли; КонецЦикла; КонецПроцедуры
Ну и дело за малым – запустить гит для получения и изменения URL в процедуре «ОбработатьКаталог»
Процедура ОбработатьКаталог(Знач Каталог) Сообщить("Обрабатываю каталог " + Каталог); КаталогГит = Новый Файл(Каталог + "\.git"); Если Не КаталогГит.Существует() Тогда Сообщить("Каталог не является git-репозиторием"); Возврат; КонецЕсли; ЛогГит = ПолучитьИмяВременногоФайла(); КодВозврата = -1; ЗапуститьПриложение("cmd /C git remote -v > " + ЛогГит, Каталог, Истина, КодВозврата); Если КодВозврата <> 0 Тогда Сообщить("Ошибка получения git remote"); Сообщить(ПрочитатьФайл(ЛогГит)); Возврат; КонецЕсли; ОсновнойАдрес = ПрочитатьАдрес(ЛогГит); Если ОсновнойАдрес = Неопределено Тогда Возврат; КонецЕсли; Сообщить("URL: " + ОсновнойАдрес); НовыйУрл = СтрЗаменить(ОсновнойАдрес, "http://old-server", "http:new-server"); Сообщить("Перенаправляю на " + НовыйУрл); КодВозврата = -1; ЗапуститьПриложение("cmd /C git remote set-url origin " + НовыйУрл + " > " + ЛогГит, Каталог, Истина, КодВозврата); Если КодВозврата <> 0 Тогда Сообщить("Ошибка git set-url"); Сообщить(ПрочитатьФайл(ЛогГит)); Возврат; КонецЕсли; Сообщить("Каталог " + Каталог + " обработан"); КонецПроцедуры
Ну и остались служебные процедуры «ПрочитатьАдрес» и «ПрочитатьФайл». Не буду их приводить из экономии места. Там банальное чтение файлов с помощью ЧтениеТекста.
Ну и дальше, жмем в блокноте Ctrl+F6 и наблюдаем за работой скрипта:
Мы только что написали несложный код на знакомом и любимом языке. Мы очень хорошо знаем его и можем творить с ним чудеса, верно? И обратите внимание, нам не потребовался Конфигуратор, мы вообще не трогали 1С. OneScript не использует никакие библиотеки платформы и не требует ее установки на машину.
Полный код приведенного скрипта можно посмотреть на GitHub (https://gist.github.com/EvilBeaver/14292ad7269d9d17ea8e)
Что еще можно автоматизировать? Можно, например, разложить архив домашних фотографий по папкам Год\Месяц и автоматизировать этот процесс, настроив мониторинг какой-либо папки «Входящие фотки» через планировщик операционной системы. На знакомом языке сделать такое – пара пустяков, верно?
Немного экономики
Мы у себя в работе используем OneScript для самых разных задач. От автоматизации развертывания баз 1С и синхронизации исходников конфигураций в git, до расчета покрытия кода тестами. Код наших скриптов также расположен в git, и любой 1С-ник компании может при желании что-то доработать. Язык знаком всем и не требует дополнительных навыков.
Производительность кода по нашим оценкам, как минимум, не хуже 1С. На некоторых задачах OneScript быстрее почти в 2 раза, на некоторых – примерно одинаково. Радикального проигрыша 1Script в скорости по сравнению с 1С мы пока не наблюдали.
Сейчас, в пору кризисов и санкций в Сети все чаще попадаются предложения по экономии на лицензиях для Windows, есть success-story по переводу части парка машин на Linux. Если посчитать лицензии Microsoft по текущему курсу, то переезд на Линукс выглядит все более привлекательным. Если вы строили автоматизацию на Powershell, то он станет у вас камнем преткновения. OneScript работает под Linux и вы можете автоматизировать свою деятельность независимо от того, какая ОС применяется (или будет применяться в будущем) в вашей компании. Если 1С-ники вашей фирмы пересядут на линукс, то им (в идеале) не придется изучать shell-скрипты. Они смогут пользоваться знакомым языком программирования.
Заключение
За минувший год 1Script вырос из исследовательского проекта в продукт, успешно применяемый в реальных бизнес-решениях. Это полноценный независимый кросс-платформенный интерпретатор языка 1С. Исходные коды открыты. Справка по доступным классам и глобальным процедурам доступна и постоянно обновляется.
Вы всегда можете добавить в движок новую функциональность и поделиться ей с сообществом. Наша команда будет рада помочь вам войти в этот процесс.
Писать скрипты – это просто, а главное – эффективно. Автоматизируйтесь! Пусть страх перед незнакомыми языками программирования больше не останавливает вас.