8.х ОБМЕН COM-интерфейсы объектов. Need help!

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем ikonovalov, 8 апр 2011.

  1. TopicStarter Overlay
    ikonovalov
    Offline

    ikonovalov

    Регистрация:
    25 янв 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Добрый день!
    Столкнулся с такой интересной задачкой. Все объекты, который доступны во внешнем соединении, предоставляют IDispatch интерфейс (ну и IUnknown конечно). Через dispatch я могу обращаться к свойствам и методам объектов, который заявлены в help-е. Тут все ОК. Но есть такая штука как "Для каждого … Из … Цикл" и перебор по индексу через квадратные скобки [...]. Как я понимаю они используют не IDispatch, а что-то еще.

    Вопрос: какой интерфейс они используют?

    Зачем это нужно: Берем объект "структура". У него есть Вставить (Insert), Количество (Count), Очистить (Clear), Свойство (Property), Удалить (Delete) и свойства обращения по имени ключа. Но что делать если имена ключей неизвестны и надо их перебрать? Вот тут, как я понимаю, и помогает "Для каждого … Из … Цикл"
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Ммм.. Ну как бы - если идет перебор, то должен использоваться интерфейс IEnumerable наверно. Если попробовать запросить его у объекта "структура" через метод IUnknown "QueryInterface()"?

    З.Ы. На самом деле я ооочень давно не возился ни с чем на таком низком уровне, поэтому извиняюсь, но реально не сталкивался и не знаю.
  3. TopicStarter Overlay
    ikonovalov
    Offline

    ikonovalov

    Регистрация:
    25 янв 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Да пробовал... IEnumerable == 496B0ABE-CDEE-11d3-88E8-00902754C43A. Говорит No such interface supported. [0x80004002]

    Может 1С как-то наследует его сверх этого?
  4. TopicStarter Overlay
    ikonovalov
    Offline

    ikonovalov

    Регистрация:
    25 янв 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Причем IDispatch и IUnknown нормально откликаются... :angry:
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Ну да... IEnumerable только в .net ведь вроде появился.

    Я не знаю.

    А какую задачу решаете? Может можно найти обходной путь?
  6. TopicStarter Overlay
    ikonovalov
    Offline

    ikonovalov

    Регистрация:
    25 янв 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Например есть "Структура", а не зная имен ключей ее нельзя обойти получается. А вообще в 1С встречался с объектами-коллекциями у которых вообще кроме обхода по циклу ничего толком и нет (например: РолиПользователя). Как с такими объектами работать через COM - неясно.
  7. TopicStarter Overlay
    ikonovalov
    Offline

    ikonovalov

    Регистрация:
    25 янв 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    В документации по 1С упоминается IEnumVARAINT, но как им пользоваться непонятно. На msdn нашел такую статью по имплементации этого интерфейса (http://msdn.microsoft.com/en-us/library/ms221354.aspx). Но свойства _NewEnum что-то не находится.
  8. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    :angry:
  9. TopicStarter Overlay
    ikonovalov
    Offline

    ikonovalov

    Регистрация:
    25 янв 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Ээээ... Посмотрел что в Enumvar.cpp. Там имплементация методов IEnumVARAINT. А мне бы получить этот объект от объекта 1С. Во как. Т.е. мне бы исходник или IDL объекта-коллекции 1С, хотя бы теже Массив и Структура.
  10. TopicStarter Overlay
    ikonovalov
    Offline

    ikonovalov

    Регистрация:
    25 янв 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Свершилось!! И так, как и обещала 1С ее объекты поддерживают IEnumVARAINT. Стандартный метод получения объекта энумератора это через проперти _NewEnum объекта-коллекции. (Объект-коллекция != энумератор). При доступе к полю _NewEnum через getIDsOfNames у IDispatch кидалась ошибка, что мол такого свойства нет. Но! По феншую Microsoft у этого поля фиксированный ID в IDispatch и оно равно '-4'. Так вот если обращаться к этому полю по ID, энумератор нормально возвращается.
  11. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Ну хорошо что получилось.

    У меня правда вызывает интерес - что же вы все-таки делаете. :angry:
  12. TopicStarter Overlay
    ikonovalov
    Offline

    ikonovalov

    Регистрация:
    25 янв 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Java API для 1С. О проекте можно почитать тут https://bitbucket.org/IgorKonovalov/octitbit/wiki/Home. Теперь вот разрешилась проблема с коллекциями, которые обходятся только по "Для каждого. Скоро будут обновления )))
  13. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
  14. TopicStarter Overlay
    ikonovalov
    Offline

    ikonovalov

    Регистрация:
    25 янв 2011
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Спасибо за помощь!! и за выделенную тему отдельно! ))

Поделиться этой страницей