Перехват API-вызовов и альтернативные плагины для 1С:ПредприятиеПлагины являются альтернативой внешним компонентам в специальных случаях, таких как исправление движка 1С:Предприятие (которое должно возыметь действие сразу во всех конфигурациях), перехват функций до загрузки MD (или подмену самого MD) и в других подобных ситуациях, когда обычные средства (внешние компоненты) не позволяют добиться требуемой функциональности. | | Автор статьи: romix | Редакторы: Последняя редакция №5 от 18.10.06 | История URL: http://kb.mista.ru/article.php?id=277 | |
Ключевые слова: плагин, внешняя компонента, DLL
Адрес для скачивания:
http://x-romix.narod.ru/MD_CHANGER.rar
(86К, скачивать левой кнопкой мыши)
Приведен исходный код (компилятор - Delphi 6).
Установка основного модуля перехвата
Для внедрение в адресное пространство процесса 1С:Предприятие я использую простую (даже намеренно упрощенную) DLL (Hook_1C.dll), которая подключается к 1С методом патчинга (подмены имени одной из библиотек (SHELL32.dll) в таблице импорта). Есть другие методы внедрения - этот мне показался самым простым и удобным, благо "перехватывать" требуется всего одну функцию (ShellExecuteA), которая благополучно перенаправляется в оригинальную SHELL32.dll.
Присоединившись таким образом к 1С, загрузчик Hook_1C.dll приступает к своей основной работе - читает свой ini-файл (Hook_1C.ini) и загружает указанные там DLL-плагины. Для удобства (чтобы не запутаться во множестве DLL), ini и плагины вынесены в папку Plugins.
Для экспериментов я рекомендую воспользоваться "отдельно стоящей" копией 1С, скопировать в нее patch_Hook_1C.exe и Hook_1C.dll, и запустить патчер patch_Hook_1C.exe. Внешне (и в работе 1С) ничего измениться не должно. Патчер напишет предупреждение, что патчинг прошел успешно, и оставит "после себя" резервную копию seven.dll.bak.
Чтобы полностью устранить все следы патча, скопируйте seven.dll.bak вместо измененной seven.dll, и изменения исчезнут.
После выполнения патча можно создавать папку Plugins, и поместить в нее наш первый тестовый плагин.
Test.dll (с которой я, собственно, начинал свою разработку) имеет очень простой код (Delphi 6, в других средах разработки все не менее просто):
Library Test;
uses Windows;
//////////////////////////////////////////////////////////
begin
MessageBox(0, 'Загрузка test.dll прошла успешно', 'Test', MB_ICONINFORMATION);
end.
Фактически, эта DLL всего лишь выводит окно предупреждения - чтобы показать нам, что мы на верном пути.
Одного помещения нашей DLL в папку c:\Program Files\1Cv77\BIN\Plugins мало - надо прописать ее в Hook_1C.ini. Это сделано для возможности оперативно отключать или заменять DLL на обновленные их версии, не выгоняя всех пользователей из 1С.
[Загрузка]
LoadDll=Test\Test.dll
Сам Hook_1C.ini должен быть расположен в подпапке 1Cv77\BIN\Plugins\.
Вы указываете путь Test.dll относительно 1Cv77\BIN\Plugins\. В данном примере, я положил Test.dll в подпапку Test (в подпапке они лежат сподручнее). Полный путь в нашем примере складывается, и получается что-то вроде c:\Program Files\1Cv77\BIN\Plugins\Test\Test.dll
Признаком успешной загрузки плагина будет появление окна предупреждения:
'Загрузка test.dll прошла успешно'.
Чтобы убрать предупреждение (рано или поздно оно вас достанет), либо уберите строчку из INI, либо закомментируйте ее:
[Загрузка]
;LoadDll=Test\Test.dll
Символ ; является признаком начала комментария, и позволяет отключать временно неиспользуемые модули, или расставлять ваши примечания (пояснения) по тексту INI. Вы можете закомментировать вообще все - и получите функциональность исходной 1С.
Ниже я привожу плагины, которые можно подключать к 1С таким способом.
MD_CHANGER
Плагин позволяет заменять конфигурацию без выхода всех пользователей из 1С.
Выйти и войти должны будут только те пользователи, которым нужны изменения.
В каталоге информационной базы, где вы хотите заменить конфигурацию, создайте папку MD_CHANGER.
В ней создайте файл md_changer.ini
Его структура:
[Настройки]
НоваяКонфигурация=New2
;ЗапретЗагрузки=Производится обновление конфигурации 1С. Пожалуйста, подождите до 14:00
Параметр НоваяКонфигурация - задает папку (относительно MD_CHANGER), где лежит обновленный 1cv7.md
Параметр ЗапретЗагрузки - это дополнительная (необязательная) возможность - позволяет установить запрет пользователям на вход в 1С.
Не рекомендуется держать каталог MD_CHANGER открытым на всеобщую запись.
Информационная база с "замененной" конфигурацией недоступна для входа в нее конфигуратором
(в случае конфигуратора задача для меня усложняется, и я решил не рисковать, и просто заблокировал вход под измененной конфой). Чтобы начать использовать конфигуратор, необходимо отключить замену в файле ini.
Принцип действия плагина - перехватить обращение системы к файлу MD (в режиме Предприятие оно производится один раз за сеанс). Я заменяю имя одного MD на другое - и - о чудо - можно заменять MD не выгоняя всех пользователей из 1С. Требуется попросить выйти и войти только тех пользователей, которым нужны изменения (этот режим работы был реализован в 1С:Предприятие 8.1).
MD_FREE
Плагин предназначен для принудительного завершения работы пользователей в 1С.
Чтобы завершить работу пользователей, необходимо создать в подпапке MD_FREE каталога информационной базы файл stop.ini. Файл содержит предупреждение пользователю и количество секунд, в течение которых мигает это предупреждение в трее. Завершение работы происходит "жестко" - если в это время велась какая-то работа, то она будет аварийно прекращена.
Sleep_DBF
Плагин предназначен для снижения нагрузки на сервер при ожидании блокировки.
25 релиз 1С:Предприятие для DBF.
Плагин перехватывает неудачную попытку заблокировать файл и вставляет паузу sleep.
Это позволяет разгрузить сервер (особенно терминальный) и дать пользователям возможность
нормально работать.
Это реализация в виде плагина той же функциональности, которую реализует внешняя компонента
Книга знаний: Исправление ошибки 1С:Предприятие 7.7/8.0 - 100% загрузка процессора при ожидании блокировки
Подробности см. в файле readme.txt
LOG_ERT
Плагин ведет журнал обращений к файлам ert (помогает выявить неиспользуемые или редко используемые внешние отчеты и обработки).
Журнал будет вестись в подкаталоге LOG_ERT информационной базы.
После установки плагина в данном каталоге будут появляться записи наподобие следующих:
05.10.2006 19:15:15; user=romix; comp=ROMIX;
Каждая запись находится в файле с именем файл.ert.log, который соответствует ert.
Все записи дополнены пробелами на длину 100 символов, поэтому по длине файла можно судить о количестве обращений к файлу ert.
plugin_mxl_doctor
Плагин лечит проблему с длительным сохранением длинных MXL-файлов в XLS.
Также позволяет очистить HTML от физического форматирования и поюзать CSS при сохранении MXL->HTML (это сделает более выразительным внешний вид HTML).
См. также:
Книга знаний: Исправление ошибки при экспорте в Excel (патчинг Moxel.dll)
Книга знаний: Сохранение данных MXL->XLS через HTML
Balloon
Заменяет диалоговые окна предупреждения, такие как "Недостаточно прав доступа!" и
"Реорганизация информации закончена!" на сообщения (tooltips) в трее.
См. файл ini, чтобы настроить такие сообщения.
Test, TestThread
Простые (нексколько строк кода) плагины для тестирования работоспособности перехвата.
TestThread показывает возможность многопоточной работы. Для демонстрации, что поток работает, издает периодический звуковой сигнал
|