Книга знаний

Рекламное место пустует
1С:Предприятие / Приемы программирования / OLE, COM

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

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2011 | Mista.ru

Яндекс.Метрика