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К, качать левой кнопкой мыши)
  |