Книга знаний

1С:Предприятие / Приемы программирования / Внешние компоненты

Перехват 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 показывает возможность многопоточной работы. Для демонстрации, что поток работает, издает периодический звуковой сигнал.

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

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