Имя: Пароль:
1C
1С v8
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
"Хотел бы я в глаза взглянуть тому конструктору, который этот двигатель придумал."(с)