Адрес этой странички : http://doc-prg.narod.ru/art_00071/art_00071.htm
Дата обновления : 24.01.2010
© 24.01.2010 Сергей Попов
Здесь следует отметить, что приведенная ниже статья носит чисто
иллюстративный характер и не претендует на бОльшее.
Для серьезной и углубленной проработки специальных вопросов информационного
обмена крайне рекомендуется использовать фирменное техническое описание системы
1Cv8.
1Cv8 + Delphi-5 .. 7.
OLE (COM).
Как "побороть" глюк в 1Cv80 ... 1Cv82, связанный с открытием форм в InProc COM-Server.
Статью в виде файла (1.45 Мб) можно скачать здесь: art_00071.zip
Как было показано в предыдущей
статье - 1Cv8 "криво" работает с формами,
открываемыми в контексте InProc COM-server.
Причина этого - неизвестна.
Может быть у программистов 1C была веская
причина для этого, а может быть просто
банальная ошибка в коде.
Но "гадай - не гадай", а работать надо.
Есть простой способ, позволяющий обойти эту проблему.
Идея заключается в том, что нужно создать простую внешнюю компоненту, которая будет содержать только один метод (Соединить), подгружающий OutProc-server (некий "стартер"), который (в свою очередь) подгружает в собственное адресное пространство "проблемный" InProc-server и возвращает соотв.ссылку во внешнюю компоненту.
Ниже - иллюстрирующие схемы :
Попробуем реализовать это на практике.
В качестве "проблемного" InProc-server
возьмем COM_InProc_d5 из предыдущей
статьи.
Ниже приведены "картинки", по-шагово иллюстрирующие этот процесс.
1. Создаем OutProc-server ("стартер") - COM_InProc_d5_Starter.exe
Сначала создадим обычное приложение :
Теперь "превратим" его в OutProc COM-server :
Доработаем следующим образом исходный текст, сгенерированный средой Delphi :
Чтобы наш
OutProc-server был доступен для других приложений
необходимо его зарегистрировать в Windows.
Для этого достаточно его один раз запустить,
как обычное приложение.
2. Теперь нужно создать простую внешнюю
компоненту для 1Cv8.
Этот вопрос детально рассмотрен в книге "Delphi и 1С:Предприятие. Программирование информационного обмена" и здесь.
Поэтому в данной статье углубляться в этом вопросе не буду.
Ниже представлен исходник реализации метода внешней компоненты Соединить() :
DLL-файл ( COM_InProc_d5_vk.dll ) внешней компоненты нужно разместить в том же каталоге ( ...\Bin\ ) , где находится исполняемый модуль программы 1Cv8.
3. Тестирование.
Для тестирования будем использовать
внешнюю обработку, созданную в контексте предыдущей
статьи.
Доработанный исходный текст которой
представлен ниже :
После того, как внешняя обработка будет открыта в режиме RealTime (), на экране появится окно нашего "стартера" (OutProc COM-server).
Теперь, при вызове метода ShowMyForm_2 (для этого нужно нажать на кнопку ShowMyForm_2 на форме внешней обработки), никаких проблем не возникает :
В результате "испытаний" данного способа был получен и еще один полезный побочный эффект.
А именно: можно легко передать в любой внешний (как OutProc, так и InProc) COM-объект (который не является внешней компонентой) ссылку на 1С !
В след. статье этот эффект будет рассмотрен подробно.
Все исходные тексты рассмотренного примера можно скачать здесь (416 Кб).
Статью в виде файла (1.45 Мб) можно скачать здесь: art_00071.zip
© 24.01.2010 Сергей Попов