Разработка скриптов (начинающим)
1. В первую очередь нужно изучить объектную модель Cнегопата.
Посмотри ссылку http://forum.script-coding.com/viewtopic.php?id=4481 там описаны способы, как можно посмотреть объектную модель - тебе нужно посмотреть COM-объект "Библиотека типов Снегопата" или тупо подключить файл snegopat.dll к одному из этих обозревателей.
2. Далее нужно понять, как это все работает в скриптах.
По умолчанию методы и свойства объекта designer являются глобальными, т.е. к ним можно обращаться напрямую, а ко всем остальным уже через их имена - например, коллекция аддинов addins или активное текстовое окно snegopat.activeTextWindow()
Создавайте файл с расширением .js или .vb В качестве его текста в любом редакторе(желательно редактор с поддержкой UTF-8) можно написать простейший код на JScript:
$engine JScript $uname HelloWorld $dname HelloWorld Message("Hello World") // метод designer.Message
или на VBScript:
$engine VBScript $uname HelloWorld $dname HelloWorld Message "Hello World" ' метод designer.Message
3. Созданный файл нужно закинуть в папку КореньСнегопатаСДллФайлом\scripts и прописать в файле КореньСнегопатаСДллФайлом\addins.ini по примеру
4. Далее можно перезагрузить Конфигуратор для загрузки скрипта, но лучше в окне Снегопата щелкнуть правой кнопкой на группе "Пользовательские аддины" и выбрать "Загрузить скрипт", выбрать файл скрипта, он загрузится и сразу же в окне сообщений Конфигуратора появится сообщение "Hello World"
5. В скриптах можно пользоваться штатными объектами 1С - ТаблицаЗначений, Массив, и многие другие с помощью команды v8New
- Для создания объектов 1С используйте код
таблица = v8New("ТаблицаЗначений")
- Для получения предопределенных значений 1С, используемых в различных методах 1С, используйте код типа
режим = v8New("ПеречислениеРежимДиалогаВыбораФайла").Открытие
- v8New - это полный аналог штатной команды 1С Новый(Тип)
- В качестве параметра-типа может выступать любая строка, получаемая из кода 1С "" + ТипЗнч(НужныйОбъект)
- Например, строку из сообщения
Сообщить("" + ТипЗнч(РежимДиалогаВыбораФайла));
6. Для открытия файла в Конфигураторе можно использовать аналог следующего кода (пример для JS)
textDoc = v8New("ТекстовыйДокумент") var file = v8New("Файл", filepath) if(file.Существует()){ textDoc.Прочитать(filepath) textDoc.Показать(filepath) }
или следущий прием
- использовать директиву \$addin stdlib в начале описания скриптов на отдельной строке
$engine JScript $uname HelloWorld $dname HelloWorld $addin stdlib
- само открытие файла производить командой
stdlib.openFileIn1C(путьФайла)
7. Для возможности использования глобальных функций/процедур 1С (ВвестиСтроку,ВвестиЧисло) можно использовать следующий прием:
использовать директиву \$addin global в начале описания скриптов на отдельной строке и добавить скрипт global в пространство скрипта, т.е. код типа
$engine JScript $uname HelloWorld $dname HelloWorld $addin global global.connectGlobals(SelfScript)
8. Для отладки скриптов можно использовать:
А. отладочную печать
- JS
Message(" varname <" + varname + ">")
- VB
Message " varname <" + varname + ">"
Б. Непосредственную отладку скрипта
- в JS нужно написать в тексте debugger
- в VB нужно написать stop
9. Для работы с текстом активного окна можно использовать библиотечный скрипт Libs\TextWindow.js Его краткое описание от автора
Тут возник вопрос по поводу открытия файлов в Конфигураторе.
В объектной модели снегопата этого нет. Однако, вспомнив, как я открывал ert-шки в Конфигураторе 7ки в опенконфе, решил тряхнуть стариной и провернуть такой же финт ушами.
А в опенконфе я их открывал просто - добавлял имя файла в начало MRU (это список недавно открываемых файлов, появляющийся в меню Файл) и посылал команду "Открыть нулевой файл из списка MRU".
После десяти минут проб и ошибок в JS-Immediate, все получилось.
Итак, по порядку
- Список MRU лежит (сюрприз!!!) в профайле 1С по пути (еще сюрприз!!!) - "App/MRUFileList"
- Этот список - обычный список значений, правда значения в нем не обычные.
- С помощью ЗначениеВСтрокуВнутр разобрался, что там лежит, а с помощью ЗначениеИзСтрокиВнутр - смог создать нужное мне значение.
- В этом значении главное - путь к файлу и какой-то гуид, очевидно обозначающий тип документа, который должен открывать этот файл. Для текстовых доков гуид прост - сплошные нули. Для других видов доков надо исследовать, перебирая значения из MRUFileList, и смотря на них через ЗначениеВСтрокуВнутр
- Далее просто впихнул свое значение в начало списка, сохранил весь список в профайл, и послал нужную команду.
Вот код:
// Подготовим наше значение для MRU - списка var pathToFile = "c:\\test\\snegopat\\core\\std\\scripts\\0_global_context.js" var docKind = '00000000-0000-0000-0000-000000000000' var mruItem = ЗначениеИзСтрокиВнутр('{"#",36973550-6bbb-11d5-bf72-0050bae2bc79,\n' + '{1,\n' + '{"file://' + pathToFile + '",0},' + docKind + '}\n' + '}') // Получим текущий список MRU из настроек var mru = profileRoot.getValue("App/MRUFileList") // Если там уже есть наше значение, удалим его var hasInMru = mru.НайтиПоЗначению(mruItem) if(hasInMru) mru.Удалить(hasInMru) // Если список полон, удалим последний элемент if(mru.Количество() == 8) mru.Удалить(7) // Вставим значение для нашего файла в начало списка mru.Вставить(0, mruItem) // Сохраним MRU-список обратно в настройки profileRoot.setValue("App/MRUFileList", mru) // И зашлем команду var cmd = addins.byUniqueName("stdcommands").object cmd.Frame.RecentFile.getState() cmd.Frame.RecentFile.send(0)
Вот так пытливый ум преодолевает преграды.
ЗЫ: Для просмотра MRU использовался следующий код:
var mru = profileRoot.getValue("App/MRUFileList") for(var i = new Enumerator(mru); !i.atEnd(); i.moveNext()) { Message("v=" + ЗначениеВСтрокуВнутр(i.item().Значение), mExc3) }В просмотре профайла мне помогло scripts\devtools\pflview.js