|   |   | 
| 
 | Com + C# + Перечисления | ☑ | ||
|---|---|---|---|---|
| 0
    
        MAKK 16.09.11✎ 19:28 | 
        Доброго времени суток, 
  Понадобилось мне в программе на С# через COM-соединение извлечь данные из 1С. И все шло хорошо, пока я не столкнулся с перечислениями, а точнее с получением вида операции платежного поручения. <pre> COMConnector comConnector = new COMConnector(); dynamic connection= = comConnector.Connect(Settings.connectionString); dynamic orders = connection.Документы.ПлатежноеПоручениеВходящее.Выбрать(); while ((bool)orders.Следующий()) { // и вот тут мне нудно вытащить или название или хотя бы индекс Вида //операции. orders.ВидОперации() в данном случае является Com объектом //и достать из него что-либо никак не получается. } </pre> Буду рад любой помощи. | |||
| 1
    
        Alexandr Puzakov 16.09.11✎ 19:32 | 
        orders.Операция?     | |||
| 2
    
        Alexandr Puzakov 16.09.11✎ 19:34 | 
        if (orders.Операция = connection.Перечисления.НужноеПеречисление.НужноеЗначение)
  ? | |||
| 3
    
        Steel_Wheel 16.09.11✎ 19:35 | 
        на rsdn тебе дорога, там тебя поймут и обогреют     | |||
| 4
    
        MAKK 16.09.11✎ 19:39 | 
        'System.__ComObject' does not contain a definition for 'Операция'     | |||
| 5
    
        Steel_Wheel 16.09.11✎ 19:44 | 
        Юзай
  connection.CreateObject("Enumeration.MyEnumeraion.MyValue") | |||
| 6
    
        Steel_Wheel 16.09.11✎ 19:46 | 
        Вместо Enumeration можно Перечисление написать     | |||
| 7
    
        MAKK 16.09.11✎ 19:47 | 
        >>Юзай
  >>connection.CreateObject("Enumeration.MyEnumeraion.MyValue") Прошу прощения но не совсем понял хода вашей мысли. На сколько я понимаю данный метод создаст мне обьект значения перечисления. А мне нужно достать значение уже существующего обьекта | |||
| 8
    
        Steel_Wheel 16.09.11✎ 19:50 | 
        (7) Через COM можно передать только объекты примитивных типов. Чтобы выбрать индекс, можно сравнить с новым объектом нужного типа, а затем передать предопределенную строку в COM-приемник     | |||
| 9
    
        Steel_Wheel 16.09.11✎ 19:52 | 
        Еще можно попробовать использовать метод/свойство "Метаданные" объекта orders.ВидОперации() -- есть такие метаданные, которые выдают описания в виде примитивных типов (строковом)     | |||
| 10
    
        MAKK 16.09.11✎ 19:52 | 
        Сравнить то можно только как?     | |||
| 11
    
        Steel_Wheel 16.09.11✎ 19:52 | 
        orders.ВидОперации() == connection.CreateObject("Enumeration.MyEnumeraion.MyValue") ?     | |||
| 12
    
        MAKK 16.09.11✎ 19:53 | 
        if(connection.Перечисления.ВидыОперацийППИсходящее.ОплатаПоставщику == orders.ВидОперации)
  Вот такое условие не срабатывает | |||
| 13
    
        Steel_Wheel 16.09.11✎ 19:53 | 
        CreateObject забыл     | |||
| 14
    
        Steel_Wheel 16.09.11✎ 19:53 | 
        в то-то и затык, что его создать надо     | |||
| 15
    
        Steel_Wheel 16.09.11✎ 19:57 | 
        точнее NewObject     | |||
| 16
    
        MAKK 16.09.11✎ 19:57 | 
        'System.__ComObject' does not contain a definition for 'CreateObject'     | |||
| 17
    
        Steel_Wheel 16.09.11✎ 19:57 | 
        попробуй (15)     | |||
| 18
    
        MAKK 16.09.11✎ 19:59 | 
        if (connection.NewObject("Перечисления.ВидыОперацийППИсходящее.ОплатаПоставщику") == orders.ВидОперации)
  Выдает ошибку (на все ошибки 1с он выдает одно и тоже сообщение, так что уточнить какая именно ошибка не могу) | |||
| 19
    
        Steel_Wheel 16.09.11✎ 20:02 | 
        orders.ВидОперации.Метаданные().Имя -- глянь в отладчике, выводит что-либо?     | |||
| 20
    
        MAKK 16.09.11✎ 20:06 | 
        ВидыОперацийППИсходящее     | |||
| 21
    
        Steel_Wheel 16.09.11✎ 20:13 | 
        Пробуй
  Foreach item in orders.ВидОперации.Метаданные().ЗначенияПеречисления { if orders.ВидОперации == item.Синоним { return item.Имя } } | |||
| 22
    
        Steel_Wheel 16.09.11✎ 20:14 | 
        orders.ВидОперации под TrimAll взять в connection     | |||
| 23
    
        Steel_Wheel 16.09.11✎ 20:16 | 
        чтобы строка "Оплата покупателя" была     | |||
| 24
    
        MAKK 16.09.11✎ 20:20 | 
        Так не получится. item.Синоним это строка а orders.ВидОперации это ComObject
  Трим нельзя использовать по той же причине | |||
| 25
    
        Steel_Wheel 16.09.11✎ 20:23 | 
        (24) Погоди, тебе нужен trim одинэсовский. Он возвращает строковое представление объекта, которое можно сравнивать со свойством "синоним". Как сделать trim одинэсовский? Может, через 
  connection.Выполнить("СокрЛП(""orders.ВидОперации"")")? | |||
| 26
    
        Steel_Wheel 16.09.11✎ 20:26 | 
        а может, просто connection.СокрЛП() пойде     | |||
| 27
    
        MAKK 16.09.11✎ 20:28 | 
        ни СокрЛП()ни Выполнить у connection нету     | |||
| 28
    
        Steel_Wheel 16.09.11✎ 20:30 | 
        так, к 1С доступ на изменение конфы есть?     | |||
| 29
    
        Steel_Wheel 16.09.11✎ 20:30 | 
        А Execute() или TrimAll() есть у connection     | |||
| 30
    
        MAKK 16.09.11✎ 20:33 | 
        dynamic query = connection.NewObject("Запрос");
  query.Текст = "СокрЛП(" + orders.ВидОперации + ")"; dynamic e = query.Выполнить(); может как-то так? В палне что это конечно не правильно написано но может подобным образом сформирвать запрос? | |||
| 31
    
        MAKK 16.09.11✎ 20:35 | 
        >>>А Execute() или TrimAll() есть у connection
  нет ни того ни другого | |||
| 32
    
        MAKK 16.09.11✎ 20:36 | 
        >>так, к 1С доступ на изменение конфы есть?
  будем считать что нет | |||
| 33
    
        Steel_Wheel 16.09.11✎ 20:38 | 
        (30) 
  query.Текст = "Выбрать НужныйДокумент.ВидОперации.Представление Как стрПредставление Из Документы.ТвойТипДокумента КАК НужныйДокумент Где Документы.ТвойТипДокумента.Ссылка = &СсылкаНаОбъект"; query.УстановитьПараметр("СсылкаНаОбъект", orders.Ссылка); dynamic e = query.Выполнить(); | |||
| 34
    
        Steel_Wheel 16.09.11✎ 20:39 | 
        (32) Плохо, можно кастомные функции прописывать в конфигураторе для внешнего соединения. Там СокрЛП прописали бы     | |||
| 35
    
        MAKK 16.09.11✎ 20:49 | 
        Так запрос написать не получается...по крайней мере если в cтроку запроса просто вставить orders вместо НужныйДокумент     | |||
| 36
    
        Steel_Wheel 16.09.11✎ 20:53 | 
        Вместо НужныйДокумент можно Документы.ТвойТипДокумента вставлять     | |||
| 37
    
        MAKK 16.09.11✎ 20:54 | 
        >>>(32) Плохо, можно кастомные функции прописывать в конфигураторе для внешнего соединения. Там СокрЛП прописали бы
  Но ведь при обновлении конфикугации этот метод все-равно ведь слетит? | |||
| 38
    
        Steel_Wheel 16.09.11✎ 20:55 | 
        (37) Дело в том, что Модуль внешнего соединения обычно пуст в любой конфигурации, в крайнем случае, галочку напротив него при обновлении можно не ставить     | |||
| 39
    
        MAKK 16.09.11✎ 20:57 | 
        dynamic query = connection.NewObject("Запрос");
  query.Текст = "Выбрать Документы.ПлатежноеПоручениеИсходящее.ВидОперации.Представление Как стрПредставление Из Документы.ПлатежноеПоручениеИсходящее КАК Документы.ПлатежноеПоручениеИсходящее Где Документы.ПлатежноеПоручениеИсходящее.Ссылка = &СсылкаНаОбъект "; query.УстановитьПараметр("СсылкаНаОбъект", orders.Ссылка); dynamic e = query.Выполнить(); Вот это не работает. Я все правильно написал? | |||
| 40
    
        Steel_Wheel 16.09.11✎ 21:01 | 
        (39) Я ошибся: для перечислений свойство "Представление" не определено
  Зато это попробуй: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПРЕДСТАВЛЕНИЕ(ПлатежноеПоручениеИсходящее.ВидОперации) КАК стрПредставление |ИЗ | Документ.ПлатежноеПоручениеИсходящее КАК ПлатежноеПоручениеИсходящее |ГДЕ | ПлатежноеПоручениеИсходящее.Ссылка = &СсылкаНаДокумент" | |||
| 41
    
        MAKK 16.09.11✎ 21:04 | 
        неа     | |||
| 42
    
        MAKK 16.09.11✎ 21:04 | 
        >>(37) Дело в том, что Модуль внешнего соединения обычно пуст в любой конфигурации, в крайнем случае, галочку напротив него при обновлении можно не ставить
  Ну чтож если другого выхода нет то буду благодарен если вы опишите мне что и где нужно прописать. | |||
| 43
    
        MAKK 16.09.11✎ 21:04 | 
        Но вообще это жесть какая-то=)     | |||
| 44
    
        Steel_Wheel 16.09.11✎ 21:07 | 
        (41) ну, я запрос из 1С скопировал, тебе надо текст заменить в query.Текст... ты ведь ЭТО сделал?
  (42) Клик ПКМ на корневом узле дерева конфигурации, выбираем "Модуль внешнего соединения". Пишем что-то вроде Функция Trim(МоеЗначение) Экспорт Возврат СокрЛП(МоеЗначение); КонецФункции По идее, функция Trim должна появится у connection (43) Это ОдинЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭС (с) Царь Леонид А вообще, камрады с rsdn.ru регулярно решают похожие проблемы... тоже матеряться много | |||
| 45
    
        MAKK 16.09.11✎ 21:10 | 
        (41) ну, я запрос из 1С скопировал, тебе надо текст заменить в query.Текст... ты ведь ЭТО сделал? 
  Само собой | |||
| 46
    
        Steel_Wheel 16.09.11✎ 21:11 | 
        (45) Ну мало ли... всякое бывает. А вылетает на какой строчке:
  query.УстановитьПараметр("СсылкаНаОбъект", orders.Ссылка); dynamic e = query.Выполнить(); | |||
| 47
    
        MAKK 16.09.11✎ 21:13 | 
        dynamic e = query.Выполнить();     | |||
| 48
    
        Steel_Wheel 16.09.11✎ 21:16 | 
        (47) Это плохо. Запрос я конструктором составлял. Значит, с парамтером что-то     | |||
| 49
    
        MAKK 16.09.11✎ 21:17 | 
        Вопрос конечно крайне глупый,но спрошу. В данный момент подключаюсь к тестовой базе. Под каким профилем надой зайти чтоб была возможность редактирования? Захожу как гендир и как администратор. Но все вкладки открываются "только для чтения".     | |||
| 50
    
        Steel_Wheel 16.09.11✎ 21:19 | 
        (49) Профили в конфигураторе настраивают (Администрирование -> Пользователи). Там можно настроить доступ (дать себе права на изменение конфигурации).
  Но есть и другая ситуация: когда на конфигурации висит "красный замок". Тогда надо идти в "Конфигурация -> Настройка поддержки", далее нажать на кнопку "Разрешить изменения" | |||
| 51
    
        Steel_Wheel 16.09.11✎ 21:20 | 
        Это если база не в хранилище и не захвачен ее корень     | |||
| 52
    
        MAKK 16.09.11✎ 21:34 | 
        >>По идее, функция Trim должна появится у connection 
  Чето не появилась( | |||
| 53
    
        MAKK 16.09.11✎ 21:43 | 
        >>>>По идее, функция Trim должна появится у connection
  >>Чето не появилась( Появилась. только результат не тот что ожидалось. var testVar = connection.Trim(orders.ВидОперации); тут testVar равен "COMОбъект" Еще идеи будут? | |||
| 54
    
        Steel_Wheel 17.09.11✎ 10:50 | 
        Это пипец какой-то     | |||
| 55
    
        MAKK 17.09.11✎ 11:25 | 
        "Хотел бы я в глаза взглянуть тому конструктору, который этот двигатель придумал."(с)     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |