Перехват API-вызовов и альтернативные плагины для 1С:ПредприятиеПлагины являются альтернативой внешним компонентам в специальных случаях, таких как исправление движка 1С:Предприятие (которое должно возыметь действие сразу во всех конфигурациях), перехват функций до загрузки MD (или подмену самого MD) и в других подобных ситуациях, когда обычные средства (внешние компоненты) не позволяют добиться требуемой функциональности. | | Автор статьи: romix | Редакторы: Последняя редакция №6 от 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 прошла успешно'.
Чтобы выгрузить плагин (отключить его от 1С), либо уберите строчку из INI, либо закомментируйте ее:
[Загрузка]
;LoadDll=Test\Test.dll
При следующем входе в 1С плагин загружен не будет (в этом можно удостовериться любым просмотрщиком процессов, например, плагином Process list, включенным в поставку Far Manager).
Символ ; является признаком начала комментария, и позволяет отключать временно неиспользуемые модули. Вы можете закомментировать вообще все - и получите функциональность исходной 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. Файл содержит предупреждение пользователю и количество секунд, в течение которых мигает это предупреждение в трее (см. образец файла 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).
Переименование HTM->XLS, которое также реализует этот плагин, позволяет решить многие проблемы с сохранением таблиц в Excel.
См. также:
Книга знаний: Исправление ошибки при экспорте в Excel (патчинг Moxel.dll)
Книга знаний: Сохранение данных MXL->XLS через HTML
Balloon
Заменяет диалоговые окна предупреждения, такие как "Недостаточно прав доступа!" и
"Реорганизация информации закончена!" на сообщения (tooltips) в трее.
См. файл ini, чтобы настроить такие сообщения.
Цель такой замены - избежать блокировок (если у пользователя высвечено "Недостаточно прав доступа!" при попытке провести документ, и он ушел обедать, то остальные не могут ничего провести в 1С).
При сохранении конфигурации сообщение "Реорганизация информации закончена!" блокирует вход пользователей в 1С, если обновление было оставлено на ночь. Кроме того, это предупреждение замедляет работу программиста в 1С, поэтому замена может оказаться более предпочительной альтернативой.
Test, TestThread
Простые (нексколько строк кода) плагины для тестирования работоспособности перехвата.
TestThread показывает возможность многопоточной работы. Для демонстрации, что поток работает, издает периодический звуковой сигнал.
|