COMNativeWrapper, COM-Диспетчер Native-компонент 1С (Аддонов), совместимый со всеми версиями 1С (7.7, 8.0, 8.1, 8.2, 8.3).
Обертка COM для компонент типа Native-Addin под разные версии 1С от 8.2 до 8.3 с поддержкой интерфейсов IMsgBox, IAttachInfo, IPlatformInfo. Поддержка свойств компонент имеющих тип Binary. Работает под любыми версиями 1С от 7.7 до 8.3. На платформах 8.3 пока гарантированно работает на последних версиях следующих релизов: 8.3.3-8.3.6 и 8.3.10-8.3.22.
Система: Win98, WinXP + Win81, Win10.
Архитектура: x86 + x64.
- Описание
- Подробнее
Описание
Область применения:
Предназначена для возможности подключения в виде COM-компоненты Native-компонент, разработанных для версий 1С 8.2 и 8.3, в том числе и последних релизов 8.3.22.*. Данную компоненту можно использовать в младших версиях 1С (7.7, 8.0, 8.1), в которых нет возможности работать с Native-компонентами, и в более поздних версиях 8.2 и 8.3 для целей тестирования. Полезна будет для тех организаций, которые до сих пор используют информационные базы старых версий, но хотели бы подключать современные компоненты и драйвера.
Технические требования:
- Версии и релизы 1С:
- 1С 7.7 — с ограничениями. На системе Windows 98 — только с помощью загруженного reg-файла, который прилагается можно только 1 компоненту загрузить на 1 процесс. На системе XP можно загрузить обычным способом несколько компонент, но имя класса будет предопределенное.
- 1С 8.0, 8.1, 8.2 — без ограничений
- 1С 8.3 — начиная с релиза 8.3.8.* можно только одну компоненту загрузить в одном процессе.
- Системы:
- Windows 98 — с ограничением (ранее упоминается)
- Windows XP (x86)
- Windows 2003 (x86)
- Windows 7, 8.1, 10 (x32|x64)
- Версии систем и приложений на которых проводилось тестирование диспетчера Аддонов:
- Windows 10 x64 — Релизы платформ версии 8.3: (6.2530, 10.2252, 11.3133, 12.1924, 13.1926, 14.2095, 15.2107, 16.1973, 17.2306, 18.1208, 19.1726, 20.2184, 21.1641, 22.1750)
- Windows 10 x86 — Релизы платформ версий 8.3: (3.721, 4.496, 5.1625, 6.2530, 7.2027, 8.2322, 10.2252, 11.3133, 12.1924, 13.1926, 14.2095, 15.2107, 16.1973, 17.2306, 18.1208, 19.1726, 20.2184, 21.1641, 22.1750).
- Windows 10 x86 — Релизы платформ других версий: (8.0.18, 8.1.15, 8.2.19.130)
- Windows 2003 x86 — Релизы следующих версий: (8.0.16, 8.1.15, 8.2.19.130, 8.3.9.1818, 8.3.10.2168) — Нет ограничений.
- Windows XP (SP2) — Релизы 1С 7.7.18 и 7.7.20.
- Windows 98 — Релизы 1С 7.7.18, 7.7.20.
Функциональные возможности:
- Весь функционал интерфейсов IComponentBase, включая IAddInDefBaseEx.
- Поддержка интерфейсов IMsgBox (Confirm, Alert), IAtachedInfo (GetAttachedInfo), IPlatformInfo (GetPlatformInfo). Для последнего есть возможность задать Версию совместимости, которая будет предоставлена объекту Native как Версия приложения, тем самым мы можем регулировать функциональность Native-компоненты, если она учитывает номер версии. По умолчанию возвращается номер полученной или вычисленной текущей версии приложения.
- Поддержка других методов, включая методы интерфейсов IAsyncEvent, IStatusLine, IError, ILocale, IUserInterfaceLanguage (для релизов 8.3.21+)
- Поддержка запуска компоненты для пользователей с ограниченными правами. Данная компонента позволяет загрузить себя, даже если у пользователя нет доступа к реестру базы COM. Гарантировано запускается на XP, Win2003, Windows 10. Предположительно и на промежуточных версиях тоже. Это позволяет обращаться с компонентой как с Native, за исключением, что только на стороне клиента.
- Поддержка записи и чтения свойств Native-компоненты, имеющих тип Binary (ДвоичныеДанные). Так как 1С не может передавать в COM-компоненту сами данные, есть возможность, она не запрещает делать эти попытки, компонента получит вместо данных, код ошибки 12. Чтобы решить эту проблему, мы можем зная имя свойства используя префикс base64, передать в компоненту данные в формате Base64. Например, заранее сконвертированное функцией 1С base64Строка() — содержимое объекта Двоичных данных. Аналогично, мы не можем получить из компоненты эти данные, вместо этого получаем код ошибки 1804, но используя тот же префикс, прочитываем содержимое в формате Base64.
- Поддержка создания определенного из нескольких типов объектов из одной компоненты Native. Мы знаем что Native-компоненты могут реализовывать несколько классов объектов, перед созданием объекта мы можем задать определенный класс, который хотим использовать для создания. Например:
- Объект реализует классы "NativeClass1|NativeClass2".
- По умолчанию, если мы не указали какой класс мы создаем, будет создан класс NativeClass1 под именем, которое задано в ресурсах файла библиотеки "WrapperNativeAddinExtension".
- Если мы хотим чтобы при вызове функции создания объекта фигурировало имя создаваемого класса или был создан 2-й класс, то нам надо перед выполнением метода "ЗагрузитьВнешнююКомпоненту" (именно этот метод рекомендуется использовать в версиях 1С 8.0-8.3), предварительно сохранить значение имени создаваемого класса в настройках: СохранитьЗначение("WrapperNativeAddinExtension","NativeClass1");
- Затем, как обычно загружаем компоненту указанным ранее методом.
- Поддержка множественного создания объектов одного класса, в x86 — При тестировании создавал по 3000 объектов, в x64 — более 10000 объектов с количеством свойств до 100 тысяч, для небольшого количества объектов. При этом все возможные утечки памяти в данном решении выявлены и устранены.
- Поддержка динамического изменения количества свойств в версии 8.3 начиная с релиза 5, где 1С кеширует количество свойств и не дает при выполнении метода "ЗаполнитьЗначенияСвойств" или в палитре свойств Отладчика — работать со всеми свойствами, что очень полезно при отладке — видеть всю палитру свойств, если исходная компонента его изменяет. Для того чтобы обновить палитру свойств, реализован метод ОбновитьКоличествоСвойств()/ResreshNProps(). Данный метод принудительно обновляет количество свойств для 1С, если текущий релиз 1С кеширует это количество у себя. Практика показывает, что начиная с версии 8.3.5.* приложение уже не обновляет автоматически палитру свойств объекта.
- Реализация интерфейса загрузки и сохранения Свойств интерфейса IPropertyProfile (Write,Save), может использоваться как для сохранения настроек при следующем запуске, так и для репликации основных свойств при создании новых объектов.
- Реализация явного уничтожения объекта для того чтобы не оставалось "мертвых" объектов и зависших приложений, после выхода из 1С. Эта особенность необходима, т.к. компонента COM, использует ряд интерфейсов, с помощью которых реализуется функционал диспетчера, то 1С не выгружает её автоматически, когда мы уничтожаем переменную, ссылающую на объект. Чтобы уничтожить объект и освободить память и ресурсы, нужно вызывать метод УничтожитьОбъект (DestroyObject). Метод освобождает все ресурсы и 1С освобождает память, связанную с объектом.
- Поддержка версий 7.7 для получения и установки свойств по имени. Версия 7.7 не может обращаться к свойствам объекта используя квадратные скобки, поэтому для расширения возможностей, были добавлены 2 метода Получить (Get) и Установить (Set)
- Возможность подставить Native-компоненте другую версию 1С. Диспетчер Аддонов автоматически определяет версию 1С и передает её исходной компоненте, но в некоторых случаях от того какая версия запущена, зависит функциональность этой компоненты. Диспетчер Аддонов имеет возможность запустить компоненту с требуемой функциональностью, подставив ей ту версию 1С, которую эта компонента ждет.
Состав поставки:
Файлы
Комплект поставки является набор из 4-х запакованных в единый архив (COMNativeWrapper.zip) файлов компонент для старой и новых версий Windows, под x86 и x64 архитектуры.
- COMNativeWrapper_XP.zip — файл компоненты для 32-х разрядных версий Windows, от версии Windows 98 до Windows 7
- COMNativeWrapper64_XP.zip — файл компоненты для 64-х разрядных версий Windows, от версии Windows XP до Windows 7
- COMNativeWrapper_Win81.zip — файл компоненты для 32-х разрядных версий Windows, от версии Windows 8.1 до Windows 10
- COMNativeWrapper64_Win81.zip — файл компоненты для 64-х разрядных версий Windows, от версии Windows 8.1 до Windows 10
- COMNativeWrapper_Win98.reg — reg файл для ручной регистрации компоненты COM в версии Windows 98/Me (путь к файлу dll требуется корректировать)
- Файлы с расширением MD5 — Хеш суммы исполняемых файлов для контроля что они не были изменены.
Доступность кода
Код полностью закрыт.
Демонстрация решения:
1. Имеем Native-компоненту под именем ExchangeStruc.dll.
Обработка уже умеет работать с этой компонентой в версиях 8.2 и 8.3, нам нужно чтобы работала в 8.0 или 8.1. Мы выбрали обертку под номером 2, нажали кнопку Подключить. После этого нам становятся доступны Методы
и свойства
Кнопка Создать структуру, меняет состав свойств и методов Native-компоненты.
. Обработка через обертку также реагирует на изменение состава свойств
и методов
Когда мы вернулись в предыдущее состояние, видим что появилось новое свойство, которого ранее не было "ГлавнаяСтруктура".
В версии 8.3 64-х системе, мы выбираем ту же компоненту, но под 64-бит.
После создания первого экземпляра объекта в окне свойств отладчика мы видим пустой список свойств.
После загрузки библиотеки Аддона, выгрузки и создания нового объекта мы в палитре свойств уже видим все свойства
Когда содержание количества свойств изменяется, мы также это видим в палитре свойств отладчика.
Руководство по использованию:
Существует некоторое отличие в порядке загрузки Аддона с подключением к Native библиотеке между версией 1С 7.7 и версий от 8.0 и старше.
- В версиях 1С 7.7 мы можем использовать только предопределенные имена классов, под которыми мы создаем объекты, не имеет значение как этот класс называется в исходном Аддоне, для 1С он будет создаваться под именем "" и производными от него именами с цифрой в конце. Это ограничение результат того, что для версий 7.7, не работает метод ВосстановитьЗначение (RestoreValue) через IDispatch приложения. Попытка его вызова приводит к вылетам. Вероятно баг 1С, никто его исправлять не будет. Поэтому мы либо создаем объект со стандартным именем диспетчера Аддона, и так и продолжаем работать, либо используя редактор ресурсов, мы правим имя класса объекта, для тех кто умеет, идентификатор строки ресурса, отвечающего за название класса "102". Имя класса всегда начинается с "WrapperNativeAddinExtension". Пример:
// Загрузка компоненты Диспетчера
ЗагрузитьВнешнююКомпоненту(ПутьККомпоненте);
// Создание объекта Диспетчера
COMАддон=СоздатьОбъект("WrapperNativeAddinExtension"); - Другие версии 1С от 8.0 корректно обрабатывают указанный выше метод через IDispatch. Поэтому можно не только создать объект с правильным именем, но и выбрать класс, с которым его создать. Перед первой загрузкой компоненты (выполнением функции ЗагрузитьВнешнююКомпоненту или ПодключитьВнешнююКомпоненту), требуется выполнить функцию "СохранитьЗначение" с именем значения "WrapperNativeAddinExtension", а само значение — название одного из классов в запускаемом Native-аддоне. Пример:
// Загрузка компоненты Диспетчера
СохранитьЗначение("WrapperNativeAddinExtension","ИмяКлассаNativeАддона");
ЗагрузитьВнешнююКомпоненту(ПутьККомпоненте);
// Создание объекта Диспетчера
COMАддон=Новый(ПутьККомпоненте);
// Выгрузка первого объекта для версий 8.3.5.*, чтобы могло обновляться количество свойств
COMАддон.УничтожитьОбъект();
// Создание рабочей версии объекта Диспетчера
COMАддон=Новый(ПутьККомпоненте); - Если Вам необходимо загрузить или несколько классов одного Аддона, или несколько разных Аддонов, то для каждого подключаемого класса, мы должны выделить отдельный файл Диспетчера. Имя Диспетчера на каждый класс должно быть уникально, первая часть имени "COMNativeWrapper" — неизменно, оставшаяся часть имени может быть дополнена числом от 2 до 15000 (более чем достаточно). Пример:
// Загрузка компоненты
СохранитьЗначение("WrapperNativeAddinExtension","ПервоеИмяКласса");
ЗагрузитьВнешнююКомпоненту("c:\drv\COMNativeWrapper.dll");
СохранитьЗначение("WrapperNativeAddinExtension","ВтороеИмяКласса");
ЗагрузитьВнешнююКомпоненту("c:\drv\COMNativeWrapper2.dll");
СохранитьЗначение("WrapperNativeAddinExtension","СотоеИмяКласса");
ЗагрузитьВнешнююКомпоненту("c:\drv\COMNativeWrapper100.dll");
Данная возможность не поддерживается системами Windows 98 (Me), в этих системах можно использовать только один класс Аддонов для каждого процесса.
Также эта возможность не доступна в платформах начиная с 8.3.8, в связи с механизмом защиты от опасных действий, который контролирует исполняемые файлы и определяет, что данный модуль уже загружен. Но там это не актуально, так как все возможности для использования Native аддонов там есть. - После того как мы загрузили компоненту Диспетчера, и создали первый объект, он у нас получается голый, без свойств и методов, кроме служебных методов самого диспетчера. Для подключения исходного Аддона используем функцию ЗагрузитьБиблиотекуАддона (LoadAddInLibrary). Перед её запуском определяем, под какой версией должен работать Аддон, если он требует для своей функциональности определенную версию платформы 1С, то мы можем подставить версию вторым параметром этой функцией. Либо выполнить явное назначение версии функцией УстановитьСовместимуюВерсию. Это должно быть сделано до подключения Native библиотеки. Пример:
- // Подстановка версии 1С, которая поддерживает формат ДвоичныеДанные заранее
УстановитьСовместимуюВерсию("8.3.10.2168");
COMАддон.ЗагрузитьБиблиотекуАддона("c:\drv\AddinNativeDRV.dll"); - // Подстановка версии 1С, которая поддерживает формат ДвоичныеДанные во время подключения Native-аддона
COMАддон.ЗагрузитьБиблиотекуАддона("c:\drv\AddinNativeDRV.dll","8.3.10.2168");
- // Подстановка версии 1С, которая поддерживает формат ДвоичныеДанные заранее
- Далее, можем пользоваться этим объектом*, можем создавать новые, если объект динамически меняет свои свойства, то начиная с версии 8.3.5 для каждого из них перед выполнением например метода ЗаполнитьЗначенияСвойств или использования палитры свойств в Отладчике, рекомендуется выполнять метод ОбновитьКоличествоСвойств(). Это позволит увидеть все свойства исходной Native-компоненты. (* За исключением первого объекта в указанных версиях 8.3.5+, в этих версиях первый объект следует уничтожить и создать новый, иначе не будет пересчитываться количество свойств).
- Диспетчер используем максимум доступных интерфейсов 1С через IDispatch для обслуживания Native-аддона, поэтому 1С самостоятельно никогда не выгрузит созданный объект, или несколько объектов из памяти, и не освободит ресурсы, поэтому перед каждым выходом из обработки и/или закрытием формы, мы должны явным образом уничтожить этот объект вызовом метода диспетчера УничтожитьОбъект().
На скриншотах пример работы с Native-компонентой "ExchangeStruc" собственного исполнения через диспетчер. Некоторые функции, как получение списка свойств и методов — это особенность самой компоненты, а не обертки. Публикация этой компоненты будет позже.
Список реализуемых служебных методов диспетчера:
- УстановитьСовместимуюВерсию (SetCompatibleVersion) — функция, предварительное назначение версии приложения 1С для загружаемого Аддона. Параметр: Версия, тип: строка. Возвращает предыдущую версию.
- ЗагрузитьБиблиотекуАддона (LoadAddinLibrary) — функция, загрузка файла Native-аддона. Возвращает результат выполнения (Булево или число 1/0 для 7.7) Параметры:
- Путь, тип: строка, путь к файлу Аддона (обязательный)
- Совместимая версия, тип: Строка, тоже что и в первом методе. (необязательный)
- УничтожитьОбъект (DestroyObject) — процедура, освободить ресурсы созданного объекта. Необходимая процедура для исключения зависания 1С в памяти после выхода из программы. Без параметров.
- ОбновитьКоличествоСвойств (RefreshnProps) — процедура, позволяет принудительно передать в 1С версий 8.3.5+ количество свойств при изменении состава свойств Аддоном. Без параметров.
- Получить (Get) — функция, предназначена для получения значения свойства по его имени, если в версии 1С не доступно получение значения по индексу [] (например: версия 1С 7.7). Параметр: ИмяСвойства, тип: строка. Возвращает значение свойства. Поддерживает префикс имени "base64" для получения в формате Base64 бинарного значения.
- Установить (Set) — процедура, предназначена для установки значения по его имени, если в версии 1С не доступно установка значения по индексу []. (например в версиях 1С 7.7). Параметры:
- ИмяСвойства — тип: строка, имя устанавливаемого свойства. Поддерживает префикс "base64" для передачи в Аддон бинарного значения, конвертируемого из формата Base64.
- Значение — тип: число, булево (кроме версий 7.7), строка, дата. Устанавливаемое значение.
Дополнительные тестовые и отладочные методы:
- Предупреждение (DoMessageBox) — процедура, аналогична вызову 1С для демонстрации работы метода Allert. Параметры:
- Текст — тип: строка.
- Таймаут — тип: число. Установка интервала в секундах. Необязательный. По умолчанию 30 сек.
- Вопрос (DoQueryBox) — функция, упрощенный вариант аналогичной функции из 1С с кнопками "Ок+Отмена", для демонстрации работы метода Confirm. Возвращает Булево или 1/0 для версий 1С 7.7, если нажата кнопка Ок. Параметры:
- Текст — тип: строка. Текст вопроса.
- Таймаут — тип: число. Установка интервала в секундах диалога. Необязательный. По умолчанию 30 сек.
- ТекущаяУниверсальнаяДатаВМиллисекундах (CurrentUniversalDateInMilliseconds) — функция, аналог функции 1С начиная с версии 8.2. Можно применять для младших версий. Без параметров. Возвращает целое число типа long.
- СлучайноеЧисло (RandomNumber) — функция, получает случайное число из передаваемого диапазона. Аналог одноименной функции в версиях 1С от 8.1. Возвращает целое число, от 1 до максимально заданного значения. Параметры:
- МинЗначение — тип: число (целое), минимальное значение диапазона.
- МаксЗначение — тип: число (целое), максимальное значение диапазона.
- ВывестиВСтрокуСостояния (ShowInStatusLine) — процедура с одним параметром для вывода в Статусе заданного значения через диспетчер. Аналог функции "Состояние" для демонстрации возможности. Параметр Текст — тип: строка, выводимый текст.
