Разработка скрипта для проекта Снегопат

Публикация № 116665 12.02.12

Приемы и методы разработки - Инструментарий разработчика

Подробное пошаговое описание порядка создания скрипта для проекта Снегопат (http://snegopat.ru) на примере скрипта "Авторские комментарии". Затрагивает ключевые особенности объектной модели, реализуемой Снегопатом.
В первой своей публикации о скриптах для проекта Снегопат я рассказал о том, какой функционал добавляют в конфигуратор 1С:Предприятия 8 реализованные на сегодня скрипты, расширяя его возможности.

Сегодня я хочу рассказать о «внутренностях» скриптов и ключевых возможностях, предоставляемых объектной моделью Снегопата. Я познакомлю читателя с порядком создания скрипта для Снегопата «с нуля» на примере разработки скрипта «Авторские комментарии».

Специалисты, имеющие опыт программирования в 1С:Предприятии 7.7 и знакомые с ОпенКонфом наверняка знают о существовании одноименного скрипта для него. Мы будем делать именно его аналог, но для 1С:Предприятия 8.

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

Исходный код скрипта доступен в репозитории скриптов для проекта Снегопат на официальном сайте проекта.

Важно! Скрипт работает в демо-версии Снегопата. Для того, чтобы его запустить, необходимо:

  1. Установить демо-версию Снегопата. О порядке установки демо-версии написано здесь.
  2. Скачать и разместить в подкаталоге scripts\Libs каталога Снегопата скрипт-библиотеку TextWindow.js
  3. Скачать сам скрипт author.js и его форму настройки author.ssf (разместить в любом удобном для вас каталоге).
  4. Найти в корневом каталоге Снегопата файл addins.ini (если не существует - создать такой файл в любом текстовом редакторе) и добавить в конец файла строку: 

    script:
     
  5. (Пере)запустить конфигуратор под Снегопатом (используя starter.exe, идущий в поставке Снегопата).
 

Содержание

 

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

Основные свойства скрипта

Статическое подключение других скриптов

Динамическое подключение других скриптов

Макросы: способы объявления

Реализация макросов

Использование объектов 1С: метод v8New()

Работа с активным текстовым окном: библиотека TextWindow.js

Реализация алгоритма установки маркеров

Метод parseTemplateString() – программный парсинг шаблонов 1С

Реализация механизма подстановки параметров форматной строки

Разработка формы скрипта

Программное открытие формы скрипта

Обработчики событий формы и элементов управления

Работа с параметрами обработчиков событий формы и элементов управления

Использование методов глобального контекста 1С

Хранение и чтение настроек скрипта

Заключение

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

«Авторский комментарий» - это распространенный среди 1С:Специалистов способ пометки изменений кода непосредственно в модуле при помощи комментариев, обозначающих начало и конец изменений, характер изменений (добавление кода, изменение кода или удаление кода), а также подпись автора (имя или ник) и дату внесения изменений.

Различают два типа авторских комментариев: для блоков и «однострочники».

Для ясности приведу примеры:

1.       Маркер для добавленного блока кода:


//Добавлено: Admin 2012-02-10
Движение = Движения.ЦеныПоставщиков.Добавить();
Движение.Период = Дата;
Движение.Товар = ТекСтрокаТовары.Товар;
Движение.Поставщик = Поставщик;
Движение.Цена = ТекСтрокаТовары.Цена;
/// Admin 2012-02-10
 

(Маркер «Добавлено:», имя пользователя ИБ, дата изменений в формате гггг-ММ-дд).

2.       Маркер для удаленного блока кода:


//Удалено: Admin 2012-02-10
//Движение = Движения.ЦеныПоставщиков.Добавить();
//Движение.Период = Дата;
//Движение.Товар = ТекСтрокаТовары.Товар;
//Движение.Поставщик = Поставщик;
//Движение.Цена = ТекСтрокаТовары.Цена;
/// Admin 2012-02-10

 

Как видите, под «удалением» подразумевается комментирование выделенного блока кода с установкой соответствующих маркеров.

3.       Маркер для измененного блока кода:


//Изменено: Admin 2012-02-10
//Движение = Движения.ЦеныПоставщиков.Добавить();
//Движение.Период = Дата;
//Движение.Товар = ТекСтрокаТовары.Товар;
//Движение.Поставщик = Поставщик;
//Движение.Цена = ТекСтрокаТовары.Цена;
//---- Заменено на: ----
Движение = Движения.ЦеныПоставщиков.Добавить();
Движение.Период = Дата;
Движение.Товар = тзТовары.Товар;
Движение.Поставщик = Поставщик;
Движение.Цена = тзТовары.Цена;
/// Admin 2012-02-10

 

Установка маркера «Изменено» сопровождается сохранением копии оригинального кода (опционально).

В случае применения маркеров добавления и удаления в текущей строке, используется сокращенный вариант маркеров, которые будем называть «однострочниками». Маркер при этом устанавливается в конец строки.

Однострочник для маркера «Добавлено»:

 

Движение.Регистратор = Ссылка;//Добавлено: Admin 2012-02-10

 

Однострочник для маркера «Удалено»:

 

//Движение.Регистратор = Ссылка;//Удалено: Admin 2012-02-10

 

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

 

//Изменено: Admin 2012-02-10
//Движение.Цена = ТекСтрокаТовары.Цена;
//---- Заменено на: ----
Движение.Цена = ТекСтрокаТовары.Цена;
/// Admin 2012-02-10

 

Формат подписи автора (сигнатура) задается при помощи строки, в которой используются параметры, заменяемые при применении маркеров, на конкретные (вычисляемые) значения.

Мы реализуем поддержку следующих параметров:

  • %ИмяПользователя% - вставляет имя текущего пользователя информационной базы;
  • %ПолноеИмяПользователя% - вставляет полное имя текущего пользователя ИБ;
  • %ИмяПользователяХранилищаКонфигурации% - вставляет имя текущего пользователя хранилища конфигурации (под которым установлено текущее подключение к хранилищу конфигурации);
  • %ИмяПользователяОС% - имя текущего пользователя операционной системы
  • %ДатаВремя#<ФорматнаяСтрока>% - текущее дата и время, отформатированное при помощи форматной строки, синтаксис которой аналогичен синтаксису форматной строки, используемой в методе Формат() глобального контекста 1С:Предприятия 8.

Для примеров маркеров, приведенных выше, форматная строка имеет вид:

%ИмяПользователяОС% %ДатаВремя#ДФ=yyyy-MM-dd%

 

Основные свойства скрипта

Для создания скрипта можно использовать любой текстовый редактор, в том числе и ретактор текстов 1С:Предприятия 8. Но лучше, конечно же, использовать специализированный редактор кода с возможностью подсветки синтаксических конструкций JavaScript и другими полезными в разработке инструментами. Я в своей практике использую Notepad++ (точнее, его портативную версию).

Файл скрипта должен быть создан в кодировке UTF-8, рекомендуется использовать UTF-8 с меткой BOM (UTF-8 with BOM).

Добавим в начало скрипта следующие директивы:

$engine JScript

$uname author

$dname Авторский комментарий

Первая из них ($engine)  указывает тип скриптового движка, который Снегопат должен использовать для выполнения кода скрипта.

При помощи двух других директив указываются уникальное имя ($uname) и название скрипта ($dname) – по сути аналоги свойств «Имя» и «Синоним» объектов метаданных 1С.

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

 

Статическое подключение других скриптов

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

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

Первый способ реализуется при помощи директивы $addin, в качестве первого обязательного параметра которой должно быть указано уникальное имя скрипта, который мы хотим импортировать. Вторым параметром можно указать идентификатор, под которым мы хотим «знать» объект подключаемого скрипта в глобальной области видимости нашего скрипта. Если второй параметр не указан, объект подключаемого скрипта будет добавлен в наш скрипт под своим уникальным именем (указанным в директиве $uname).

Мы в нашем скрипте подключим таким образом два скрипта, входящих в состав ядра Снегопата: «Стандартную библиотеку» stdlib (3_std.js) и библиотеку «Подключение глобальных контекстов» global(0_global_context.js). О назначении и использовании этих библиотек мы поговорим далее в статье, когда нам потребуется их функционал, а пока добавим в наш код директивы для их подключения:


$addin global

$addin stdlib


Динамическое подключение других скриптов

Статическое подключение скрипта требует, чтобы подключаемый скрипт на момент загрузки нашего скрипта уже был загружен Снегопатом (поэтому этот способ подключения я и называю статическим).  Это не удобно, когда нам требуется в своем скрипте использовать не скрипт ядра Снегопата (эти-то скрипты загружаются раньше других), а такой же «рядовой» скрипт, как и наш.

Для таких случаев существует возможность динамического подключения скриптов, реализованная в библиотеке stdlib, а именно, метод require(). В качестве первого параметра он принимает имя файла скрипта-библиотеки (скрипта из подкаталога Libs каталога scripts) или полный путь к файлу скрипта, если он расположен не в каталоге Libs.

С помощью этого метода мы подключим к нашему скрипту библиотеку по работе с содержимым активного окна редактора текстов Конфигуратора:

stdlib.require("TextWindow.js",SelfScript);

Если подключаемый скрипт еще не загружен, то require() осуществит его загрузку, если скрипт уже был загружен, то не будет предпринимать никаких других действий, а просто вернет объект подключаемого скрипта.

В качестве второго параметра скрипта в метод require можно передать объект нашего скрипта, доступный через глобальное свойство SelfScript. В этом случае, в глобальную область видимости нашего скрипта будут добавлены все публичные методы и объекты подключаемого скрипта.

 

Макросы: способы объявления

Макросы - это команды скрипта, которые могут быть вызваны пользователем скрипта. С точки зрения реализации макросы скрипта – это функции скрипта, которые не  имеют параметров и имена которых начинаются с префикса «macros».

Наш скрипт будет содержать три макроса, реализующих собственно функционал скрипта: макросы «Маркер «Добавлено», «Маркер «Изменено» и «Маркер «Удалено», а также макрос «Настройка», который будет открывать форму настройки скрипта, в которой пользователь сможет указать свой формат подписи и т.п.

Таким образом, макрос мы могли бы объявить следующим образом:

function macrosМаркерДобавлено() {

    // ... программный код макроса ...

}

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

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

 

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

SelfScript.self['macrosМаркер "Добавлено"']=function(){

    // ... программный код макроса ...

}

Прокомментирую приведенный код. Свойство self объекта-скрипта (SelfScript) ссылается на объект, представляющий глобальную область видимости скрипта в виде ассоциативного массива. Для тех, кто не знаком с понятием «ассоциативный массив», отмечу, что в объектной модели 1С наиболее близким аналогом для него будет являться объект «Соответствие».

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

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

 

Дружественные к пользователю названия макросов

 

Реализация макросов скрипта

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

 

  1. Проанализировать наличие и состояние активного текстового окна (вызывается ли макрос в текстовом окне и выделен ли в нем текст или нет);
  2. На основе результатов анализа принимать решение, будем ли вставлять маркер блока или «однострочник»;
  3. Добавлять маркеры указанного типа.

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

 

var MarkerTypes = {

    ADDED: "МаркерДобавлено",

    REMOVED: "МаркерУдалено",

    CHANGED: "МаркерИзменено"

};

 

function addMarker(markerType) {

    // ... программныйкод функции ...

}

 

Заглушка функции готова и мы можем добавить ее вызов в наши макросы:

 

SelfScript.self['macrosМаркер "Добавлено"'] = function() {

    addMarker(MarkerTypes.ADDED);

}

 

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

 

Использование объектов 1С: метод v8New()

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

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

Снегопат позволяет использовать в скриптах многие универсальные объекты глобального контекста 1С:Предприятия 8, такие как «Структура», «Таблица значений», «Соответствие» и т.д., создавая их при помощи специального метода v8New(). Первым параметром метод принимает название объекта (строкой), вторым и последующими  параметрами – значения, которые должны быть переданы в конструктор объекта. Мы для хранения настроек скрипта будем использовать объект 1С:Предприятия 8 «Структура»:

function getSettings() {

    var s = v8New("Структура");       

    // Настройки по умолчанию.

    s.Вставить("ФорматПодписи","%ИмяПользователяОС% %ДатаВремя#ДФ=dd.MM.yyyy%");

    s.Вставить("МаркерДобавлено","Добавлено:");

    s.Вставить("МаркерУдалено","Удалено:");

    s.Вставить("МаркерИзменено","Изменено:");

    s.Вставить("ЗакрывающийМаркерБлока","/");

    s.Вставить("РазделительКодаПриЗамене","---- Заменено на: ----");   

    // Дополнительные настройки:

    s.Вставить("НеОставлятьКопиюКодаПриЗамене",false);

    s.Вставить("НеДобавлятьСигнатуруПослеЗакрывающегоМаркера",false);   

    return s;

}

Как видите, можно легко использовать русскоязычные имена методов (хотя я лично предпочитаю в скриптах использовать их англоязычные имена).

Вызов метода для инициализации глобальной переменной, в которой будут храниться настройки, добавим в конец скрипта:

var Settings = getSettings();

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

 

Работа с активным текстовым окном: библиотека TextWindow.js

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

На сегодня объектная модель Снегопата для этих целей предоставляет объект ITextWindow, который реализует свойства и методы, позволяющие читать и изменять содержимое активного текстового окна. Объект можно получить при помощи метода activeTextWindow(), доступное через глобальное свойство скрипта snegopat.

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

На время, пока Александр Орефков трудится над продвинутой реализацией объектной модели Снегопата, для организации традиционного способа работы с текстом был реализован скрипт TextWindow.js - обертка над объектом ITextWindow, реализующая методы, аналогичные методам объекта «Текстовый документ» 1С:Предприятия 8 и несколько собственных методов.

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

Саму библиотеку, как мы помним, мы уже подключили динамически в начале нашего скрипта:


stdlib.require("TextWindow.js",SelfScript);


Библиотека реализует один публичный метод GetTextWindow(), который получает и возвращает объект, представляющий активное текстовое окно. Если активного текстового окна нет, метод вернет значение null.

Итак, вернемся к написанию функции addMarker(). Напомню общий алгоритм работы метода:

 

  1. Проанализировать наличие и состояние активного текстового окна (вызывается ли макрос в текстовом окне и выделен ли в нем текст или нет);
  2. На основе результатов анализа принимать решение, будем ли вставлять маркер блока или «однострочник»;
  3. Добавлять маркеры указанного типа.

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

 

var w = GetTextWindow();

if (!w) return;

 

Для того, чтобы проанализировать, будем ли вставлять маркер в конце строки («однострочник») или же обрамлять им выделенный блок, необходимо получить информацию об установленном в активном окне выделении. Для этих целей у объекта TextWindowWrapper есть метод  GetSelection(), который возвращает объект ISelection, имеющий четыре свойства, содержащие координаты выделения:

 

  • beginRow и beginCol – номер строки и колонки начала выделенного текста;
  • endRow и endCol – номер строки и колонки окончания выделенного текста.

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

Если в активном окне текст не выделен, то для полученного экземпляра объекта ISelection будут выполняться условия:  beginRow == endRow, beginCol == endCol, и значения в свойствах будут указывать на текущую позицию курсора.

Таким образом, если будет выполняться условие  beginRow == endRow, то маркер будем размещать в конце строки, в которой находится курсора, в противном случае – будем обрамлять маркерами выделенный текст:

 

    var sel=w.GetSelection();

    if (sel.beginRow == sel.endRow)

    {   

        // Однострочник.

    }

    else

    {

        // Блок кода.

    }   

Алгоритм каждой ветки условной конструкции тривиален:

 

  1. Получить текст (строки в позиции курсора или выделенного блока);
  2. Добавить в текст маркеры;
  3. Установить измененный фрагмент текста.

Для получения одной строки текста, заданной номером, воспользуемся методом GetLine() (можно использовать русскоязычный синоним ПолучитьСтроку()). Для замены строки в тексте, соответственно, предназначен метод ReplaceLine() (ЗаменитьСтроку()). Для формирования маркера используем вызов метода markLine() (его объявим в тексте скрипта как заглушку):

 

var line = w.GetLine(sel.beginRow);

var code = markLine(markerType,line);       

w.ReplaceLine(sel.beginRow,code);


Как видите, работа с содержимым окна редактора в данном случае аналогична программной работе с объектом ТекстовыйДокумент объектной модели 1С:Предприятия 8.

Для работы с блоком текста, заданным его координатами, объект TextWindowWrapper реализует метод Range(). Координаты текста передаются в качестве параметров метода. Возвращает этот метод объект, представляющий методы для чтения (GetText()) и для установки текста блока (SetText()). Воспользуемся ими для установки маркеров выделенного блока. Для формирования маркера блока будем использовать вызов метода markBlock() (его, как и метод markLine() надо объявить в скрипте пока как заглушку):

 

var endRow = sel.endCol > 1 ? sel.endRow : sel.endRow - 1;

var block = w.Range(sel.beginRow, 1, endRow).GetText();       

var code = markBlock(markerType,block);       

w.Range(sel.beginRow, 1, endRow).SetText(code);

 

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

Но в ситуации, когда блок выделен целиком (от первой колонки первой строки до последней колонки последней строки), координата последней строки – это координата следующей за выделенным текстом строки. Такой случай проиллюстрирован на скриншоте (стрелка указывает на позицию курсора):

 

 

Реальная координата строки, являющейся последней строкой выделения, в этом случае равна

 

sel.endRow- 1

 

Приступим теперь к реализации методов markLine() и markBlock().

 

Реализация алгоритма установки маркеров

Реализацию алгоритмов добавления маркеров рассмотрим на примере реализации метода markLine(). Метод markBlock() реализуется абсолютно аналогичным образом. Я не буду в этот раз приводить описание алгоритма на «человеческом» языке, потому что он достаточно прозрачен, а сразу приведу исходный код и прокомментирую некоторые его части.

 

function markLine(markerType,line) {

    // Удалим концевые пробелы в строке.

    var code=line.replace(/(.+?)\s*$/,"$1");  

    switch(markerType)

    {

    case MarkerTypes.ADDED:

        // Добавляемвхвостподпись.

        code = code + getStartComment(markerType);

        break;

    case MarkerTypes.REMOVED:

        // Закомментируем строку и в хвост добавим подпись.

        code = commentLine(code) + getStartComment(markerType);

        break;

    case MarkerTypes.CHANGED:

        // Маркер "Изменено" для однострочника такой же как и для блока.

        var indent = StringUtils.getIndent(code);

        code = indent + getStartComment(markerType) + "\n";

        code += prepareChangedBlock(line,indent) + "\n";           

        code += indent + getEndComment() + "\n";           

        break;

    }

    return code;

}

 

Вызываемые функции commentLine() и commentBlock() добавляют в начало строки и строк блока соответственно символы комментария («//») и возвращают закомментированный таким образом текст.

Объект StringUtils – объект библиотеки TextWindow.js. Он реализует вспомогательные функции по работе с текстом. Мы используем его метод getIndent(), который возвращает отступ в тексте, переданном в качестве параметра. Отступ – это пробельные символы с начала строки и до первого непробельного символа.

Текст маркеров формируется в функциях getStartComment() и getEndComment(). Их реализация также проста и очевидна:

 

function getStartComment(markerType) {

    return "//"+Settings[markerType]+" "+getSignature();

}

 

function getEndComment() {

    var endComment="//"+Settings["ЗакрывающийМаркерБлока"];

    if (!Settings["НеДобавлятьСигнатуруПослеЗакрывающегоМаркера"])

        endComment+=" "+getSignature();

    return endComment;

}

 

Функция getSignature() – возвращает подпись, сформированную на основе форматной строки, задаваемой в настройках (настройка «ФорматПодписи»).

 

Метод parseTemplateString() – программный парсинг шаблонов 1С

Теперь настала пора поговорить о способе обработки параметров форматной строки для подписи. Для вычисления значений параметров подстановки используется возможность программного парсинга шаблонов кода 1С, которая предоставляется Снегопатом, а именно, метод parseTemplateString() объекта ISnegopat (объект в скрипте доступен через глобальное свойство snegopat).

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

Имена параметров подстановки в нашей форматной строке полностью совпадают с управляющими конструкциями механизма шаблонов. Этим мы и пользуемся в реализации функции parseTpl():

 

function parseTpl(){

    var a=[];   

    for (var i=0; i<arguments.length;  i++)

        a.push(arguments[i]);       

    return snegopat.parseTemplateString('+a.join(',')+'>');

}


Реализация механизма подстановки параметров форматной строки

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

1. Для каждого параметра создается анонимная функция, возвращающая значение этого параметра. Пары имя «параметра – функция» хранятся в виде анонимного объекта в глобальной переменной MarkerFormatStringParameters (аналогично, как бы мы это сделали в 1С при помощи объекта Структура: имя параметра – ключ элемента структуры, функция параметра – значение элемента структуры).

2. MarkerFormatStringParameters пополняется набором предопределенных параметров при помощи метода addFormatStringParam():

 

addFormatStringParam("ИмяПользователя","parseTpl(name)")

addFormatStringParam("ПолноеИмяПользователя","parseTpl(name)")

addFormatStringParam("ИмяПользователяХранилищаКонфигурации","parseTpl(name)")

               

Вторым параметром метода передается строка кода на JavaScript, которая должна вычислять и возвращать значение параметра. В методе мы создаем анонимную функцию, вычисляющую переданную строку кода при помощи оператора eval() и добавляем пару «Имя параметра – Функция» в MarkerFormatStringParameters:

 

function addFormatStringParam(name,code) {

    var paramGetter = function(p) {

        return eval(code);

    }

    MarkerFormatStringParameters[name] = paramGetter;

}

 

3. В функции getSignature() при помощи метода replace()выполняется поиск параметров, вычисление их значения

и подстановка вычисленного значения в форматную строку вместо самого параметра.


function getSignature() {

    var fmt=Settings['ФорматПодписи'];

    var ptn=/%(.+?)(?:#(.+)){0,1}%/ig;

    return fmt.replace(ptn,function(match,p1,p2,offset,s) {

        // p1 - имя управляющей конструкции.

        // p2 - параметр управляющей конструкции (для ДатаВремя).

        return MarkerFormatStringParameters[p1].call(null,p2);

    });

}

 

В качестве второго аргумента метода replace() передается анонимая функция, в которой мы по имени параметра (p1) получаем функцию для вычисления его значения и вызываем ее (о методе call() в языке JavaScript см. здесь).

У параметра «ДатаВремя» есть еще аргумент – форматная строка даты. Ее мы и передаем в качестве второго параметра (p2) в вызов функции получения значения параметра.

 

Разработка формы скрипта

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

Чтобы создать новую форму скрипта, необходимо воспользоваться командой «Новая форма скрипта» подменю «Действия» командной панели окна Снегопата или вызвать одноименный макрос:

Будет создана и открыта в редакторе форм чистая форма, без единого элемента управления. Редактирование формы осуществляется штатными средствами Редактора форм Конфигуратора 1С:Предприятия 8, хорошо знакомого читателю.

Я реализовал форму следующего вида:

 

(При нажатии на надпись-гиперссылку с именами параметров в поле ввода "Формат подписи" будет добавляться соответствующий параметр.)

Для удобства сопоставления реквизитов формы с элементами структуры настроек скрипта имена реквизитов я задал такими же, как и соответствующие имена настроек (ключи структуры Settings).

При сохранении формы в качестве расширения имени файла формы обязательно явным образом следует указать расширение *.ssf! В противном случае конфигуратор может «упасть», потеряв созданную и настроенную форму.  Это текущая особенность механизма, которую следует учитывать.

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

 

Программное открытие формы скрипта

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

В объектной модели 1С:Предприятия 8, перед использованием форму надо получить при помощи метода ПолучитьФорму(). В скриптах для Снегопата форму необходимо загрузить из файла. Для этого предназначен метод loadScriptForm(). Первым параметром в метод необходимо передать путь к файлу формы, вторым – объект, в котором будут реализованы обработчики событий формы и ее элементов управления. В нашем случае таким объектом будет сам скрипт (т.е. обработчики мы реализуем непосредственно в глобальной области видимости скрипта):

 

SelfScript.self['macrosНастройка'] = function() {

    // form - неявно определяемая глобальная переменная.

    form=loadScriptForm(SelfScript.fullPath.replace(/js$/,'ssf'),SelfScript.self);

    form.DoModal();

    form=null;

}

 

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

Метод loadScriptForm() возвращает объект «Форма» 1С:Предприятия 8, хорошо знакомый 1С:Специалистам.

 

Обработчики событий формы и элементов управления

Для назначения обработчиков событий их сначала надо создать традиционным для форм 1С образом. В модуль формы будут добавлены объявления:

 

Процедура ПриОткрытии()

    // Вставить содержимое обработчика.

КонецПроцедуры

 

Процедура КнопкаОкНажатие(Элемент)

    // Вставить содержимое обработчика.

КонецПроцедуры

 

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

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

 

function ПриОткрытии(){

    // Вставить содержимое обработчика.

}

 

function КнопкаОкНажатие(Элемент){

    // Вставить содержимое обработчика.

}

 

Автоматически сгенерировать код функций-заглушек на основании кода обработчиков из модуля формы можно при помощи скрипта «Разработка скриптов». Необходимый макрос называется «СформироватьКодОбработчиковФормыНаJavaScript». Перед вызовом макроса необходимо выделить код обработчиков, для которых надо сформировать код для скрипта. Скрипт запросит имя объекта, в котором реализованы методы – обработчики событий. Если эти методы будут реализованы как функции скрипта (как раз наш случай), поле для ввода имени объекта необходимо оставить пустым.

Сгенерированный код будет выведен в окно сообщений, откуда его следует скопировать в файл скрипта.

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

 

Работа с параметрами обработчиков событий формы и элементов управления

При реализации кода обработчиков событий элементов управления формы и самой формы есть специфичный момент, о котором важно знать. В JavaScript примитивные типы данных (строки, числа и булевы значения) всегда передаются по значению, в то время как объекты передаются по ссылке. Поэтому изменение значения, например,  параметра СтандартнаяОбработка в обработчике события «НачалоВыбора» поля ввода не даст ожидаемого эффекта.

Для обхода этой проблемы Снегопат передает в качестве аргументов обработчиков событий не конкретные значения, а объект-обертку этих значений. Этот объект имеет единственное публичное свойство «val», предоставляющее доступ к значению параметра. В этот объект "оборачиваются" не только значения примитивных типов, но и все значения, передаваемые в качестве параметров в функции-обработчики событий.

Проиллюстрируем эту особенность на примере реализации обработчиков события «Нажатие» надписей-гиперссылок, при нажатии на которые в поле ввода «Формат подписи» должен вставляться соответствующий параметр для подстановки:

 

function НадписьИмяПользователяНажатие(Элемент) {

    addToSignatureFormat(form,Элемент.val.Заголовок);

}

 

Сам метод addToSignature() очень прост и мы не будем описывать его отдельно. Обратите внимание, как в приведенном листинге происходит обращение к свойству «Заголовок»: аргумент Элемент содержит объект-обертку. Реальное значение (элемент управления, в нашем случае – надпись) доступно через его свойство val.

 

Использование методов глобального контекста 1С

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

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

Снегопат позволяет нам использовать в коде скриптов не только объекты общего назначения 1С:Предприятия, но и многие методы глобального контекста 1С:Предприятия, в том числе и метод ЗаполнитьЗначенияСвойств().

Для этих целей мы и подключили в самом начале нашей статьи скрипт global.  Чтобы добавить методы глобального контекста в глобальную область видимости нашего скрипта, необходимо в нашем скрипте вызвать метод connectGlobals() скрипта global, передав ему в качестве парметра объект нашего скрипта:

 

global.connectGlobals(SelfScript);

 

Теперь нам доступно использования многих методов глобального контекста 1С, в том числе и ЗаполнитьЗначенияСвойств(). Вызовем этот метод для передачи текущих настроек из структуры настроек в реквизиты формы и чтения измененных в форме настроек обратно в структуру:

 

function ПриОткрытии() {

    ЗаполнитьЗначенияСвойств(form,Settings);

}

 

function КнопкаОкНажатие(Элемент) {

    ЗаполнитьЗначенияСвойств(Settings,form);

    // ... Здесь будет код сохранения настроек ...

    form.Close();

}


Хранение и чтение настроек скрипта

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

Для таких целей Снегопат предоставляет специальное свойство profileRoot объекта IDesigner, который реализует методы для работы с хранилищем настроек.

Нас в первую очередь интересуют его методы createValue() – создает значение для хранения настроек в хранилище настроек. setValue() – устанавливает значение настройки и getValue() – получает значение.

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

 

profileRoot.createValue(pflAuthorJs,s,pflSnegopat);

s=profileRoot.getValue(pflAuthorJs);

 

Первая строчка создает значение настройки, если оно не создано. Первым аргументом передается путь к значению – строка вида «Авторский комментарий/Настройки», мы ее зададим в глобальной переменной, объявление которой добавим где-нибудь в начале скрипта:

 

var pflAuthorJs='Авторский комментарий/Настройки';

 

Второй аргумент – значение по умолчанию. Оно будет записано при создании настройки, если ее не существовало. Мы в качестве значения по умолчанию передаем структуру, в которой сохранены настройки скрипта по умолчанию.

Третий аргумент – тип хранилища настроек.  В качестве значения аргумента необходимо передать значение перечисляемого типа ProfileStoreType, доступное в глобальной области видимости скрипта. Настройки могут быть сохранены для конкретной информационной базы (значение pflBase), для конкретного пользователя ИБ (pflBaseUser), для информационной базы на конкретном компьютере (pflCompBase), для пользователя информационной базы на конкретном компьютере (pflCompBaseUser), для конкретного компьютера (pflComputer), для сеанса (pflSeanse) и, наконец, для Снегопата (pflSnegopat).

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

Метод createValue() рекомендуется вызывать всегда перед чтением значения настройки. Если на момент вызова настройка существовала, метод ее не изменит и следующий вызов getValue() получит значение настройки. Если же сохраненной настройки не существовало (например, скрипт запускается впервые), то она будет создана и проинициализирована значением по умолчанию. Таким образом мы гарантируем наличие необходимой настройки всегда.

 

Заключение

 

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

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

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

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

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

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

Есть куча еще не реализованных пожеланий и идей как для новых скриптов, так и для существующих.

Если вам интересно написать скрипт самому или есть идеи или пожелания по функционалу – присоединяйтесь!

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. JohnyDeath 300 12.02.12 09:49 Сейчас в теме
Потрясающе! Огромная работа проделана. Спасибо, Александр.
5. kuntashov 421 12.02.12 23:11 Сейчас в теме
(1) Спасибо за положительную оценку!

(2) Я из корыстных целей - больше будет разработчиков скриптов, быстрее будет появляться и улучшаться функционал скриптов и развиваться сам Снегопат :)

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

(3) Полноценной документации на сегодня нет.

Сам перечень доступных объектов, методов и событий можно посмотреть любым из описанных здесь (http://forum.script-coding.com/viewtopic.php?id=4481) способов.

О том, как их использовать - см. исходный код существующих скриптов.

(4) В отличие от ОпенКонфа, Снегопат не загружает скрипты автоматически их каталога scripts. Для Снегопата надо явно указывать, какие скрипты следует загружать при старте конфигуратора. Это делается при помощи указания пути к скрипту в файле addins.ini (он расположен в корневой папке Снегопата).
2. orefkov 2161 12.02.12 10:26 Сейчас в теме
Саша, огромное спасибо за статью, за все твои усилия по развитию и популяризации Снегопата.
У меня у самого всегда проблема с передачей другим своих знаний, не всегда получается внятно, доходчиво и системно объяснить что как работает.

Просто хотелось бы немного дополнить для желающих прокачаться.

Писать скрипты для Снегопата - легко и приятно. Мощь JScript, сложенная с широтой объектной модели 1С, помноженная на удобство и привычность создания визуальных форм - дают поистине взрывной эффект, совершенно недостижимый в предыдущем проекте - опенконфе. Объектная модель Снегопата - постоянно дорабатывается и расширяется, сейчас готовлю работу с окнами в Конфигураторе. Так как за основу объектной модели взят COM, то просмотреть текущую модель можно любым просмотрщиком библиотек типов.

Список объектов, которые можно создать в V8New - выложен мной на форуме.

Посмотреть, какие глобальные методы 1С можно использовать - в файле core\std\scripts\0_global_context.js
secondwork; Ёпрст; kuntashov; JohnyDeath; +4 Ответить
3. sytkosa 12.02.12 21:08 Сейчас в теме
А наиболее полное описании объектной модели есть где нибудь. Ткните носом а то так и не смог найти
4. headMade 144 12.02.12 22:01 Сейчас в теме
спс. за статью
Буду разбираться.

но у меня возинк вопрос. Как можно author.js "подгрузить" в снегопад (т.е. в конфигураторе этот скрипт не виден) ???
Я пробывал скопировать его в \snegopat\scripts\ , но при перезапуске не увидело его.
Юзаю demo-1112b


Нашел еще "Действия - загрузить скрипт"? Но у меня подсвечивается это серым цветом.
6. kuntashov 421 12.02.12 23:12 Сейчас в теме
(4) И еще небольшое дополнение:

"Быстрый старт" по разработке скриптов описан в статье Артура Аюханова (artbear) в вики проекта.
23. Модератор раздела artbear 13.02.12 11:03 Сейчас в теме
(kuntashov) (orefkov) Саши :), включите этот линк "Быстрый старт" из (6) в свои статьи,думаю, начинающим скриптописателям будет полезно.
27. kuntashov 421 13.02.12 12:28 Сейчас в теме
(23) Да, конечно нужно добавить, я забыл про эту публикацию.
(25) Могу :) Добавлю задачу в планы.
7. orefkov 2161 12.02.12 23:40 Сейчас в теме
(4)
Команда "Загрузить скрипт" доступна, если активна группа "Пользовательские аддины", или вложенная в нее группа.
Для подключения дополнительного аддина необходимо вписать его в файл addins.ini.
Формат файла - интуитивно понятный.
Также свои разработки я бы не рекомендовал класть в scripts. В рабочей программе это каталог, отображающий публичный общедоступный репозитарий скриптов, и находится под версионным контролем, и свои скрипты там будут вечно "путаться под ногами". Лучше завести отдельную папочку. Ну и если ваш скрипт полезен, со временем он вполне может оказаться в общем репозитарии.
headMade; +1 Ответить
8. tormozit 6572 13.02.12 00:08 Сейчас в теме
(4) headMade,
> Нашел еще "Действия - загрузить скрипт"? Но у меня подсвечивается это серым цветом.

Это где такое?

Тоже пытаюсь сам скрипт загрузить (extSearch.js), но пока даже скачать не смог по-человечески. Через addins.ini вроде подключает. Тоже использую последнюю демо версию.
11. headMade 144 13.02.12 00:31 Сейчас в теме
(8) tormozit,
1.Запускаем снегопат
2. В конфигураторе клацаем Ctrl + M (для запуска окна макросов)
3. для "Снегопад" выбираем макрос "Открыть окно Снегопада"
4. Здесь становимся на папку "пользовательские аддины" -> правая кнопка мыши и в списке выбираем "Загрузить скрипт"

но только походу тут лучше добавить папку "Мои скрипты" и загружать все туда, а не в папку "Скрипты из общего репозитария"
9. dedkov 13.02.12 00:22 Сейчас в теме
Доброго времени суток. Кто-нибудь пробовал это под Linux (Ubuntu)? И кстати эта штука будет работать на версии для обучения программированию 8.2?
10. orefkov 2161 13.02.12 00:31 Сейчас в теме
(9)
Под вайном запускали, работает.
Под учебной версией не работает.
12. orefkov 2161 13.02.12 00:32 Сейчас в теме
(9)


Но это подгружает скрипт только на текущий сеанс.
13. headMade 144 13.02.12 00:44 Сейчас в теме
(12) orefkov, (8) tormozit,

получается (исходя из того что написано в "Быстрый старт п.3 и п.4") надо
1. Прописать скрипт в addins.ini
2. перезапустить Снегопад или выполнить "Загрузить скрипт"
14. orefkov 2161 13.02.12 00:45 Сейчас в теме
26. pumbaE 13.02.12 11:41 Сейчас в теме
(9) uri-fl, под wine запускается, но необходимы определенные действия и библиотеки от ms, соответственно если полностью по честному, без лицензии на XP не получиться. Т.к. используется COM необходимы библиотеки ole32, oleauth32 и другие, также обязательно наличие библиотеки pdm.dll в каталоге Windows (скрипты стартуют в debug режиме, я сначало просил orefkov -а добавить опцию старта снегопата не debug режиме, но когда оказалось что без ole32 все равно не заработает, это потеряло свою актуальность). С Wine@Etersoft тоже не работает и смотря на их активность по добавлению вызовов в ole32 библиотеку это не скоро возможно.

Ждем 8.2.16.
Прикрепленные файлы:
15. tormozit 6572 13.02.12 00:56 Сейчас в теме
16. orefkov 2161 13.02.12 01:01 Сейчас в теме
(15)
Незарегенным пользователям только руками качать с http://snegopat.ru/scripts/dir?ci=tip
Предварительно нужно залогиниться анонимусом (Вход/заполнить капчу).
У зарегенных понятно само скачивается/обновляется с репозитария.
Часть текущих скриптов на демо-версии не заработает, из-за отсутствия нужных фич в объектной модели.
17. headMade 144 13.02.12 01:26 Сейчас в теме
вопросы по поводу author.js


1.При загрузке (перезагрузке) author.js ругается :
Файл: \core\std\scripts\3_std.js
Строка 97, позиция 12.
18. kuntashov 421 13.02.12 07:38 Сейчас в теме
(17) Уточните, пожалуйста:
1. Используете ли вы демо-версию Снегопата или полнофункциональную.
2. Приведенный текст - это полное сообщение об ошибке? Приведите скриншот.
19. headMade 144 13.02.12 08:21 Сейчас в теме
20. kuntashov 421 13.02.12 08:32 Сейчас в теме
(19) Убедитесь, что кроме author.js вы также скачали и установили скрипт-библиотеку TextWindow.js. Ее необходимо расположить в scripts\Libs.

Еще лучше, чтобы каждый раз так не выяснять зависимости, скачайте сразу актуальное содержимое репозитария скриптов.
21. tormozit 6572 13.02.12 10:18 Сейчас в теме
Кому нибудь удалось скрипт extSearch на демоверсии запустить?
22. JohnyDeath 300 13.02.12 11:02 Сейчас в теме
(21) На демо он не будет работать.
24. Модератор раздела artbear 13.02.12 11:08 Сейчас в теме
(21) Имхо как раз этот скрипт очень сильно отличает демо-версию от последней лицензионной :)
Доп.стимул купить Снегопат.
25. Модератор раздела artbear 13.02.12 11:19 Сейчас в теме
(0) Саш, для "Изменено" я старый код в комментах ставлю после нового кода + сдвигаю его вправо.
ИМХО так более наглядно при работе с кодом - изучение/изменение.
Можешь такой вариант реализовать?
28. headMade 144 13.02.12 23:22 Сейчас в теме
а вот этот вылет "предполагается наличие объекта" - это уже как я понимаю сработало ограничение демоверсии?
Прикрепленные файлы:
29. kuntashov 421 14.02.12 07:41 Сейчас в теме
(28) Возможно, но не уверен. На выходных поставлю демо-версию Снегопата и проверю на ней сам. Раньше, к сожалению, не смогу.
30. headMade 144 14.02.12 08:43 Сейчас в теме
(29)
спс, буду с нетерпением ждать
33. headMade 144 16.02.12 00:10 Сейчас в теме
(29)
спс, пробывать на демо не надо

подгрузил все файлы отсюда и все заработало
Costa; alk; kuntashov; +3 Ответить
35. kuntashov 421 16.02.12 07:37 Сейчас в теме
(33) Ну, отлично.

(34) Правильно ли я понял, что из объяснения в начале статьи ("Описание задачи") и приведенных там же примеров результата работы скрипта вам не понятно его назначение?
31. Veduin 15.02.12 07:35 Сейчас в теме
Довольно таки интересно и можно будет попробовать использовать!
32. пользователь 15.02.12 13:26
Сообщение было скрыто модератором.
...
34. R1sks 16.02.12 00:46 Сейчас в теме
36. пользователь 16.02.12 14:59
Сообщение было скрыто модератором.
...
37. pumbaE 16.02.12 18:14 Сейчас в теме
(36) Pavel494, ну или просто сделать свой бранч (fossil branch my-dev) там ложить под версионный контроль свои скрипты (это же удобно) и периодически делать (fossil merge trunk).

А с учетом добавления поддержки версионного backend в 1С с fossil вообще мегаудобно, пришел допустим к клиенту запустил fossil open и вот ваше рабочее место со всеми настройками и внешними обработками есть.
38. silence_14@mail.ru 22.02.12 10:43 Сейчас в теме
Большое спасибо, давно хотелось с этим поразбираться, будем пробовать
39. headMade 144 16.03.12 00:20 Сейчас в теме
а как настройки по этому скрипту как перенести с одной машины на др?
40. kuntashov 421 16.03.12 09:42 Сейчас в теме
(39) Настройки этого скрипта хранятся в файле snegopat.pfl, который находится рядом со snegopat.dll
41. headMade 144 23.03.12 00:52 Сейчас в теме
может не совсем в ту тему..

подскажите плиз можно в снегопаде описать ф-ию, которая бы возвращала некоторое значение (наприм результат умножения 2-х чисел).

Потом в 1С (в конфигураторе в момент отладки) вызвать эту ф-ию (через табло или через "вычислить выражение"), передав туда 2 числа
42. orefkov 2161 23.03.12 01:00 Сейчас в теме
(41)
Ну так написать обычный скрипт с нужной функцией, и загрузить его.
Через табло правда не вызовется. Для вызова можно использовать уже готовый скрипт immediate.js
Там в текстовом поле наберешь
addins.byUniqueName("имя твоего скрипта").object.yourCoolFunction(1, 2)
и Ctrl+Enter
ну или повесить твой макрос на хоткей, сделать нормальную форму для ввода и т.п.
Опиши задачу подробнее, посмотрю, как сделать.
43. boggonzikov 336 20.06.12 10:27 Сейчас в теме
В чем удобнее всего писать код скрипта (из публикации Notepad++) и отлаживать его?
44. kuntashov 421 20.06.12 10:42 Сейчас в теме
(43) Я пишу в Notepad++, с использованием скрипта собственной разработки для формирования списка функций (http://snegopat.ru/forum/viewtopic.php?f=3&t=95) . Отлаживаю при помощи MS Script Editor, который идет в поставке с офисом ДО версии 2007 включительно (в поздних версиях его уже, к сожалению, нет).

Сейчас пробую перейти на разработку скриптов непосредственно в Конфигураторе: плагин SciColorerV8 поддерживает подсветку синтаксиса для js-файлов. Собираюсь скрипт вывода списка функций переписать для Снегопата и полностью перейти на разработку скриптов внутри Конфигуратора.
46. boggonzikov 336 20.06.12 12:21 Сейчас в теме
(44)
Можешь рассказать подробнее про процесс отладки?
Получится ли отлаживать наподобие конфигуратора 1С, с точками останова?
47. kuntashov 421 20.06.12 13:01 Сейчас в теме
(46) Да, отладка при помощи MS Script Editor осуществляется традиционно. Единственное, точка останова ставится не визуально, а с помощью специального оператора debugger, который надо написать в том месте, где нужна точка останова.

Вот здесь можно почитать, какие настройки необходимы: http://www.potolook.ru/blog/p,33/
45. пользователь 20.06.12 11:11
Сообщение было скрыто модератором.
...
48. bsi 20.06.12 21:40 Сейчас в теме
(28) наступил на те же грабли.
лечение по (33) не помогло.
все-таки "предполагается наличие объекта", которого TextWindow.js в snegopat-demo-1112b и snegopat-demo-1112с не дает.

зы: pumbaE для демок переделал свой скрипт editor_colors.js для обхода ограничений демок. как бы так же запустить author.js в snegopat-demo-1112с?
49. 1cyku 59 19.07.12 09:59 Сейчас в теме
(48) Аналогичная ошибка. Кому-нибудь удалось пофиксить ошибку?
50. headMade 144 19.09.12 22:15 Сейчас в теме
мне как-то раньше удалось, могу выслать если надо snegopat-demo-1112b и работающий там скрипт



ps. Попробывал счас и :

1. в scripts\Libs\ скачиваем все отсюда
2. Обновляем все файлы отсюда
3. Возник вопрос с snegopat.js. На последней версии этого скрипта и демке и 1112b валила ошибка, но вот на этой версии все красиво сработало.
51. Winter 34 10.12.12 13:28 Сейчас в теме
(50) Выполнил все рекомендации, но под демо-версией так и незапустилось. При попытке загрузке скрипта 1С-ка вылетает. Жаль. Пока, к сожалению, не могу себе позволить купить полную версию... Так что пока буду авторские коменты писать вручную :)
52. 1cmax 152 20.01.13 01:20 Сейчас в теме
(51) Winter,
Пока, к сожалению, не могу себе позволить купить полную версию...

а зря..
53. tormozit 6572 14.09.20 09:46 Сейчас в теме
Насколько актуальна статья для нового снегопата?
54. kuntashov 421 14.09.20 09:47 Сейчас в теме
Частично, большая часть актуальна, но что-то может пойти не так.
Планирую актуализировать.
55. пользователь 30.05.21 19:19
Сообщение было скрыто модератором.
...
56. пользователь 30.05.21 19:25
Сообщение было скрыто модератором.
...
57. пользователь 30.05.21 19:49
Сообщение было скрыто модератором.
...
58. Gorr 39 30.05.21 20:01 Сейчас в теме
Инструмент бесспорно интересный, но обновление когда будет 21 год уже?

По теме. Пробовал повторить, файл js выкладывал в папку "custom". в списке скриптов не появляется.
По-видимому надо дополнительно где-то прописывать. Смотрел текущие реализации скриптов js. Почему-то начало у всех скриптов закоментировано:
//engine: JScript
//uname: author

Почему так?

Хотелось бы узнать как теперь правильно создавать и подключать свои плагины.
Пример разработки на TS причем желательно в идее или вебсторме
59. kuntashov 421 30.05.21 20:08 Сейчас в теме
(58) Какой вариант Снегопата используете? Новый с гитхаба или триал-версию с инфостарта?

В версии, которая здесь на ИС скрипт уже есть в сборке, называется также "Авторские комментарии" (author.js).

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

Чтобы скрипт заработал, его нужно разместить в каталог со скриптами и подключить в главном окне Снегопата на странице "Аддины" (см. скриншот).
Прикрепленные файлы:
60. Gorr 39 30.05.21 20:20 Сейчас в теме
У меня совершенно другое окно
(59)
Прикрепленные файлы:
61. Gorr 39 30.05.21 20:27 Сейчас в теме
моя версия. подозреваю последняя - майская с гитхаба
Прикрепленные файлы:
62. pbahushevich 16.07.21 15:44 Сейчас в теме
А что снегопат совсем умер?
При вводе ключа пишет ошибка http запроса, при попытке сгенерировать новый ключ - ничего не происходит?
В телеграмме ничего не происходит с апреля месяца...
64. artbear 1412 16.07.21 17:09 Сейчас в теме
(62) Дополню сообщение Александра из (63)

- версия для 32-разрядного Снегопата вполне рабочая, и она потихоньку дорабатывается силами контрибьютором.
- на след.неделе будет выпущена еще одна 3-месячная триальная версия Снегопат-32
pbahushevich; +1 Ответить
63. orefkov 2161 16.07.21 17:06 Сейчас в теме
По ключам сейчас проверю, по снегопату - старую версию, (которая в телеграмме) не развиваю, так как сейчас все силы брошены на разработку и тест нового снегопата, с поддержкой x64 - если вкратце, надо скачать с https://github.com/infostart-hub/core_as_loader/releases и https://github.com/infostart-hub/snegopat_modul/releases, распаковать всё в одну папку. Запустить стартер (появится иконка в трее), после чего снегопат будет автоматом цепляться к запускаемым обычным порядком конфигураторам.
pbahushevich; +1 Ответить
65. pbahushevich 17.07.21 16:10 Сейчас в теме
(63)
Ключи заработали - спасибо.
Проверил новый Снегопат - тоже вроде работает. Еще раз спасибо!
Оставьте свое сообщение

См. также

Чтение метаданных 1С из SQL Server и PostgreSQL Промо

Инструментарий разработчика v8 Бесплатно (free)

Описание файла DBNames таблицы Params и файлов объектов метаданных таблицы Config.

16.02.2021    7838    zhichkin    70    

JavascriptEditorSimple - замена NicEdit и whizzywig html editor

Инструментарий разработчика v8 Платформа 1C v8.2 Платформа 1С v8.1 Бесплатно (free)

JavsscriptEditorSimple - HTML редактор для базовой замены форматированного документа.

08.08.2022    424    user1206119    6    

Ошибка при открытии StandardFindByRef.epf (описание и решение)

Инструментарий разработчика v8 Россия Бесплатно (free)

Как решить ошибку вызова недокументированной обработки StandardFindByRef.epf.

28.07.2022    520    CyberMax    1    

Доработки конструктора запроса тонкого клиента. Часть 2 - исправление багов

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

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

19.07.2022    1541    Evg-Lylyk    9    

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 Промо

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Коннектор - библиотека для работы с HTTP запросами. Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п.

31.01.2019    93236    bonv    237    

Онлайн просмотр текстов модулей

Инструментарий разработчика БСП (Библиотека стандартных подсистем) v8 БП3.0 УТ11 Бесплатно (free)

Для разработчиков: изучение кода модулей через браузер с любого устройства.

16.05.2022    963    cogniton    15    

Infostart Toolkit – чем инструмент будет полезен для аналитиков и консультантов

Инструментарий разработчика v8 Бесплатно (free)

На митапе для аналитиков "Истории внедрения" выступил Евгений Люлюк – ведущий разработчик Infostart Toolkit. Он рассказал, какие инструменты помогут аналитику исследовать незнакомую базу, находить решения проблем, работать с данными и вносить в них точечные изменения.

04.05.2022    1353    Evg-Lylyk    0    

Все функции (Infostart Toolkit)

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Улучшенный аналог "Все функции" или "Функции технического специалиста" из набора инструментов Infostart Toolkit.

15.04.2022    2355    Evg-Lylyk    5    

Сервис обмена кодом Промо

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Бывало так, что вам нужно быстро показать кому-то свой код, но опубликовать его негде, так как популярные сервисы просто не поддерживают раскраску кода 1С? Теперь решение есть!

26.06.2015    21174    Infactum    23    

Конвертация HTML в PDF программно

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Инструкция по конвертации HTML файлов в файлы PDF программно в 2 строчки и без заморочек.

09.03.2022    1364    maximus_2712    2    

Глобальное меню (Infostart Toolkit)

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Набор инструментов Infostart Toolkit. Глобальное меню для удобства запуска.

22.02.2022    2264    Evg-Lylyk    4    

Подписки на события (Infostart Toolkit)

Инструментарий разработчика v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Все подписки на события с отбором по метаданным, поиском подписки по подстроке, отображением объектов подписки и обработчиков (с возможностью посмотреть код).

26.01.2022    1669    Evg-Lylyk    8    

Подсистема "COMExchange": консоль запросов в режиме «Консоль кода». Промо

Инструментарий разработчика v8 1cv8.cf Россия Бесплатно (free)

Описана возможность использования обработки «Консоль запросов 1С+ADO» в качестве «консоли кода». При этом имеется возможность помещения результатов вычислений в «табло формул». Кроме результатов вычислений в это «табло» можно также вывести время выполнения и описание обработанных ошибок времени исполнения.

03.04.2014    26620    yuraos    2    

Отладка внешней печатной формы в управляемом приложении (с редактированием и записью)

Инструментарий разработчика v8 v8::УФ 1cv8.cf Украина Бесплатно (free)

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

20.01.2022    4662    dreamwaver_dz    32    

Загрузка метаданных из расширений в СППР

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Описание принципа, на котором можно сделать загрузку метаданных из расширений в СППР 2.

17.01.2022    937    jf2000    0    

Решение некоторых задач с помощью "Отладчика запросов"

Инструментарий разработчика v8 Платформа 1C v8.2 Платформа 1С v8.1 v8::УФ Россия Бесплатно (free)

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

29.11.2021    1520    DrAku1a    6    

VM1C - виртуальная машина для 1С Промо

Инструментарий разработчика v8 1cv8.cf Россия Бесплатно (free)

Демонстрация возможностей виртуальной машины для 1С. Создаем и выполняем код модулей в режиме Предприятия в реальном времени.

07.06.2013    29402    m.bolsun    46    

Выгрузка запроса с заполненными параметрами в файл для консоли запросов

Инструментарий разработчика v8 1cv8.cf 1С:Франчайзи, автоматизация бизнеса Бесплатно (free)

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

04.11.2021    1708    Margo462    10    

Тонкий конструктор СКД (Infostart Toolkit)

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Реализация конструктора СКД с нуля для управляемых форм. Контекстная подсказка для языка выражений СКД и другое.

01.09.2021    4402    Evg-Lylyk    22    

Ядерный Снегопат

Инструментарий разработчика v8 Бесплатно (free)

Проект Снегопат предназначен для расширения возможностей штатного конфигуратора 1С 8-й версии. В около-1С-ной сфере проект Снегопат – это, наверное, самый долгий долгострой. О том, какой путь прошел проект с 2009 года до сегодняшнего дня, на конференции Infostart Event 2021 Post-Apocalypse рассказал программист компании Инфостарт Александр Орефков.

04.08.2021    4417    orefkov    35    

Подсистема "COMExchange", "Консоль запросов 1C + ADO" - сервис обработки выборки запроса: грузим курс «бакса» ЦБРФ из файла *.dbf или *.xlsx. Промо

Инструментарий разработчика v8 КА1 УТ10 УПП1 Россия Бесплатно (free)

На примере загрузки курса валюты продемонстрированы возможности консоли запросов в составе подсистемы "COMExchange" для обработки данных из внешних файлов и их синхронизации с данными информационной базы 1С.

10.03.2013    33919    yuraos    3    

Разработка скриптов для Снегопата

Инструментарий разработчика v8 Бесплатно (free)

Это небольшая статья для тех, кто хочет сам разрабатывать скрипты для нового Снегопата, или править сам движок Снегопата, или просто собирать модуль самостоятельно для внесения оперативных исправлений. В ней я расскажу, как установить и настроить всё необходимое для этого. Скрипты будем создавать на языке TypeScript, инфраструктура заточена именно под этот язык. Предполагается, что вы умеете пользоваться git’ом и настраивать переменные окружения.

26.07.2021    2496    orefkov    1    

Своя форма выбора типа, метаданных (Infostart Toolkit)

Инструментарий разработчика v8 1cv8.cf Россия Бесплатно (free)

Зачем своя форма выбора? Полезные функции и особенности работы.

26.07.2021    3549    Evg-Lylyk    17    

Infostart Toolkit – инструмент, в котором сделано то, что давно просят от 1С

Инструментарий разработчика v8 Бесплатно (free)

Лауреат Infostart Awards-2019, ведущий разработчик инструментов Infostart Toolkit Евгений Люлюк рассказывает о том, как развивается, какие задачи закрывает и какие проблемы решает представляемый им набор инструментов разработчика.

09.06.2021    7414    Evg-Lylyk    5    

Подсистема "COMExchange", консоль запросов, сервис обработки выборки запроса: корректируем регистры или «Берём банк, кассу, экспроприируем экспроприаторов». Промо

Инструментарий разработчика v8 1cv8.cf Россия Бесплатно (free)

На примере шуточного примера продемонстрированы не шуточные возможности консоли запросов в составе подсистемы "COMExchange" для работы с регистрами, подчинёнными регистратору («обнуление» регистров, ввод начальных итогов (сведений), корректировка итогов).

31.03.2013    23100    yuraos    7    

HTML таблица для начинающих

Инструментарий разработчика v8 Бесплатно (free)

Несколько примеров HTML таблиц со стилями и без. Хорошая замена отчетов на СКД.

02.06.2021    6749    dsdred    25    

Редактор кода, запроса, ... Infostart Toolkit (интеграция с MS Monaco)

Инструментарий разработчика v8 v8::УФ 1cv8.cf Бесплатно (free)

Контекстная подсказка, подцветка синтаксиса в тонком клиенте. В платформе 1С редактор кода на управляемых формах обладает нулевой функциональностью, интеграция с MS Monaco позволяет запустится просто в космос.

28.05.2021    6828    Evg-Lylyk    14    

re: Flowcon

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Flowcon возвращается.

28.04.2021    2682    1c-intelligence    26    

Скрипты для проекта Снегопат: автоматизация работы в Конфигураторе Промо

Инструментарий разработчика v8 1cv8.cf Россия Бесплатно (free)

Снегопат (http://snegopat.ru) – это проект по расширению возможностей конфигуратора 1С:Предприятия 8.2 как среды разработки прикладных решений. Для знакомых с ОпенКонфом, можно коротко сказать, что Снегопат – это ОпенКонф и Телепат, только для 1С:Предприятия 8.2 и уже на сегодня заметно круче :). Кроме специализированного функционала, который добавляется в Конфигуратор при использовании Снегопата, разработчики могут добавлять новый функционал самостоятельно, создавая свои собственные скрипты, автоматизирующие работу в Конфигураторе. Предлагаю вам обзор возможностей существующих на сегодня скриптов для Снегопата с короткими, но наглядными видеоиллюстрациями их работы.

16.01.2012    27591    kuntashov    42    

10 полезных, но малоизвестных возможностей IS Toolkit

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Будет полезно пользователям Toolkit, а также тем, кому интересны возможности данного инструмента.

23.04.2021    3585    Evg-Lylyk    0    

Редактор схемы компоновки для тонкого клиента

Инструментарий разработчика v8 Бесплатно (free)

Аналог платформенного конструктора схемы компоновки данных для работы в тонком клиенте. Входит в состав набора "Универсальные инструменты 1С"

08.03.2021    5500    cprit    28    

Структура запроса (Infostart Toolkit)

Инструментарий разработчика v8 v8::Запросы 1cv8.cf Бесплатно (free)

Описание механизма разбора запроса на части (дерево), используемого в IS Toolkit и Управляемой консоли отчетов

02.03.2021    3064    Evg-Lylyk    14    

Отладка логики запроса в консоли запросов ИР

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Облегчаем поиск причины неожиданного результата запроса в консоли запросов из подсистемы "Инструменты разработчика" (ИР)

05.01.2021    8022    tormozit    8    

Работа с СКД в продукте "Infostart Toolkit"

Инструментарий разработчика v8 v8::СКД Бесплатно (free)

Infostart Toolkit обладает большим количеством уникальных возможностей для работы с СКД – это анализ исполняемых текстов запросов, работа с внешними источниками в схеме СКД, получение данных в отладке и многое другое. Обо всех этих возможностях рассказал разработчик продукта Евгений Люлюк.

24.12.2020    3682    Evg-Lylyk    2    

Использование утилиты RING для проверки информации о программных лицензиях

Инструментарий разработчика v8 Бесплатно (free)

В 1С есть утилита для проверки файлов с лицензиями 1С. Утилита существует довольно давно, но информация по ней разбросана, малопонятна и много где устарела, поэтому опишу свой опыт установки утилиты и работы с ней. Работаем под Windows.

16.12.2020    27791    budidich    21    

Метаданные и их идентификаторы

Инструментарий разработчика v8 Бесплатно (free)

Идентификаторы (GUID'ы) метаданных конфигурации. Немного о том, как их получить.

05.12.2020    19073    YPermitin    28    

Отладка в Infostart Toolkit

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Отладка запросов, схем компоновки данных, просмотр содержимого менеджера временных таблиц.

05.11.2020    5318    Evg-Lylyk    16    

Настройка KDiff3 для исключения номеров строк в отчетах о сравнении конфигураций

Инструментарий разработчика v8 1cv8.cf Бесплатно (free)

Те, кто часто обновляют доработанные типовые конфигурации, а потом проверяют корректность обновления, сравнивая отчеты о сравнении конфигураций, знают, как мешают при этом строки вида "Объект присутствует только в первой|второй конфигурации: 99 - 99", "Изменено: 99 - 99".<br /> Но если вы, как и я, пользуетесь для этого утилитой KDiff3, то есть простой способ избавиться от таких строк.

21.09.2020    4487    fillin    9    

Пробуем Снегопат (устанавливаем и настраиваем полнофункциональную триальную версию)

Инструментарий разработчика v8 Бесплатно (free)

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

31.08.2020    12839    kuntashov    73    

paste1c.ru - сервис для обмена кодом для 1С:Предприятия

Инструментарий разработчика v8 Бесплатно (free)

Paste1C.ru - сервис для обмена кодом для 1С:Предприятия c подсветкой синтаксиса и подсказками.

21.08.2020    7299    salexdv    58    

Снегопат – Dev или Ops?

Инструментарий разработчика v8 Бесплатно (free)

Снегопат – программный комплекс, повышающий эффективность работы в конфигураторе 1С. О новом эволюционном этапе проекта, его возможностях и планах развития на митапе «DevOps в 1С» рассказал разработчик Снегопата, системный программист компании Инфостарт Александр Орефков.

17.08.2020    9003    orefkov    49    

Редактор HTML

Инструментарий разработчика v8 1cv8.cf Россия Бесплатно (free)

Инструмент из состава набора "Универсальные инструменты 1С" для быстрой адаптации html страниц для корректного отображения в Поле HTML документа

03.08.2020    4564    cprit    3    

Глобальное меню разработчика для управляемых форм

Инструментарий разработчика v8 v8::УФ 1cv8.cf Бесплатно (free)

Подсистема "Инструменты разработчика". Глобальное контекстное меню разработчика для управляемых форм в толстом клиенте.

03.08.2020    6528    tormozit    27    

Консоль кода и зачем она нужна

Инструментарий разработчика v8 Бесплатно (free)

Когда использовать, обзор консолей кода: плюсы - минусы.

27.07.2020    9109    Evg-Lylyk    50    

Обработка кодом результата запроса в Консоли запросов 9000

Инструментарий разработчика v8::Запросы Бесплатно (free)

Пять вариантов обработки кодом в консоли запросов 9000: простое выполнение, построчно без индикации, построчно с индикацией, простое в фоне, построчно в фоне с индикацией.

01.06.2020    3017    kuza2000    7    

Выявляем и оптимизируем ресурсоемкие запросы 1С:Предприятия

Инструментарий разработчика v8::Запросы Бесплатно (free)

Обычно предметом оптимизации являются заранее определенные ключевые операции, т.е. действия, время выполнения которых значимо для пользователей. Причиной недостаточно быстрого выполнения ключевых операций может быть неоптимальный код, неоптимальные запросы либо же проблемы параллельности. Если выясняется, что основная доля времени выполнения ключевой операции приходится на запросы, то осуществляется оптимизация этих запросов. При высоких нагрузках на сервер СУБД в оптимизации нуждаются и те запросы, которые потребляют наибольшие ресурсы. Такие запросы не обязательно связаны с ключевыми операциями и заранее неизвестны. Но их также легко выявить и определить контекст их выполнения, чтобы оптимизировать стандартными методами.

24.05.2020    13709    DataReducer    22    

Шпаргалка. Автоматическое тестирование внешних отчетов и обработок в нескольких информационных базах

Инструментарий разработчика v8 Бесплатно (free)

Используем Автоматизированное тестирование на практике. Простой код для обновления и запуска внешних отчетов и обработок в нескольких ИБ. Создаем рабочее решение с нуля.

02.05.2020    6289    pparshin    21