Скрипты для 1с. Все это чужеродные элементы

Предыстория

Во время реализации одного проекта, возникла необходимость выполнять 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С, для дальнейшей обработки.

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

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

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

    На 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С. Исходные коды открыты. Справка по доступным классам и глобальным процедурам доступна и постоянно обновляется.

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

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

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

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

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

    Оператор (тараторит): "Мыработаемнарынкес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) в документ "Запрос клиента", проводите документ по нужным направлениям
    • Контролируйте работу менеджеров с клиентами по почтовым сообщениям прямо из базы данных
    Учет документов

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

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

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

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

    Я громко и долго спрашивал гугл, чтобы он выдал хоть какую-нибудь информацию о том, как это делать, но все было тщетно. Далее я нашел книгу по конфигурации, но и там было все очень поверхностно. В итоге мне помогли две вещи:

    Ну что, вводная часть прошла, переходим к практике.

    Итак задача стояла следующая:

    1) Подставить в форму договора ответственного в родительном падеже

    2) Так же подставить его должность в родительном падеже

    3) Ну и основание доверенности, которое нужно было взять из связанного с договором документа.

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

    Заходим в конфигурацию в режиме предприятия. Далее идем в раздел НСИ, выбираем виды документов и выбираем документ, для которого у вас есть шаблон в формате Word. Мой пример на документе договор поставки, поэтому захожу в него и вижу такую картину:

    Справа от шаблона есть кнопочка "открыть". Нажимаем.

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

    Расставляем параметры в нужные места в документе. Как-то так:

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

    Вот тут-то и приходят на помощь скрипты.

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

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

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

    Вот какими скриптами я решил поставленную задачу:

    //Вытащить связь с доком //Конкретно под доверенность Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СвязиДокументов.СвязанныйДокумент |ИЗ | РегистрСведений.СвязиДокументов КАК СвязиДокументов |ГДЕ | СвязиДокументов.Документ = &Документ"; Запрос.УстановитьПараметр("Документ", Файл.ВладелецФайла); //Файл.ВладелецФайла - ссылка на договор Результат = Запрос.Выполнить().Выбрать(); Результат.Следующий(); РезультатОбработки = СтрДоверенность; // РезультатОбработки это как раз переменная, из которой и будет подставляться значение в параметр.

    2) А вот тут, что мне особенно понравилось. В конфигурации, в общем модуле есть функция склонения и в скрипте можно к ней обратиться.

    //Скрипт склонения Результат = ""; Склонение = ФизическиеЛица.Просклонять(Строка(Файл.ВладелецФайла.Ответственный), 2, Результат); //Файл.ВладелецФайла.Ответственный - ссылка на ответственного из документа. РезультатОбработки = Результат;

    3) Аналогичным способом используем функцию из общего модуля для того чтобы получить должность пользователя(ответственного).

    //Должность Результат = ""; Должность = РаботаСПользователями.ПолучитьДолжность(Файл.ВладелецФайла.Ответственный); СклДолжность = ФизическиеЛица.Просклонять(Строка(Должность), 2, Результат); РезультатОбработки = Результат;

    И вот он результат:

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

    Еще раз скажу, что мне очень помогла обработка "Эмулятор скриптов". Она работает примерно, как консоль запросов, то есть мы вставляем или пишем в нее наш скрипт и она сразу вытаскивает значение, которое мы этим скриптом получим.

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

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

    Живите свободно, но продуктивно.

    Спасибо за внимание.

    Виртуальной машины, исполняющей скрипты на языке 1С:Предприятие.

    Иными словами, это возможность писать программы на языке 1С без использования платформы 1С:Предприятие.

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

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

    Вы спросите - а зачем это вообще надо? Почему бы не написать этот же код в обработке и запускать через 1с стандартным способом?

    Но мы ведь говорим об автоматизации и тут есть фундаментальные проблемы:

    • нет способа гарантированно запустить базу и выполнить в ней код некоторой внешней обработки (кто сталкивался с этим на практике знает, что слишком многое может пойти не так, начиная с того, что до выполнения обработки просто не дойдёт из-за какого-нибудь модального окна)
    • нет простого способа генерировать такую обработку программно, а ведь это может нам понадобиться, если речь идёт о выполнении полезного кода над группой баз
    • нет простого способа логировать выполнение этой обработки

    Все эти проблемы решает OneScript.

    Зачем писать и запускать эти скрипты именно в обновляторе?

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

    А именно.

    Список баз для обработки

    Прямо в обновляторе мы выбираем для какого количества баз нужно запустить написанный нами скрипт:

    Передача параметров базы

    При выполнении скрипта обновлятор сам передаёт в него необходимые параметры с информацией о текущей базе:

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

    Примеры таких скриптов мы можем найти в списке шаблонов обновлятора:

    Предварительная архивация базы

    При необходимости обновлятор обеспечит создание резервной копии перед выполнением скрипта:

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

    Блокировка, разблокировка базы

    При необходимости обновлятор выполнит полную блокировку базы перед выполнением вашего скрипта и разблокировку после:

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

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

    Сохранение отчётов

    Обновлятор сохраняет историю выполнения таких скриптов в менеджере отчётов.

    Как в общем виде:

    Так и в детальном:

    Уведомление на почту

    Если у вас настроены уведомления на почту (все или только при ошибках)...

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

    Запуск скрипта по расписанию

    Облачный мониторинг

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

    Многопоточное выполнение скриптов

    О том как запускать скрипт параллельно для нескольких баз подробно рассказывается .

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

    Ну, конечно же, сам язык 1С. Куда же без него...

    Прежде всего есть вот этот справочник языка 1С с примерами: .

    Также стоит пробежаться по отличиям OneScript от стандартного языка 1С. Их немного (ссылка) .

    Как мне придумывать свои скрипты?

    Для вдохновления вначале советую разобрать и понять скрипты из шаблонов обновлятора. Это уже многое вам даст.

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

    Для этого я завёл специальный проект на github , где собираю полезные скрипты от пользователей обновлятора, чтобы как можно большее количество людей смогло использовать их в своей работе.

    Хотите прислать мне свой скрипт? Прошу вас .

    С уважением, Владимир Милькин (преподаватель и разработчик ).