Что такое скрипт для 1с. Что ещё полезно изучить перед написанием скриптов

В этой статье я постараюсь дать пару советов по настройке активации скриптов на сайтах с помощью 1С.

Зачем это может понадобиться? В моем примере запуск скрипта php мне понадобился для активации загрузки на сайте, cms которого — 1С-Битрикс. Т.е. файл выгружается из 1С и сигнализирует сайту о необходимости подобрать файл. Тем самым достигается высокая оперативность обмена с сайтом.

На самом деле ничего тяжелого в этом процессе нет, но в силу специфики данной процедуры у программиста могут возникнуть некоторые проблемы с данным действием.

Описание задачи:

Было необходимо после выгрузки файла с данными из 1С как можно быстрее загрузить файл в БД сайта. Для этого программистом, который разрабатывает сайт, был создан скрипт, который производил два действия — проверял авторизацию и активировал обмен со стороны сайта. Сам скрипт php имел вот такой вид «http:///1c_prices_import_run.php».

Рассмотрим, как же производился запуск этого скрипта.

GET запрос из 1С

Первым делом создается объект «HTTPСоединение «, с помощью которого производим авторизацию:

Получите 267 видеоуроков по 1С бесплатно:

HTTP = Новый HTTPСоединение(«/1c_prices_import_run.php

В параметры я передаю адрес скрипта php , пароль и логин. Этого достаточно, если у Вас нет других хитрых условий вроде защищенной авторизации и прокси-сервера.

Вторым моим шагом была проверка подключения, в случае успешной авторизации данный скрипт возвращал мне слово «success»:

HTTP.Получить(«http:///1c_prices_import_run.php?mode=checkauth «, ИмяФайлаОтвета); // проверка авторизации

В параметрах метода Получить (аналог GET) мы указываем у скрипта php параметр «?mode=checkauth», который показывает, что это просто проверка связи. Второй параметр — «ИмяФайлаОтвета» — это файл, в который будет записан ответ сервера.

HTTP.Получить(«http:///1c_prices_import_run.php?mode=query «, ИмяФайлаЗапроса);

На этом всё. Всё достаточно просто и работает на стороне 1С отлично.

Ну и в итоге покажу весь код целиком:

ИмяФайлаЗапроса= ПолучитьИмяВременногоФайла();

HTTP = Новый HTTPСоединение(«http:///1c_prices_import_run.php «, НастройкаОбменаДанными.HTTPОбменИмяПользователя, НастройкаОбменаДанными.HTTPОбменПароль,); //подключение

Исключение

КонецПопытки;

HTTP.Получить(http:///1c_prices_import_run.php ?mode=checkauth», ИмяФайлаЗапроса); // проверка авторизации

Исключение

КонецПопытки;

ФайлОтвета = Новый Файл(ИмяФайлаОтвета);

Если ФайлОтвета.Существует() Тогда

Что такое скрипт или, по-другому, сценарий? Это простой текстовый файл с кодом, который можно выполнить непосредственно. Без компиляции, без построения промежуточных выполняемых модулей – прямо из текстовика.

Скрипт – это часто одноразовая программа, которая сделает вам нужную работу. Ее просто накидать, просто запустить, просто получить результат.

На 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С. При переключении текстового документа в режим встроенного языка Снегопат будет предоставлять контекстную подсказку, как будто это не скрипт, а обычный модуль 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, чтобы работала подсветка.

    Для того, чтобы было проще сориентироваться в возможностях 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"); Сообщить(ПрочитатьФайл(ЛогГит)); Возврат; КонецЕсли; Сообщить("Каталог " + Каталог + " обработан"); КонецПроцедуры

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

    Что еще можно автоматизировать? Можно, например, разложить архив домашних фотографий по папкам Год\Месяц и автоматизировать этот процесс, настроив мониторинг какой-либо папки «Входящие фотки» через планировщик операционной системы. На знакомом языке сделать такое – пара пустяков, верно?

    Немного экономики

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

    Производительность кода по нашим оценкам, как минимум, не хуже 1С. На некоторых задачах OneScript быстрее почти в 2 раза, на некоторых – примерно одинаково. Радикального проигрыша 1Script в скорости по сравнению с 1С мы пока не наблюдали.

    Сейчас, в пору кризисов и санкций в Сети все чаще попадаются предложения по экономии на лицензиях для Windows, есть success-story по переводу части парка машин на Linux. Если посчитать лицензии Microsoft по текущему курсу, то переезд на Линукс выглядит все более привлекательным. Если вы строили автоматизацию на Powershell, то он станет у вас камнем преткновения. OneScript работает под Linux и вы можете автоматизировать свою деятельность независимо от того, какая ОС применяется (или будет применяться в будущем) в вашей компании. Если 1С-ники вашей фирмы пересядут на линукс, то им (в идеале) не придется изучать shell-скрипты. Они смогут пользоваться знакомым языком программирования.

    Заключение

    За минувший год 1Script вырос из исследовательского проекта в продукт, успешно применяемый в реальных бизнес-решениях. Это полноценный независимый кросс-платформенный интерпретатор языка 1С. Исходные коды открыты. Справка по доступным классам и глобальным процедурам доступна и постоянно обновляется.

    Писать скрипты – это просто, а главное – эффективно. Автоматизируйтесь! Пусть страх перед незнакомыми языками программирования больше не останавливает вас.

    Тезис о том, что open-source создается гиками-энтузиастами в наше время несколько утратил актуальность. Тем не менее, идеология открытого кода родилась именно так. Классные программы, написанные ночью, бородатыми (и не очень) чудиками, бескорыстно, просто, чтобы сделать мир лучше - изменили мир разработки ПО.

    Любой программист втайне мечтает сделать что-то большое и светлое, чтобы всем понравилось. Если вы скажете мне, что вы не из таких, что вам нравится только закрывать тикеты в рабочем багтрекере, и вы не мечтаете о выпуске своего проекта в большой мир, то я вам не поверю. Или посоветую сменить профессию. Я убежден, что программист - это художник, а художнику важно делать что-то свое, возможно, просто «в стол» - но делать.

    Однажды, мне в голову упала идея проекта. Идея была чисто исследовательской и я не собирался делать из этого некий «продукт». Кроме того, я раньше не вел проектов в открытом доступе и мне очень хотелось попробовать, как это вообще происходит. Что из этого получилось - под катом.

    В самом начале жизненного пути проекта я уже писал про него на Хабре. Тогда это были первые шаги, код был сырым, но он работал. Мне хотелось, чтобы проект вызвал интерес со стороны других авторов, поскольку в одиночку я его явно бы не потянул и вообще, забросил. В принципе, так бы и вышло, если бы я не получил свой первый pull-request от незнакомого человека. Но обо всем по порядку…

    О чем идет речь? Я сделал собственную реализацию стековой машины, исполняющей скрипты на языке 1С: Предприятие. Или, если проще - открытый интерпретатор языка 1С и открытую же реализацию некоторых стандартных классов 1С. При этом, ставилась четкая прикладная цель проекта - дать 1С-никам инструмент скриптовой автоматизации, который легко будет изучить. Проект был назван 1Script.

    И вот, проект опубликован на хабре и на профильном 1С-овском портале infostart.ru . Жду обратную связь. Первый отклик получил на мисте и от души посмеялся. Топик на форуме назывался «Интерпретатор 1С на хабре. Давайте зачмырим?» На мисте много добрых людей, я порадовался:)

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

    Второе дыхание Спустя примерно два месяца после публикации на меня вышел Сергей Батанов (Серега, привет!:) - заметный чувак в сообществе 1С-ников, который предложил свою помощь в развитии стандартной библиотеки. Это был 1С-овский класс «ТаблицаЗначений». Разумеется, я согласился. А когда я увидел реальный код, который прислал Сергей, я радовался, как ребенок, правда. В Интернетах часто бывает, когда кто-то что-то предлагает на словах, но до дела часто не доходит. А тут - реальный живой код, который работает, который полностью адекватный, который можно вставить в проект!

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

    Постепенно, я стал получать фидбек от людей, которые пробовали движок и спрашивали «где вот такая фича?», «а как сделать вот это?» На все эти вопросы приходилось отвечать, что мол, это прототип, а самому в срочном порядке эти фичи добавлять. Но энтузиазм зашкаливал: «Люди интересуются и пробуют применять», поэтому новые фичи добавлялись довольно быстро. Изначально в стандартной библиотеке не было даже функций работы с файлами.

    Дальше-больше Спустя какое-то время, мне написал Александр Кунташов, с вопросом об интеграции 1Script и проекта Снегопат (www.snegopat.ru). Кто не знает - это такой решарпер для 1С. В нем можно делать скриптовые плагины к Конфигуратору 1С и есть целое сообщество авторов подобных плагинов.
    Плагины эти писались на JavaScript, в связи с чем требовали квалификации, выходящей за рамки стандартного программиста 1С. Из-за этого, в конечном итоге, тормозилось и развитие экосистемы плагинов. Число людей, желающих улучшить Конфигуратор, примерно равно общему числу 1С-ников, однако, необходимость изучения JavaScript отпугивает авторов потенциальных шедевров.

    Я, опять же, дико обрадовался востребованности своего детища, выпросил у автора дистрибутив Снегопата и стряхнул пыль со своих знаний C++. Пыли оказалось намного больше, чем знаний, но творческий зуд сделал свое дело, и я погрузился в MSDN.

    Примерно через месяц, в Конфигураторе 1С стало можно писать плагины прямо на языке 1С, не переключаясь в окно редактора JavaScript. Тогда же были исправлены первые критичные баги движка и существенно пересмотрена внутренняя архитектура.
    Я же получил пьянящий восторг от общения с С++, COM, ATL и всем вотэтимвот, после долгих лет работы исключительно с 1С. Ну и еще от того, что сделал нечто полезное, ощутимое для сообщества 1С-ников.

    Первый опыт боевого применения Примерно в это же время (точно уже не помню) проект попал в поле зрения Алексея Лустина () (Леха, тебе тоже привет!) - среди 1С-ников человека известного и уважаемого. Это совпало по времени с моим поиском нового места работы. Я присматривал интересные компании на рынке, а Алексей - специалистов под проект Continuos Integration/Continuos Delivery для 1С-ников. Тогда Леша уже видел мой проект (и ник) на хабре, а я уже знал, что некая команда продвинутых 1С-ников в сети делают занятные нестандартные вещи.

    В тот момент в сообществе уже были известны такие штуки, как юнит-тестирование, хранение кода 1С в git, BDD+cucumber для 1С и прочее. Самым доступным из этих чуваков мне показался Алексей и я написал ему письмо, где спросил нет ли у того интересной работы. Так я вместе со своим проектом попал в веселую компанию гиков, собравшихся к тому времени в компании, где работал Алексей.

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

    Зачем вообще применять для этого новый движок? Собственно, скриптовых языков мильон, непонятно же, зачем нужен еще один, да еще и неизвестный - спросит читатель хабра - и будет не совсем прав. Стратегически, будущий продукт предназначался для 1С-ников и должен был бы жить переходя от разработчика к разработчику, независимо от кадровых изменений в компании. В сообществе 1С-ников существует объективная проблема: среди них много классных специалистов, но почему-то средний 1С-ник не хочет учить никакой другой язык, после того, как хорошо набил руку в 1С. Я не знаю в чем причина данного явления, наверное в том, что 1С рулит (irony)? Люди приходят в 1С зная Java, С/С++, микроконтроллеры, Delphi, либо не зная ничего, но они часто остаются в 1С и неохотно переходят обратно в свои исходные экосистемы.
    Я сейчас предвижу волну гнева, но будьте добры, дослушать тезис до конца. Из любого правила есть исключения, однако, планируя систему, которая должна пережить несколько поколений разработчиков (не биологических, а кадровых поколений, разумеется), то с наибольшей вероятностью вы найдете специалиста, который сможет ее развивать, если она будет написана на 1С. Если это будет питон (или вставьте ваш любимый язык), то вам придется нанимать питонщика, очень хорошо знающего 1С. А после его перехода в большие начальники - вам придется искать еще одного такого же, с компетенциями в области 1С. А если это сразу будет язык 1С, то вам придется найти только 1С-ника, хорошо знающего 1С и этого будет достаточно.
    Иными словами, система будет более живучей и сможет развиваться бОльшим количеством спецов, если будет написана на знакомом им всем языке.

    Таким образом, стала понятна сфера применения 1Script: это DevOps и подобные задачи для целей 1С проектов.

    Первые шишки и правильная разработка Первый же более-менее большой скрипт, который я написал (до этого были тексты не более ста строк) вызвал падение движка. При определенном сочетании параметров и цепочек вызовов управление передавалось в неизвестное место кода, и приложение падало. Пришлось почти полностью переписать реализацию стека вызовов и обработку исключений. Это был вызов в стиле «Ах ты так! Ну ща я тебя исправлю!» Боевой запал позволил переписать нужные модули за один день и выявить помимо этого еще пару-тройку багов. Код стал выполняться стабильно. Я выпустил новый релиз. Попутно, поскольку я теперь занимался Continuous Integration, пришло осознание, что проекту тоже требуется билд-сервер и автоматизация выпуска релизов. Кроме того, к проекту подключился , известный среди 1С-ников, как корифей и гуру 1С-тестирования. Он сделал мне на базе своего фреймворка xUnitFor1C инструментарий для тестирования движка. Так у меня появились приемочные тесты поведения, написанные также на языке 1С. Я поднял на своем домашнем сервере TeamCity и настроил ночные сборки с прогоном тестов. Попутно, я зарядился энтузиазмом - проект живет и приобретает новых контрибьюторов. Это дико вдохновляло.

    За какие-то три-четыре месяца библиотека классов движка обросла, наконец, всем необходимым для большинства задач скриптинга: появились сетевые функции, работа с архивами, XML и прочее. Наш проект по CI для 1С был успешно запущен.

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

    В ноябре 2014 года меня пригласили выступить на престижной 1С-овской конференции Infostart Event в Питере. Разумеется, я согласился, а темой выступления взял 1Script. Тему утвердили, что для меня означало, во-первых, факт некоторой известности проекта (т.е. слушатели, вероятно, придут, т.к. хотя бы что-то про это слышали), а во-вторых, я надеялся привлечь контрибьюторов, поскольку времени на развитие движка хватать почти перестало.
    Специально для конференции я даже сделал специальную забаву - CGI режим, в котором скрипты можно было запускать под управлением HTTP сервера и формировать HTTP-вывод. Сайты на языке 1С теперь уже не страшный сон хостера, а суровая реальность (шутка).
    Выступление на Infostart можно считать первым публичным анонсом, где 1Script уже не стесняясь можно было назвать продуктом, инструментом, способным решать конкретные задачи. Это был уже не эксперимент, а боевой продукт. Хотя еще и в статусе беты.

    Проблема роста или Подводные камни поддержки проекта Как оказалось, наличие в твоем управлении востребованного проекта, даже небольшого - несет в себе немалый такой груз накладных расходов. Для начала, это поток фич. Пожелания приходят намного чаще, чем коммиты, реализующие эти пожелания. Требуется строго учитывать версии, в которых исправлялись те или иные ошибки. Требуется как-то уведомлять пользователей о том, что с версии Х исправлена ошибка или появилась новая возможность. Рост функционала требует документирования, причем документация имеет тенденцию к устареванию.
    Ну и самое забавное - требуется техническая инфраструктура собственно «поддержки». Потребовался сайт, генератор документации, сервер сборки/деплоя и прочее и прочее… Потребовались финансовые вложения в инфраструктуру - минимальные, но все-таки вложения.
    Начиная исследовательский проект, я даже не предполагал такое количество организационно-технических вопросов, с которыми придется столкнуться при росте проекта. Очень помог в этом плане переход на методику git-flow, стало проще разбираться самому и общаться с пользователями на тему версий и веток.Опыт краудфандинга (ужасное слово) В начале этого года я попробовал провести эксперимент - организовал сбор пожертвований на инфраструктуру - доменное имя и хостинг. Мне было интересно, насколько проект сможет окупить собственное существование. Результат был, незнакомые мне люди, действительно, присылали примерно по 100-500 р. чего хватило на оплату доменного имени в зоне.io. Затем, кампания была свернута и поток средств прекратился. До полной окупаемости дело не дошло, хотя, некоторое финансовое подспорье было получено.
    Самое главное - натурно был проверен тезис об эффективности модели donation, как таковой. Вывод - в моем случае donation сложно назвать эффективным, хотя и нулевым он не был.Библиотека полезных скриптов За полтора года кодинга на 1Script выделились библиотечные блоки, которые можно использовать самому и рекомендовать другим. Естественным путем в моем распоряжении скопился ряд наработок, которые были пригодны к повторному использованию.
    Это привело к тому, что в движок была добавлена возможность подключения сторонних «пакетов», написанных также на 1Script. На выходе получился еще один проект, получивший название oscript-library. (https://github.com/EvilBeaver/oscript-library) Эта библиотека, разумеется, также потребовала инфраструктуры, документации, end-user обновлений и прочего. Зато поток контрибьютинга со стороны 1С-ников вырос в разы. Пакеты ведь разрабатываются на уже знакомом языке, а значит можно сразу приносить пользу, портировать уже имеющиеся наработки и т.д. Сообщество «1С-скриптописателей» начало расти, чему в немалой степени поспособствовал уже второй доклад на Infostart Event в 2015 г.Как это выглядит Для импорта используется специальная директива препроцессора #Использовать (#Use) Ее нет в оригинальной платформе 1С, но для простоты импорта библиотек пришлось отойти от канонического синтаксиса и позаимствовать решение в других экосистемах.
    #Использовать json // класс ЧтениеJSON объявлен в библиотеке и доступен благодаря директиве #Использовать ОбъектЧтения = Новый ЧтениеJSON(); // дальше идет какой-то код // ...
    Конкретное решение вырабатывалось уже коллективом авторов, продумывались сценарии применения, подводные камни и пр. В качестве инструмента для «мозгоштурма» был использован Google Docs.Пакетный менеджер Для управления пакетами был на коленке написан простенький пакетный менеджер, получивший название OPM (OneScript Package Manager). Он также написан на 1Script и представляет собой консольную утилиту управления пакетами. В данный момент идет переосмысление инфраструктуры пакетов и работа над production-ready версией opm.Проект сегодня На сегодняшний момент 1Script это стабильный, успешно применяемый в десятках компаний инструмент автоматизации для 1С-ников. Кроме того, OneScript это уже своего рода бренд, это название известно в сообществе, инструмент активно применяют, пишут, задают вопросы, обсуждают и, что особенно приятно - дорабатывают.
    Кроме того, практически неотъемлемой частью проекта является библиотека пакетов повторно используемого кода. Она небольшая, но покрывает значительную часть задач, ежедневно решаемых типовым 1С-ником.
    Это уже не просто «интерпретатор 1С». Сообществом была создана экосистема полезных и востребованных инструментов.
    Для меня же это был уникальный опыт, я получил слова (и дела) поддержки от десятков незнакомых (и теперь уже знакомых) мне людей. Программа, которую я начал исключительно для того «чтобы попробовать» превратилась в работающий проект, используемый в реальных боевых задачах. Кроме того, получен огромный опыт управления таким вот open-source проектом - поддержка, сопровождение, инфраструктура и т.д…
    Ну и самое главное - получено удовольствие от того, что делаешь нечто нужное.Что планируем сделать дальше Активное применение библиотеки пакетов выявило ряд недочетов и неудобств. Планируем внести коррективы в инфраструктуру пакетов и расширить функционал пакетного менеджера. Также планируем расширять набор библиотек, например, сейчас идет работа над оберткой для Docker API. Мы управляем docker-контейнерами с помощью скриптов на 1С и наработки по этой теме, вероятно, также будут опубликованы, когда будут доведены до ума. В результате будет получен упрощенный DSL для манипуляции контейнерами из сценария 1script.Техническая сводка
    • Язык программирования - C#, .NET v4.0/Mono 3.1x
    • Среда разработки - VS 2013-2015
    • Имя интерпретатора - oscript.exe (запуск на выполнение - oscript )
    • Расширение файла скрипта - .os
    • Расширение файла пакета - .ospx
    • Производительность кода - в большинстве замеров до 4-х раз быстрее оригинальной платформы 1С. Как минимум, не медленнее ее.
    • Репозиторий движка - github.com/EvilBeaver/OneScript
    • Репозиторий библиотеки - github.com/oscript-library
    Сайт проекта не пишу, во-первых, чтобы не звучало, как пиар, а во-вторых, он просто не вынесет хабраэффекта. Если у вас есть свой проект, который вы хотели бы вывести в свет, то позволю себе дать вам пару советов, основанных на личном опыте.
    • Дерзайте! Если вы будете держать свой проект в столе и никому о нем не рассказывать, то о нем никто и не узнает. Начните со статьи на Хабр. Одной статьи будет недостаточно. Упоминайте свой проект в форумах, посвященных предметной области вашего проекта, приводите примеры удачного применения.
    • Будьте готовы к тому, что предложений от людей много, а реальных коммитов - сильно меньше. Подход в стиле «Это open-source, тебе надо, ты и сделай», к сожалению, не прокатит.
    • Заранее продумайте решение «проблемы роста». Рост, как правило, взрывной и справиться с резко возросшим пулом задач довольно сложно.
    Добавить метки

    Оператор : "Здравствуйте! Меня зовут Мария, компания "Окна-всем-на-свете"."

    Клиент : "Мне ничего не надо"

    Оператор : "Но ведь у нас лучшие условия и..."

    Клиент (перебивает): "Мария, до свидания!"

    Оператор (тараторит): "Мыработаемнарынкес2003годаизаэтовремя..."

    Клиент (бросает трубку): ...

    Мария набирает следующий номер.

    Знакомая каждому надоедливая история. После такого диалога у клиента останется негативный осадок, а ОкнаВсемНаСвете бездарно потеряли драгоценный контакт. Хотя, оператор Мария получит оклад в конце месяца, так что в данной ситуации не все проигравшие.

    Самое обидное в этой ситуации - Мария и правда старалась, она искренне думает, что "просто клиентам не надо - вот и не берут" и вообще "а я то как его заставлю не бросать трубку?". То, что кто-то считает KPI , марии до лампочки - ЗП ведь все равно дадут. В конце месяца руководитель Алексей изучит 1001 запись разговора своих операторов (на это уходит минимум 2-3 дня ежемесячно), пожурит своих подопечных - ему в ответ оправятся оправдания, что "опять база обзвона была нецелевая...". Алексей с грустью вздохнет и раздаст всем оклады. Начинается следующий месяц.

    Коллектив сложился дружный, работа проделана большая, но так дальше нельзя. (с) Что в этом кейсе плохо (но решаемое малой кровью): Подход операторов в работе
  • Звонят на автоматизме. Но без точной цели сложно выстроить хороший диалог;
  • Не знают, как отвечать на возражение клиента или отвечает неудачно;
  • Бросают трубку, как только начинает сомневаться в успехе разговора;
  • Уверен, что он получит оклад за процесс - поэтому все делает неторопливо, с перерывом на отдых, без нужной мотивации;
  • На существующие правила по обзвону клиентов все забивают, жалуются на сложность и объем инструкций;
  • Положение руководителя
    Все эти вопросы решаются в подсистеме «Устрой обзвон!»

    (ее можно "встроить" в вашу 1С, можно использовать отдельно).

    «Устрой обзвон!» умеет:
    • Составлять скрипты - речевые модули для операторов
    • Назначать доступность скриптов для разных групп и филиалов
    • Собирать статистику по использованию блоков скриптов, достижению целей и отказов, измерять конверсию
    • Загружать базу обзвона из Excel или использовать номера клиентов, куда звонили раньше
    • Отображать доску статистики для операторов
    • Создавать во время прохождения скрипта заказы, претензии, заполнять любые объекты вашей базы.
    • Ограничивать "прощелкивание" операторами скриптов без разбора
    • Работать с sip-телефонией
    • Работать с электронной почтой
    • Превращать почтовые сообщения, обращения с сайта в лиды и потребности клиентов, загружая их в систему
    • Вести работу с клиентами, лидами и сделками
    "Устрой обзвон!" позволяет построить замкнутый цикл взаимодействий с клиентом.

    Этапы такой работы настраиваются на ваш вкус. Например, вот так:

    Вариант №1

  • Система получила нового потенциального клиента
  • Оператор позвонил по алгоритму, уточнил необходимость в услуге
  • Целевой контакт передали в отдел продаж
  • Менеджер строит отношения с клиентом
  • Менеджер совершает сделку
  • Вариант №2

    Или вот так:

  • Оператор принимает входящий звонок
  • При звонке запускается сценарий определения потребности клиента, определяется нужная компания
  • В процессе работы оператор оформляет заказ клиента, уточняет дату доставки
  • Заказ передается в отдел снабжения на сборку
  • Вариант №3

    Ну или еще вариант:

  • На сайте оформили новую заявку, сайт перенаправляет письмо в базу по этой заявке
  • База разбирает письмо, "достает" из него данные контрагента, текст сообщения, создает потребность и задачу
  • Свободный оператор забирает задачу, звонит клиенту, решает задачу
  • Если клиенту все понравилось, либо создается заказ, либо клиент передается менеджерам
  • Вариант №4

    Придумайте любой свой вариант!

    Руководитель в конце месяца получает отчеты:

  • По расширенной статистике потребностей клиентов - сколько было, сколько квалифицировано, сколько отказано - по любым статусам
  • По работе сценариев разговора и операторов
  • По контактам с клиентами - о чем говорили, сколько раз. Сколько позвонили, сколько писем написали.
  • Как это работает

    В "Устрой обзвон!" встроены подсистемы (кликабельно):

    Скрипты

    Под скриптами мы понимаем какие-то связанные действия по алгоритму. Например,

  • Исходящий звонок - чтобы продать товар или услугу, пригласить на акцию, заполнить анкету
  • Входящий звонок - чтобы грамотно обработать заказ, не забыть про скидку и доставку
  • Заполнение документа - стандартной формы в виде помощника
  • Как использовать
    • Создавайте схемы разговора операторов в конструкторе
    • Полнейшая настраиваемость - выводите любые поля для заполнения сценария звонка (данные анкеты, для ввода заказа и т.д.)
    • Размещайте ссылки на статьи внутренней базы знаний, чтобы оператор мог ответить на любые технические вопросы
    • Создавайте в процессе сценария звонка заказы, собирайте претензии, отправляйте письма и меняйте статусы потенциальных клиентов
    • Дайте менеджерам-звездам больше свободы в сценарии звонка. Такие сотрудники не любят ограничений, их результативность выше, когда разговор не скован на 100% - создайте для таких менеджеров сценарий разговора, в который будет использоваться как подсказка-анкета, а переход между блоками будет свободный. Вы получите статистику и по этим звездам, а они не будут чувствовать "зажатости" сценарием разговора
    • Проверяйте работу операторов по сценариям звонка и фиксируйте результаты проверки в специальном документе
    • Избавьтесь от халтурных прозвонов с помощью настроек конкурентного выполнения сценария
    • Отправляйте письма с коммерческим предложением в процессе сценария звонка, создавайте в процессе претензии от недовольных клиентов

    Скрипты - это основная подсистема "Устрой обзвон!". Ниже немного подробнее о ее настройках на примере

    Пример

    Например, может быть вот такая задача операторам "Нужно обзвонить список номеров, отсеять нецелевые контакты, а лидов передать менеджерам". Для этого в системе мы сделаем скрипт, загрузим из xls потенциальные сделки, операторы пройдут сделки по скрипту, нецелевых отсеют, целевые передадутся менеджерам в работу. Сначала создадим скрипт.

    Создаем новый "Скрипт"

  • Создаем блок-схему этого скрипта - что оператор будет говорить, какие значения выбирать и что система будет ему дальше предлагать
  • Задаем дополнительные поля скрипта - например, на каждом блоке скрипта должно быть видно ФИО клиента и его компанию
  • Указываем быстрые переходы с каждого блока. В каждом блоке будут выводиться кнопки быстрых переходов (оператора в любой момент могут спросить "А что вы вообще за компания?" - в этом случае оператор нажимает на быстрый переход, читает блок текст о компании и возвращается обратно на предыдущий блок)
  • Настраиваем скрипт - будет ли вестись по скрипту лог, будет ли видна схема, обязательно ли использовать SIP, какие задачи нужно выполнить по ходу скрипта и т.д.
  • Назначаем права доступа к нему - кто может видеть этот скрипт, создавать новый обзвон по нему и т.д.
  • В блок схеме скрипта указываем, что должен оператор говорить, какие варианты ответа есть у клиента и какие поля на этом этапе оператор должен заполнить.

  • Текст речевки оператора. Можно вставлять дополнительные реквизиты из предыдущих блоков скрипта или общих полей. Можно форматировать текст
  • Тут задаются параметры текста - на скриншоте показано, что [Наименование] будет заполнено из наименования компании
  • Задаем, выполнена ли цель, если дошли до этого блока, к какому этапу относится блок ("установление контакта", "выход на секретаря" и т.д.) и какого результата достигли, если дошли до этого блока
  • Блок скрипта может иметь дополнительные смысловые нагрузки:

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

    В конечном итоге у нас получается что-то вроде этого:

    Оператору же форма обработки скрипта будет представлена в человеческом виде "помощника ". Например, один из блоков схемы может выглядеть вот так:

  • Текст, который мы написали оператору
  • Реквизиты, которые ему нужно заполнить на этом шаге
  • Предусмотренные варианты ответов клиента
  • Цель и задачи скрипта
  • Доступные на каждом блоке переходы на другие блоки
  • Общие поля скрипта
  • Лог выбранных ответов
  • После того, как создана схема скрипта, оператор уже может начинать звонить - в рабочем месте оператора (если на скрипт есть право создания), можно нажать на кнопку "Создать", выбрать нужный скрипт и, например, взяв очередной номер телефона из таблицы xls, работать по нему:

    На этом этапе операторы уже могут работать по скрипту, но здесь присутствует неудобство забора контакты из таблицы - это ведет к череде типичных ошибок.

    Загрузим контакты из таблицы Excel для общего обзвона

    Мы загрузим не просто компании с их контактными данными, а "потенциальные сделки" (они же "Лиды") в статусе "Квалификация". Скрипт настроим так, что он будет менять статусы лидов по своему ходу - от "Отказа" до "Назначена встреча". Таким образом, мы посмотрим воронку по этой базе обзвона.

    Создадим настройку загрузки данных:

  • Файл, из которого забираем данные
  • Сами данные, которые будут загружены в базу
  • Как именно будут загружены данные
  • В настройках можно указать заполнение любых реквизитов создаваемых объектов. Мы будем создавать из компании потенциальную сделку в статусе "Квалификация" и "выполнение скрипта" - готовый для работы оператора по скрипту объект, заполняем проект, чтобы потом фильтровать по нему результаты обзвона по этой базе:

    Оператора не заполняем, чтобы все могли увидеть созданные элементы и брать их в работу. Созданные скрипты будут доступны через рабочее место оператора :

    Операторы нажимают кнопку "Следующий " - система выбирает следующий по порядку скрипт и запускает для него обработку. Таким образом:

    • У операторов всегда перед глазами "актуальная информация" - нет дублей звонков
    • Клиенты просившие перезвонить через какое-то время, ставятся на паузу - такие скрипты отображаются в этом же окне с датой следующего контакта.
    • Операторы видят статистику коллег по звонкам - этим мотивируя себя на работу:

    Свою статистику операторы видят более детально:

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

    • Не больше X скриптов в Y минут
    • После выполнения скрипта ждать X минут
    • В ожидании можно оставлять не больше X скриптов

    На этом этапе у нас будет проработанная база лидов - непрофильные отсеяны, профильным поставили соответствующий статус. Работа операторов здесь закончена, теперь включаются менеджеры по продажам.

    Подключение к процессу менеджеров.

    Руководитель отдела продаж заходит в справочник компаний, отбирает только те, которые квалифицированы по обзвону и назначает в сделках ответственных менеджеров:

    Менеджер заходит в потребность по назначенному ему клиенту и начинает работать по потребности клиента. Все взаимодействия фиксируются в карточке потребности:

    Анализ результатов

    Руководитель видит как статистику каждого оператора, так и конверсию каждого скрипта:

    По статусам обработанных потребностей можно построить воронку:

    База знаний

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

    Как использовать
    • Создайте материалы о вашей продукции и размещайте ссылки на них в сценарии разговора - тогда ваши операторы смогут отвечать и на технические вопросы клиентов
    • Помещайте описания использования сценария разговора в статьи и выдавайте на ознакомление новым сотрудникам
    CRM

    Небольшая система для работы с отношениями клиентов. Включает в себя справочник компаний (в нем есть ссылка на контрагента, если "Устрой обзвон!" нужно загрузить в работающую конфигурацию), контакты этих компаний и потенциальные сделки. Менеджеры работают по потенциальным сделкам контрагентов, проводя их по разным статусам. По свершившимся сделкам создаются продажи и контролируется оплата. Руководитель в конце месяца оценивает, сколько контактов было сделано, какое вознаграждение полагается генераторам лидов и какие показатели у каждого из менеджеров.

    Как использовать
    • Ведите работу по статистике и анализу сделок клиентов
    • Отражайте все варианты работы с клиентами
    • Загружайте новых потенциальных клиентов для обзвона
    • Обрабатывайте "забытых" и "потерянных" клиентов
    • Контролируйте работу по выполнению услуг

    Каждая компания может содержать уникальные реквизиты по виду деятельности:

    По каждой компании (и потенциальной сделке) отображается история взаимодействий:

    Все предстоящие взаимодействия отображаются в "Ленте", к ним любой менеджер имеет быстрый доступ в любой момент. Еще в ленте отображаются комментарии, направленные вам - например, логист в заявке клиента оставляет комментарий "Когда везем", а ответственный за поставку видит это в своей ленте.

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

    Почтовый клиент

    Подсистема обеспечивает не только отправку и получение почты. Есть такое понятие, как почтовый фильтр, он помогает определить, что необходимо сделать с конкретным письмом. Например, у вас на сайте находится форма обратной связи, как только пользователь ее заполнит, то сразу же отправится письмо с текстом обращения на ваш электронный адрес. Фильтр в "Устрой обзвон!" может быть настроен таким образом - "если письмо пришло с адреса [email protected], то нужно достать из текста письма ФИО, потребность клиента и создать по этим данным новую потенциальную сделку". Тем самым вы можете указать правило, попадания письма под под фильтр и действия фильтра по этому письму.

    Для этого служат:

    • Реквизиты письма - дополнительные поля письма, например, "ФИО", "Адрес доставки", "Телефон", "Текст обращения"
    • Заполнение реквизитов из письма - правила, по которым система "достанет" информацию из текста письма в реквизиты
    • Действия фильтра - какие новые объекты по письму нужно создать и как их заполнить
    Как использовать:
    • Настройте автоматический сбор заявок с сайта и назначение менеджерам звонка по сценарию разговора для этих потенциальных клиентов
    • Преобразовывайте запросы о продукции (например, они приходят на определенный e-mail) в документ "Запрос клиента", проводите документ по нужным направлениям
    • Контролируйте работу менеджеров с клиентами по почтовым сообщениям прямо из базы данных
    Учет документов

    Позволяет фиксировать в системе документы по их видам, ограничивать права доступа к ним. Например, можно сделать вид документа "Претензия по качеству" и дать доступ к нему только отделу "ОКК". В этом документе у вас будет пара новых реквизитов, таких как "Текст претензии", "Дата обращения", Результат" и другие. Или вы можете собирать "Заявки на работу" от клиентов, прикреплять к ним файлы и пропускать их через статусы ("Не начато", "В работе", "Просчитано", "Согласовано", "Отказано").

    Как использовать
    • В настройке почтовых фильтров можно создавать заявки и запросы на продукцию прямо по письмам клиента
    • В связке со сценариями разговора можно генерировать документы прямы по ходу сценария звонка (например, клиент недоволен качеством услуг - создаем "Претензию", которую потом обработает отдел ОКК)

    Выглядит это вот так:

  • Статусы документа
  • Вид документа, который определяет наличие реквизитов в документе
  • Дополнительные реквизиты документа
  • Предыстория

    Во время реализации одного проекта, возникла необходимость выполнять javascript(далее JS) код под управление объекта ПолеHTMLДокумента, с получением результат в 1С. Приведённые примеры, в найденных статьях, показались не очень удобными в использовании (сугубо личное мнение). Было принято решение попробовать найти другое, более простое, решение, на поиски отводилось не более 1 дня.

    ДИВ.setAttribute("onclick", "alert("Координаты");");

    Выполним скрипт

    ДИВ.click();

    ТАДА. все работает

    Процедура ВыполнитьСкрипт(ТекстСкрипт) ДИВ = Элементы.док.Документ.getElementById("TEST"); ДИВ.setAttribute("onclick", ТекстСкрипт); ДИВ.click(); КонецПроцедуры

    Дополнение от 02.08.2016

    В комметариях был предложен еще один способ вызова JS (спасибо ), если у вас есть возможность менять код HTML документа, то можно прописать функцию в нем и затем ее вызывать. передавая в нее код на JS.

    function exec(script) { eval(script); }

    и затем в 1С:

    Элементы.ПолеHTMLДокумента1.Документ.parentWindow.exec("alert("OK")");

    Возврат результата JS в 1С

    Для передачи результата скрипта в 1С из объекта ПолеHTMLДокумента будем использовать событие. Привяжем к ПолеHTMLДокумента событие ПриНажатии которое получает на вход 3 параметра:

  • Элемент у которого произошло событие(само ПолеHTMLДокумента)
  • Объект событие
  • Признак выполнения стандартного поведения
  • Чтобы вызвать событие при нажатии понадобиться выполнить следующий js код

    Var evt = document.createEventObject(); // создадим пустой объект событие evt.propertyName = "функц1"; // в реквизит propertyName предлагаю помещать название результата (что-то вроде типа, или название функции от которой получили данные) evt.data = "156"; //в реквизит data будем передавать данные результата document.body.fireEvent("onclick", evt); // выполним событие при нажатии ПолеHTMLДокумента

    Выполнив данный js код в процедуру при нажатии вторым параметром придет созданный нами объект событие. Который довольно удобно обрабатывать.

    Пример разбора ответа.

    &НаКлиенте // получаем имя и результат события Процедура ДокПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка) ИмяОперации = ДанныеСобытия.Event.propertyName; ДанныеОперации = ДанныеСобытия.Event.data; Если ИмяОперации = "" Тогда //не наше событие Возврат; КонецЕсли; Если ИмяОперации = "Функц1" Тогда // обработка результат ИначеЕсли ИмяОперации = "функц2" Тогда // обработка результат //...... КонецЕсли; КонецПроцедуры

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

    Дополнения от 26.03.2016

    И в этом месте тоже произошли непонятки (ошитбка восптроизводится только на плаформе 8.3.5.1570, но дабы предупредить эти ситуации в далнейшем, приведу решение) Сама причина – при повторном запуске формы с Поле HTML документа в момент вызова процедуры при нажатии по полю HTML платформенный вызов залипал и валил весь COM объект (Произошла исключительная ситуация (htmlfile): Неопределенная ошибка). Решением стало отключение стндарного выполнения события click, и отключение режима всплывания события. Как же это сделать смотрим ниже.

    // отключим всплывание события

    Evt.cancelBubble = true;

    // отключим стандартное поведение

    Evt.returnValue = false;

    В результате для передачи данных в 1с из JS мы получим функцию.

    Function return1c(name,data){ var evt = document.createEventObject(); evt.propertyName = name; evt.data = data; evt.cancelBubble = true; evt.returnValue = false; document.fireEvent("onclick",evt); };

    Вывод.

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

    Пример реализации в