|
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
|
"Хотел бы я в глаза взглянуть тому конструктору, который этот двигатель придумал."(с)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |