Отримання інформації про експортні властивості і методи об'єктів 1с через com

Як з тіла COM-об'єкта або зовнішньої компоненти визначити склад властивостей і методів об'єктів 1С агрегатних типів? Всі відповіді тут.

Закладена ще в 7-й версії 1С: Підприємство можливість використання COM-об'єктів і підключення зовнішніх компонент, виконаних на мовах програмування, що підтримують роботу з COM, безсумнівно, виводила можливості платформи на якісно новий рівень. Ще б пак: і без того багаті можливості 1С розширювалися до неозорих меж. Після знайомства з цією можливістю навіть складалося враження, що в 1С можна зробити практично все.
Вихід системи 1С: Підприємство версії 8.х дещо знизив значимість зовнішніх компонент, так як основні функції вже були реалізовані на рівні платформи, наприклад, робота з XML, HTTP, ZIP, електронною поштою і т.д. Але і сама 1С вже перестала бути просто бухгалтерською програмою, а значить і далі розробники будуть за допомогою зовнішніх компонент розширювати її вже і так величезні можливості. Також досить часто зустрічаються схеми підключення до самої 1С за технологією COM з боку програм, розроблених на C / C ++, Delphi і т.д. тобто на мовах, що підтримують роботу з COM.

І в тому, і в іншому випадку 1С виступає в якості OLE сервера, а значить OLE клієнт часто відчуває необхідність в отриманні від сервера інформації про надані для використання клієнтом властивості і методи. Частково дана проблема може бути вирішена за допомогою використання метаданих, але як же отримати список, наприклад, експортних методів загального модуля? Або ви написали COM об'єкт, який при виклику своїх методів приймає від 1С параметри агрегатного типу, і Вам в тілі свого об'єкта потрібно визначити, що ж це Вам при виклику методу таке передали. Список підтримуваних властивостей і методів теж був би дуже доречним.

Для початку трохи лікнепу. З COM об'єктами 1С працює через інтерфейс IDispatch. Цей інтерфейс, в свою чергу, підтримується всіма об'єктами агрегатного типу системи 1С: Підприємство і дозволяє, крім іншого, отримувати детальну інформацію про методи об'єкта (властивості, методи, параметри методів і їх типи, типи значень, що повертаються і т.д.). Ось сигнатура його методів (тут і далі на прикладі Delphi):

Щоб перевірити існування будь-якого одиничного методу або властивості у COM-об'єкта, потрібно скористатися методом GetIDsOfNames. і зробити це приблизно ось так:

Для того, щоб COM об'єкт (далі "сервер") міг "розповісти" викликає стороні (далі "клієнт") про свої методи, необхідно, щоб при виклику методу GetTypeInfo він повертав покажчик на реалізований інтерфейс ITypeInfo. через який клієнт і отримує цю інформацію. Відзначимо, що це не є обов'язковим. У цьому випадку кожен раз при виклику клієнтом методу сервера на ім'я спочатку викликається метод GetIDsOfNames. який, в разі наявності потрібного методу, повертає його DispID. Після цього здійснюється виклик методу Invoke з отриманим DispID. У випадку з підтримкою ITypeInfo інформація про доступні методи і властивості запитується раз при ініціалізації об'єкта, і потім методи викликаються вже відразу по DispID.

Для отримання інформації про властивості і методи, використовуючи ITypeInfo. потрібно виконати приблизно такий код:

Аналіз об'єктів системи 1С: Підприємство версії 8.х показує, що далеко не для всіх об'єктів підтримується отримання інтерфейсу ITypeInfo. Зокрема, отримати його можна для об'єктів типу "СправочнікОб'ект", "ДокументОб'ект", "ОбработкаОб'ект" (але не "ВнешняяОбработкаОб'ект"), "РегістрХХХХХХХХХНаборЗапісей" і деякі інші.

Вихід в даній ситуації є, і він полягає в тому, що для своїх об'єктів 1С реалізувала підтримку інтерфейсу IDispatchEx. який також дозволяє отримувати інформацію про властивості і методи. Ось його опис:

Надана цим інтерфейсом інформація про методи об'єкта не така докладна, як при використанні ITypeInfo. але для нашої мети її цілком достатньо. Більш того: реалізація ITypeInfo в об'єктах системи 1С: Підприємство не дозволяє відрізнити процедуру від функції, а при використанні IDispatchEx це можливо. І головне: IDispatchEx реалізований для всіх агрегатних об'єктів (крім, на жаль, кореневого).

Таким чином, щоб отримати список властивостей і методів, використовуючи інтерфейс IDispatchEx. необхідно виконати приблизно такий код:

На практиці такий підхід може бути корисний, наприклад, в разі, якщо ви написали якийсь COM-об'єкт, який приймає в якості параметрів одінесовскіе об'єкти агрегатного типу. У моїй практиці був метод, який приймає як параметр або об'єкт типу "Картинка", або "ДвоічниеДанние", і кращого способу для того, щоб відрізнити в тілі COM-об'єкта одне від іншого я не знайшов.

Для демонстрації методу пропонується для скачування невелика утиліта, яка реалізує обидва методи отримання інформації про властивості і методи об'єктів (виконуваний файл + вихідний код (Delphi XE)).

Схожі статті