OpenConf: пишем скрипты для конфигуратора 1С 7.7 (статья)Плагин OpenConf позволяет "прицепить" к конфигуратору 1С:Предприятие 7.7 дополнительные (и, порой, очень полезные) "навесные орудия": DLL- плагины и VBS- или JS-скрипты. Статья описывает приемы разработки и использования таких скриптов: от изменения заголовка окна и горячих клавиш (например, поиск по Ctrl-F) до оптимизации работы с плагинами TurboMD и Intellisence. | | Автор статьи: romix | Редакторы: Волшебник Последняя редакция №4 от 16.02.06 | История URL: http://kb.mista.ru/article.php?id=54 | |
Ключевые слова: OpenConf, Telepat, orefkov, Орефков, TurboMD, Intellisence
Установка OpenConf (1.0.2.0)
Минимальные действия по установке OpenConf – заместить оригинальную config.dll из папки 1cv77\BIN на одноименную DLL из комплекта OpenConf, предварительно скопировав оригинальную DLL в подпапку BIN\CONFIG (в папку BIN же следует положить файл config.tlb - подробности см. в инструкции по установке).
После этого можно узреть в конфигураторе новые пункты меню и развлекаться со скриптами, чем мы сейчас и займемся.
Простейший скрипт: изменяем заголовок окна
В папке BIN\CONFIG\SCRIPTS (если папки нет, то ее необходимо создать) создайте файл с расширением vbs (например, ЗаголовокКонфигурации.vbs) с текстом:
Windows.MainWnd.Caption = IBDir
После закрытия и открытия конфигуратора 1С заголовок окна конфигуратора будет содержать полный путь к информационной базе, что, на мой взгляд, очень удобно, когда в текущем пользовательском сеансе открыто несколько конфигураторов.
Поиск по Ctrl-F
Создадим в каталоге SCRIPTS файл Клавиатура.vbs (или файл с другим именем и расширением .vbs) со следующим содержанием:
function CtrlF()' Поиск
Set wsh = CreateObject("wScript.Shell")
wsh.SendKeys("^{F3}")
end function
Sub CtrlH() 'Поиск с заменой
Set wsh = CreateObject("wScript.Shell")
wsh.SendKeys("^+{F3}")
End Sub
Затем зайдем в меню OpenConf – Макросы – Клавиатура и зададим соответствие между макросами CtrlF и CtrlH (можно назвать их и по другому) и соответствующими клавиатурными сочетаниями. Эти соответствия хранятся в пользовательской ветке реестра (HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\OpenConf\HotKeys), поэтому при входе других пользователей в систему Windows потребуется заново выполнить в конфигураторе соответствующую пользовательскую установку (либо воспользоваться скриптом, чтобы записать в реестр нужные значения автоматически).
В данном примере, мы имитируем нажатие Ctrl-F3 и Ctrl-Shift-F3 (значки ^ + и % означают соответственно Ctrl, Shift и Alt). Теперь клавиатурные сочетания стали стандартными, и на душе становится заметно радостнее и веселее. Но и это еще не все.
Запуск 1С в режиме «Предприятие» по клавише F5
Вместо клавиши F11 для запуска 1С в режиме «Предприятие» можно использовать клавишу F5 (принятую в 1С 8.0), если создать (и прописать в настройке горячих клавиш OpenConf) следующий макрос:
Sub F5()
'Команда "открыть в предприятии" (F11)
SendCommand(33876)
End Sub
Этот макрос необходимо записать в текстовом файле с расширением vbs, и точно так же, как и предыдущие скрипты, сохранить этот файл в папку BIN\CONFIG\SCRIPTS.
Однако, этот макрос не делает важной вещи, которая показалась мне очень удобной в 1С 8.0 – не закрывает запущенного из конфигуратора сеанса 1С:Предприятие. Сделаем это:
'//////////////////////////////////////////////////////////////////////
Sub F5()
On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
message Err.Number & ": " & Err.Description
End If
'Исследуем все запущенные процессы на локальном компьютере
For Each objProc In objService.ExecQuery("SELECT * FROM Win32_Process")
'Получаем командную строку процесса
str = objProc.CommandLine
'Ищем в командной строке подстроку "*\1Cv77\BIN\1cv7*"
If InStr(1, str, "\1Cv77\BIN\1cv7") > 0 Then
'Ищем там же подстроку " ENTERPRISE /M "
'(монопольный режим запуска 1С)
If InStr(1, str, " ENTERPRISE /M ") >0 Then
'Ищем там же ключ /D"Имя каталога базы"
If InStr(1, str, "/D""" & IBDir & """") > 0 Then
'Нашли нужный процесс.
If MsgBox("Закрыть процесс 1С:Предприятие?", vbQuestion + vbYesNo, IBDir) = vbYes Then
'Завершаем процесс
objProc.Terminate
'Удаляем 1SUSERS.DBF, чтобы 1С не спрашивала про переиндексацию
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.DeleteFile IBDir & "1SUSERS.DBF", 0
End If
End If
End If
End If
Next
'Команда "открыть в предприятии" (F11)
SendCommand(33876)
End Sub
В данном макросе реализован «жесткий» режим закрытия «1С:Предприятие» - метод – терминатор Terminate. Для более «мягкого» закрытия вы можете поэкспериментировать, например, с активизацией окна: AppActivate(objProc.ProcID) и имитацией нажатия клавиш Alt-F4: SendKeys("%{F4}"), или придумать что-то еще (я поэкспериментировал, но мне не понравилось, т.к. нажатия Alt-F4 не всегда передаются тому окну, которому нужно, и иногда попадают в конфигуратор :-) ). Возможно, «в следующей жизни» это будет «добрый терминатор» - внешнее приложение, реализующее данные действия средствами Windows API, и «нажимающее на клавиши» вместо простого «убийства» приложения 1С (с лязганьем затвора шотгана и звуком сервоприводов машины-убийцы).
Отключаем ненужные предупреждения
При сохранении конфигурации, система 1С:Предприятие выдает большое количество окон с вопросами наподобие «Вы действительно нажали кнопку сохранить?», «Вы действительно сохраняете, или, может быть, передумаете?», «Может, все-таки не стоит?» и т.п. И последнее, самое коронное сообщение (которое утром мешает пользователям войти в 1С) - "Реорганизация информации закончена!". Каждое из этих окон приходится закрывать нажатием ОК, причем, ждать между нажатиями ОК порой очень долго. А иногда так хочется, запустив обновление конфигурации, пораньше уйти домой …
Чтобы отключить некоторые (или все) предупреждения, создайте в папке Scripts скрипт (с расширением vbs), образец которого показан ниже:
Dim ask
ask=0 'Отключаем вопрос о сохранении метаданных по умолчанию
'///////////////////////////////////////////////////////////////
Sub Configurator_OnMsgBox(Text, Style, DefAnswer, Answer)
'Text = LCase(Text)
'Message Text, mExclamation
If InStr(Text, "Сохранить изменения?") <> 0 Then
Answer=DefAnswer
End If
If InStr(Text, "Реорганизация информации закончена!") <> 0 Then
Answer=DefAnswer
ask=0
End If
If ask<>1 Then
If InStr(Text, "Выполнить сохранение метаданных?") <> 0 Then
Answer=DefAnswer
End If
End If
If InStr(Text, "Реорганизация данных не выполнена") <> 0 Then
ask=1' Включаем вопрос, чтобы была возможность закрыть конфу без сохранения
End If
End Sub
'Гасит окно с предупреждением о реорганизации информации
'///////////////////////////////////////////////////////////////
Sub Configurator_OnDoModal(Hwnd, Caption, Answer)
If Caption = "Реорганизация информации" then
Answer = mbaOK
End If
End Sub
В данном примере, я использую возможности OpenConf по перехвату предупреждений и модальных окон. При неудачном сохранении (например, при попытке удаления документов, где есть движения), чтобы не входить в бесконечный цикл, я снова включаю вопрос о сохранении, чтобы можно было отказаться от неудачно внесенных изменений.
TurboMD –обновление программных модулей и форм без закрытия сеанса 1С
В отличие от #ЗагрузитьИзФайла, не нужно явно работать с текстовыми файлами (выгрузка в текстовички происходит по нажатию горячих клавиш), и ничто не мешает отладчику и синтаксической проверке модулей. Кроме того, имеется возможность сохранять описания форм (например, передвигать по форме кнопки, назначать им новый обработчик события и т.д.), не требуя выхода пользователей (или самого себя, как пользователя) из 1С. А также выхода пользователей из себя, когда их просят закрыть 1С. Таким образом, никто не из кого не выходит, и все просто, удобно и «прозрачно».
Чтобы установить TurboMD (при установленном OpenConf)
- Скопируйте TurboMD.dll в папку BIN
- Скопируйте TurboMD.vbs в папку BIN\CONFIG\SCRIPTS
- Пропишите горячую клавишу F2 (или любую другую) для макроса TurboMD::UnloadCurrentWnd в меню OpenConf – Макросы - Клавиатура.
- В глобальном модуле конфигурации, в процедуре ПриНачалеРаботыСистемы, впишите строку ЗагрузитьВнешнююКомпоненту(«TurboMD.dll»);
После этого можно наслаждаться жизнью. Не правда ли, красиво – жму F2, и программный модуль (вместе с формой) оказывается сохраненным, и остается только закрыть и открыть документ, справочник или отчет, чтобы изменения вступили в силу. Единственным минусом TurboMD (имеющейся у меня версии) можно считать невозможность сохранения таблиц, но их всегда можно программно «зацепить» из внешних файлов MXL.
Затачиваем TurboMD.vbs «под себя»
Логика работы TurboMD в режиме конфигуратора реализована на языке VBScript, что дает возможность его пользовательской (точнее, программерской) настройки.
Первое, что я сделал – удалил «лишние» сообщения (выгружать форму, выгружать модуль, обновлять prm, оставив только одно общее сообщение). Добавил недостающее сообщение (выгружать ли модуль проведения).
Второе – при записи конфигурации реализовал удаление (точнее, переименование) prm, чтобы устаревшие (относительно конфигурации) текстовички «не путались под ногами».
Также сделал автоматическую загрузку txt в MD, если prm еще жив, при открытии конфигурации. Это позволяет не задумываться над версиями изменений в txt и в MD – и в режиме исполнения, и в режиме конфигурирования всегда будет наиболее свежая версия текстовых модулей и форм.
Вы можете воспользоваться моим файлом TurboMD_romix.vbs как образчиком указанных выше изменений, или придумать что-то свое.
http://x-romix.narod.ru/OpenConfScripts_romix.zip (размер - 5К, качать левой кнопкой мыши).
Telepat.dll / Intellisence.vbs
Эти разработки поддерживают технологию автозавершения кода и позволяют, по нажатию точки (или Ctrl-Пробел), видеть список доступных свойств, методов и реквизитов прикладных объектов.
Дополнительная и очень полезная возможность – переходить по нажатию Ctrl-Enter на описание процедуры или функции, имя которой находится под курсором, а также переходить обратно по Ctrl-Shift-Enter (данная возможность, на другом сочетании клавиш, есть в 1С:Предприятии 8.0).
Обработка выбора «после точки» в Intellisence сделана настолько хорошо (возможно, что даже «предельно хорошо»), что новейшие среды разработки от Microsoft или 1С (8.0) кажутся несколько устаревшими и старомодными (как старинный комод).
Оптимизация работы с Intellisence
При вводе первых нескольких символов выпадающий список сокращается. Однако, всякий раз он может содержать несколько десятков позиций. Чтобы сократить список и сделать так, чтобы он содержал только строго определенную информацию, попробуйте использовать префиксы, указывающие на область видимости тех или иных имен, например:
гл_ - имя из глобального модуля, объявленное с ключевым словом Экспорт
г_ глобальная переменная текущего модуля
прм_ - параметр процедуры или функции
ф_ - реквизит формы
т_ - реквизит для вывода в печатную форму
Это позволит, с одной стороны, видеть контекст тех или иных имен (откуда они взялись, и что собой представляют), а с другой – сократить выпадающий список при вводе нескольких первых символов имени, и увидеть (просмотреть) другие имена, которые находятся в этом же контексте.
Разделение контекстов можно расширить и на реквизиты метаданных. Предположим, что вы пишете
док=СоздатьОбъект(«Документ.РасхНакл»);
док.|
Выпадает длинный список свойств, методов и реквизитов документа. Иногда нужно выбрать из этого списка свойства и методы прикладного объекта, а иногда – его реквизиты.
К сожалению, в программном контексте 1С:Предприятие они находятся «в одной большой общей корзине», поэтому «отделить зерна от плевел» можно, назначив префикс у всех реквизитов объекта: например, «р_». Это несколько утомительно, и никто (особенно, в типовых конфигурациях) так не делает, но, как вариант, это вполне облегчает работу с Intellisence.
Трюк с разделением контекстов вполне применим и в других средах разработки – не только 1С:Предприятие. Другой трюк – с указанием типа переменной при помощи префикса, описывающего тип данных («венгерская нотация») – широко применяется в кругах Windows-программистов, и помогает ориентироваться во множестве разнотипных имен.
В случае 1С префиксы, описывающие тип, могут выглядеть, к примеру, так: докИмяДокумента, тзИмяТаблицыЗначений и т.п. Можно смешивать две системы назначения префикса и писать, например, ф_тз (таблица значений на форме) или прм_докНакладная (ссылка на документ, переданная в качестве параметра процедуры или функции).
Однако, для локальных переменных я использую (и всем советую использовать) короткие имена, состоящие, по возможности, из одного только префикса: док, тз, ч, стр (это улучшает читаемость кода, и соответствует древней математической и «фортрановской» традиции называть локальные переменные однобуквенными: например, i,j,k или же максимально короткими именами).
Заключение
Эксперименты со скриптами для автоматизации действий в конфигураторе доставляют большое удовольствие – типичные задачи делаются быстрее и проще, сочетания клавиш стали стандартными, а заголовок окна конфигуратора – «правильным». Возможно, идея такого улучшения среды разработки не нова, но она выглядит очень ценной и заманчивой.
Попытка перехода на 8-ку наталкивается даже на некоторое ухудшение интерфейса (особенно, в части Intellisence). Скриптинг никогда не вредил продуктам Microsoft – может быть, он не повредит и новым продуктам 1С. Тем более что есть разработчики, которые готовы внедрять его даже по несколько более трудоемкой технологии, чем это делается обычно – не видя исходного кода. Интересно, что думает по этому поводу фирма 1С, и готова ли она поддерживать подобные начинания (и подобных разработчиков), или же усматривает в их действиях, скорее, аналогию с «незаметно подкравшимся пушным зверем» (наподобие песца или выхухоля)? В любом случае, разработка выглядит намного более достойной, чем это может показаться «со стороны», до практического ознакомления с ней, и заметно облегчает жизнь программистам 1С:Предприятие версии 7.7.
Ссылки
http://openconf.itland.ru/beta/
http://www.script-coding.info/
http://kuntashov.narod.ru/openconf-installer.html
Опенконф/Телепат2/Интеллисенс и др. скрипты (продолжим 17?)
Примеры скриптов, приведенные в статье:
http://x-romix.narod.ru/OpenConfScripts_romix.zip
(размер - 5К, качать левой кнопкой мыши)
|