Перехват API-вызовов и альтернативные плагины для 1С:ПредприятиеПлагины являются альтернативой внешним компонентам в специальных случаях, таких как исправление движка 1С:Предприятие (которое должно возыметь действие сразу во всех конфигурациях), перехват функций до загрузки MD (или подмену самого MD) и в других подобных ситуациях, когда обычные средства (внешние компоненты) не позволяют добиться требуемой функциональности. | | Автор статьи: romix | Редакторы: Последняя редакция №9 от 14.11.13 | История URL: http://kb.mista.ru/article.php?id=277 | |
Ключевые слова: плагин, внешняя компонента, DLL, перехват
Адрес для скачивания:
http://x-romix.narod.ru/MD_CHANGER.7z
(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 (с которого я, собственно, начинал свою разработку) имеет очень простой код:
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С, если обновление было оставлено на ночь.
Есть и другие подобные ситуации - всплывающее сообщение во многих случаях - более выгодная альтернатива, которая не затрудняет пользователя или программиста необходимостью клацать по 500 раз в день на ОК, и не блокирует выполнение программы, когда требуется всего лишь выдать короткое информационное сообщение.
См. также Книга знаний: Перехват API-вызовов и альтернативные плагины для 1С:Предприятие
(внешняя компонента показывает всплывающие сообщения в трее).
Test, TestThread
Простые (нексколько строк кода) плагины для тестирования работоспособности перехвата.
TestThread показывает возможность многопоточной работы. Для демонстрации, что поток работает, издает периодический звуковой сигнал. |