|
Помогите переконвертировать код C# в 1С | ☑ | ||
---|---|---|---|---|
0
Varlant1n
02.08.21
✎
09:08
|
Здравствуйте. Есть строки кода на C#, которые нужно перевести в 1С. То, что там чикл это я понял, но вот остальное...
Сам код: foreach (KeyValuePair<DateTime, string> json in requestResponseList) { string messageDate = json.Key; string messageText = json.Value; } Я не понял, что нужно делать с "KeyValuePair<DateTime, string>" |
|||
1
ДенисЧ
02.08.21
✎
09:11
|
Это структура с двумя полями.
А вообще - Используй ПрочитатьJSON() и перебирай его результат, там всё очевидно станет, если есть хотя бы базовые навыки владения отладчиком. |
|||
2
acces969
02.08.21
✎
09:14
|
(1) + если не будет читать, то читай в соответствие (по умолчанию читает в структуру, из за этого поля с именами "1", "наименование с пробелами" или "" приведет к исключению
|
|||
3
fisher
02.08.21
✎
09:16
|
(0) > Я не понял, что нужно делать с "KeyValuePair<DateTime, string>"
В 1С прямой аналог - соответствие. |
|||
4
fisher
02.08.21
✎
09:18
|
Как уже сказали, если парсишь json, то тебе нужно добиться чтобы requestResponseList был массивом соответствий и код получится один в один.
|
|||
5
Garykom
гуру
02.08.21
✎
09:52
|
(3) КлючИЗначение (KeyAndValue) а не Соответствие
|
|||
6
Garykom
гуру
02.08.21
✎
09:53
|
Походу тут форум не 1Сников а C#'стов, которые 1С уже плохо знают...
|
|||
7
Почему 1С
02.08.21
✎
09:59
|
(5) Которое лежит в соответствии...
|
|||
8
Garykom
гуру
02.08.21
✎
10:09
|
(7) не обязательно
КлючИЗначение (KeyAndValue) Свойства: Значение (Value) Ключ (Key) Описание: Элемент коллекции Соответствие и Структура. Представляет собой пару из ключа и соответствующего ключу значения. Доступность: Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер. Возможен обмен с сервером. Сериализуется. Может использоваться в реквизитах управляемой формы. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: KeyAndValue. См. также: Соответствие, метод Получить КоллекцияОформленийДат, метод Получить Использование в версии: Доступен, начиная с версии 8.0. |
|||
9
Varlant1n
02.08.21
✎
10:17
|
Спасибо всем за ответы. Сейчас буду разбирать ваши замечания и предложения. Хорошей и удачной рабочей недели всем!
|
|||
10
fisher
02.08.21
✎
10:37
|
(5)(8) > не обязательно
А у него разве есть конструктор? Как ты его в массив положишь? |
|||
11
Garykom
гуру
02.08.21
✎
10:40
|
(10) и Структура
|
|||
12
fisher
02.08.21
✎
10:42
|
(11) и животноводство? :)
|
|||
13
Garykom
гуру
02.08.21
✎
10:47
|
(12) Признай уже свой двойной косяк ))
|
|||
14
fisher
02.08.21
✎
10:49
|
(13) Да мне косяк признать вообще не проблема. Понять бы только в чем он, да еще и двойной.
Хотя в шарпе не копенгаген. Если requestResponseList на самом деле не лист, а хэшсет какой-нить, тогда твой ответ в (5) обретает смысл, если соответствием будет requestResponseList |
|||
15
Garykom
гуру
02.08.21
✎
10:54
|
(14) https://docs.microsoft.com/ru-ru/dotnet/api/system.collections.generic.list-1?view=net-5.0
внутри List<T> могут быть любые объекты |
|||
16
fisher
02.08.21
✎
10:56
|
(15) Причем тут это? Если это лист а не сет, то в 1С аналогом будет или массив или список значений. А туда элементами КлючИЗначение я не представляю, как ты засунешь без обертки.
|
|||
17
Почему 1С
02.08.21
✎
12:03
|
(11) У структуры ключ не может быть датой, как указано в (0), хотя у учетом json это автор скорее всего перепутал местами типы ключа и значения.
|
|||
18
Varlant1n
02.08.21
✎
17:10
|
Ребят, еще раз всем привет. Перепробовал и с помощью соответсвия и структуры и массива, ничего не получилось( Опишу всю ситуацию, может поймете. Я на дейвайс отправляю json файл и мне надо получить ответ от дейвайса. В апи функциях есть вот эта строка:
KeyValuePair<DateTime, string> requestResponseList Описание: The relevant request and response json logs are taken from the "requestResponseList" variable. То есть мне надо каким-то образом в 1С получить ответ (json файл) от дейвайса. Сам "GetResponseList()" я приписываю к своему ComОбъекту. Типа такого: "ConnectManager.GetResponseList()". ConnectManager - ComОбъект для подключения. И эта строка "ConnectManager.GetResponseList()" тоже становится просто ComОбъектом и я никак не могу с ней контактировать. Пробовал и в цикл вставить, там в примере из c# как раз таки цикл, но ничего не срабатывает.(((( У кого-то есть каике-то идеи? |
|||
19
Garykom
гуру
02.08.21
✎
17:13
|
(18) не справишься
найми уже программиста |
|||
20
ДенисЧ
02.08.21
✎
17:17
|
Строка ConnectManager.GetResponseList() не может стать сом-объектом. Она может вернуть тебе объект-рыбу. А у него уже есть свойства и методы получения данных
|
|||
21
Varlant1n
02.08.21
✎
17:20
|
(20) Да, типа такого. Но когда я через CMD прописывваю просто:
$PD_BT.GetResponseList() <-- Sent to 192.168.55.194:2000 on Пн, 02 авг 2021 17’:’52’:’22 [ACK] --> Received from 192.168.55.194:2000 on Пн, 02 авг 2021 17’:’52’:’21 { "apiVersion": "v1.0.3", "type": "Configuration", "zippedCommunicationEnabled": true } <-- Sent to 192.168.55.194:2000 on Пн, 02 авг 2021 17’:’52’:’21 { "type": "Configuration", "zippedCommunicationEnabled": "true" } Он мне сразу возвращает в виде текста. В 1С я попробовал все варианты, но не смог получить то же самое. |
|||
22
fisher
02.08.21
✎
17:24
|
Так и подумал, что это логи какие-то. Что еще может быть дата плюс текст? :)
(18) А не факт, что из 1С вообще получится через это API без прокладок. Надо смотреть в доке какой объект должен вернуть GetResponseList() и хватает ли у него методов и свойств, чтобы без итератора обойти элементы коллекции. Если можно получить количество элементов и взять элемент по номеру - тогда через это и делай. |
|||
23
Varlant1n
02.08.21
✎
17:58
|
(22) Когда пускаю через цикл, сразу же вылетает ошибка с итератором
|
|||
24
fisher
02.08.21
✎
18:00
|
(23) Да ты что! Тогда попробуй поискать на этой страничке по словосочетанию "без итератора".
|
|||
25
Varlant1n
02.08.21
✎
18:02
|
(24) Надеюсь, что Вы на меня не разозлитесь за вопрос, но как можно обойти коллекцию без итератора?) =(((
|
|||
26
fisher
02.08.21
✎
18:03
|
(25) > Если можно получить количество элементов и взять элемент по номеру - тогда через это и делай.
|
|||
27
Varlant1n
02.08.21
✎
18:22
|
(26) С количеством вообще не получается. Постарался еще раз перевести код из С# в 1С:
json = Новый Структура; json.Вставить("DateTime", "string"); GetResponseList = ConnectManager.GetResponseList; Для каждого json Из GetResponseList Цикл Сообщить(Строка(json)); КонецЦикла; Код из проимера: public KeyValuePair<DateTime, string> requestResponseList; The relevant request and response json logs are taken from the "requestResponseList" variable. C# Example: foreach (KeyValuePair<DateTime, string> json in requestResponseList) { string messageDate = json.Key; string messageText = json.Value; } |
|||
28
Varlant1n
02.08.21
✎
18:22
|
(27) Но все равно выдает ошибку итератора. Хотя я задал и тип и наименование точно такое же
|
|||
29
acht
02.08.21
✎
18:26
|
(6) Здесь место встречи 1Сников, которые ни 1С не C# не знают.
|
|||
30
Garykom
гуру
02.08.21
✎
18:28
|
(29) +100
|
|||
31
acht
02.08.21
✎
18:28
|
(18) А теперь еще и COM объект откуда-то возникает...
|
|||
32
Garykom
гуру
02.08.21
✎
18:28
|
(27) Ответь что такое "ConnectManager.GetResponseList;" и откуда оно?
|
|||
33
Varlant1n
02.08.21
✎
18:35
|
(32) Connectmanager это COMОбъект с помощью которого идет подключение через wifi к девайсу. У него есть свои функции и процедуры по типу "connectDevice()" и тд. И в апишках есть еще "KeyValuePair<DateTime, string> requestResponseList" который нужен мне для получения ответа от дейвайса. И приписан пример для с#. Через powershell и cmd все работает на ура, а вот в 1С я никак не могу найти путь к получению ответа от девайса.
|
|||
34
Varlant1n
02.08.21
✎
18:38
|
(33) $PD_BT.requestResponseList
Key Value --- ----- 02.08.2021 17:52:21 <-- Sent to 192.168.55.194:2000 on Пн, 02 авг 2021 17’:’52’:’21... 02.08.2021 17:52:21 --> Received from 192.168.55.194:2000 on Пн, 02 авг 2021 17’:’52’:’21... 02.08.2021 17:52:22 <-- Sent to 192.168.55.194:2000 on Пн, 02 авг 2021 17’:’52’:’22... 02.08.2021 17:53:51 Error :Доступ к ликвидированному объекту невозможен.... 02.08.2021 18:54:12 <-- Sent to 192.168.55.194:2000 on Пн, 02 авг 2021 18’:’54’:’12... 02.08.2021 18:54:12 --> Received from 192.168.55.194:2000 on Пн, 02 авг 2021 18’:’54’:’12... 02.08.2021 18:54:13 <-- Sent to 192.168.55.194:2000 on Пн, 02 авг 2021 18’:’54’:’13... 02.08.2021 18:56:46 Error :Доступ к ликвидированному объекту невозможен.... 02.08.2021 19:36:35 <-- Sent to 192.168.55.194:2000 on Пн, 02 авг 2021 19’:’36’:’35... 02.08.2021 19:36:35 --> Received from 192.168.55.194:2000 on Пн, 02 авг 2021 19’:’36’:’35... 02.08.2021 19:36:36 <-- Sent to 192.168.55.194:2000 on Пн, 02 авг 2021 19’:’36’:’36... Это в powershell |
|||
35
Garykom
гуру
02.08.21
✎
18:45
|
(33) >Connectmanager это COMОбъект с помощью которого идет подключение
|
|||
36
Garykom
гуру
02.08.21
✎
18:46
|
(35) ошибку По сам исправь
|
|||
37
Garykom
гуру
02.08.21
✎
18:47
|
(36)+
Для НомерЭлемента = 1 По КоличествоВсего Цикл Элемент = GetResponseList[НомерЭлемента-1]; |
|||
38
Varlant1n
02.08.21
✎
18:48
|
(35) Пробовал подобное, но "Метод объекта не обнаружен (Count)"
|
|||
39
Varlant1n
02.08.21
✎
18:50
|
Кстати, в powershell выдается подсказка "System.Collections.Generic.List[string] GetResponseList()" которая мне ничего не дает конечно же, но мб кто-то что-то поймет
|
|||
40
Garykom
гуру
02.08.21
✎
18:52
|
(38) КоличествоВсего = GetResponseList.Count;
без скобок забыл это не метод а свойство |
|||
41
Varlant1n
02.08.21
✎
19:25
|
(40) Не, не прокатило. Но я в апишках еще нашел строку. Не знаю связаны ли они друг с другом:
List<string> GetResponseList() The relevant request and response json logs are taken from this function within sorted. KeyValuePair<DateTime, string> requestResponseList The relevant request and response json logs are taken from the "requestResponseList" variable. |
|||
42
Varlant1n
02.08.21
✎
19:38
|
(41) Нет, они никак не связаны
|
|||
43
Serginio1
02.08.21
✎
21:13
|
||||
44
acht
02.08.21
✎
21:48
|
(43) Кажется, это был контрольный из миномета.
|
|||
45
oleg_km
03.08.21
✎
00:10
|
(44) Да нет, в данной ситуации это самое верное решение.
|
|||
46
Varlant1n
03.08.21
✎
10:04
|
(43) Брат, у тебя ссылка на скачивание NetObjectToIDispatch45 недействительна(
|
|||
47
Serginio1
03.08.21
✎
10:20
|
||||
48
Varlant1n
03.08.21
✎
10:23
|
||||
49
Varlant1n
03.08.21
✎
10:24
|
(48) То есть по данной ссылке не начинается скачка
|
|||
50
Varlant1n
03.08.21
✎
10:25
|
Все, скачалось. Открыл в другом баруезере.
|
|||
51
Varlant1n
03.08.21
✎
10:25
|
Буду сейчас пробовать
|
|||
52
ДенисЧ
03.08.21
✎
10:27
|
(47) "Google Chrome блокирует некоторые скачивания"
Нехорошо вирусы выкладывать ))) |
|||
53
Salimbek
03.08.21
✎
10:44
|
(41) "Не, не прокатило." - раздражает, когда говорят "не прокатило", но не указывают почему. Может у тебя тупо синтаксическая ошибка где-то, или дальше в коде ошибка, но нет, ничего я вам не скажу. Просто "Не прокатило".
|
|||
54
Varlant1n
03.08.21
✎
10:59
|
(47) Надеюсь я тебе не надоел, но так как тут сам автор, то хотелось юы спросить. Я попробовал зарегестрировать NetObjectToIDispatch45.dll:
1) через cmd (regsvr32), 2) через powershell (C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe C:\Windows\NetObjectToIDispatch45.dll \codebase, 3) закинул dll в папку с 1С (bin) В 1С же "-2147221164(0x80040154): Класс не зарегистрирован" |
|||
55
Garykom
гуру
03.08.21
✎
11:01
|
(54) разрядность не та
|
|||
56
Garykom
гуру
03.08.21
✎
11:03
|
и возможно в этом и трабла что у тебя не работает
тупо 64 битная 1С у тебя а твое только 32 бит |
|||
57
Serginio1
03.08.21
✎
11:07
|
Использование классов .Net в 1С для новичков
Смотри шапку |
|||
58
Salimbek
03.08.21
✎
11:39
|
(57) Твоя ссылка у меня вышла какая-то кривая с ответом в виде 404 , я из нее нормальную то получил, но попробую, на всякий случай, выложить еще раз:
Использование классов .Net в 1С для новичков |
|||
59
Varlant1n
03.08.21
✎
11:44
|
(57) зарегать удалось, и вот теперь я решил попробовать создать :
Врап = новый COMОбъект("NetObjectToIDispatch45"); json2 = Врап.СоздатьОбъект("System.Collections.Generic.Dictionary`2[System.DateTime, System.String]"); Мне выдало огромное количество ошибок по типу: 1)Ошибка в методе Item Не найден метод, 2) В System.Runtype.InvokeMember и тд. и тп, 3) GetField, GetProperty, OptionalParamBinding, П.С. данные ошибки невозмлжно скопировать, поэтому не написал их польностью. Надебс, что кто-то сталкивался с подобным. |
|||
60
Garykom
гуру
03.08.21
✎
11:47
|
(59) муахаха
|
|||
61
Garykom
гуру
03.08.21
✎
11:47
|
ТС честно признай уже что программинг это не твое
Пока по крайней мере ибо у тебя базовых знаний тупо нет |
|||
62
Serginio1
03.08.21
✎
12:10
|
(59) Зачем тебе словарь зоздавать? Судя по (27) тебе нужно вызвать метод, пройтись по коллекции и получить данные
|
|||
63
Serginio1
03.08.21
✎
12:13
|
62+ в любом случае в https://infostart.ru/1c/articles/448668/ описана раота со словарем
Аналогично можно создать и словарь Dyctionary, это типизированный аналог 1С Соответствие Dictionary<String,int> Словарь= Врап.СоздатьОбъект("System.Collections.Generic.Dictionary`2[System.String,System.Int32]"); Для сч=1 По 10 Цикл Словарь.Add(строка(сч),сч); КонецЦикла; Для каждого стр Из Словарь Цикл Сообщить(стр.Key+"="+стр.Value) КонецЦикла; //Аналогично это можно достигнуть через СловарьT=Врап.ПолучитьТип("System.Collections.Generic.Dictionary`2"); Int32=Врап.ПолучитьТип("System.Int32"); СловарьT=Врап.ТипКакОбъект(СловарьT); Словарь=Врап.СоздатьОбъект(СловарьT.MakeGenericType(String,Int32)); Еще одна особенность работы с C# реализацией this[] Например, в 1С мы не можем вызвать Список[0]. Доступ осуществляется через get_Itemи set_Item Список.set_Item(0,"1С+Net"); Сообщить(Список.get_Item(0)); |
|||
64
Varlant1n
03.08.21
✎
12:21
|
(62) Смотри, друг. В примере, который мне скинули разработчики ПО девайса:
foreach (KeyValuePair<DateTime, string> json in requestResponseList) { string messageDate = json.Key; string messageText = json.Value; } "KeyValuePair<DateTime, string>" - Это как я понял аналог соответсвия. С ключем "DateTime" и значением "string". И я решил создать "json" с типом, который хотел создать через твою dll`ку. |
|||
65
Garykom
гуру
03.08.21
✎
12:22
|
(64) Ты можешь скинуть полный пример а не обрезок?
И сам мануал? |
|||
66
Varlant1n
03.08.21
✎
12:22
|
(64) В powershell мне доступны подсказки для "requestResponseList" и он выдает:
System.Collections.Generic.Dictionary[datetime,string] requestResponseList {get;set;} |
|||
67
Garykom
гуру
03.08.21
✎
12:24
|
(66) причем тут powershell и какое отношение он имеет к примеру на C#/.Net ?
|
|||
68
Varlant1n
03.08.21
✎
12:24
|
(65) В мануале перечислены просто функции доступные и есть всего лишь один пример:
KeyValuePair<DateTime, string> requestResponseList The relevant request and response json logs are taken from the "requestResponseList" variable. Пример: public KeyValuePair<DateTime, string> requestResponseList; The relevant request and response json logs are taken from the "requestResponseList" variable. C# Example: foreach (KeyValuePair<DateTime, string> json in requestResponseList) { string messageDate = json.Key; string messageText = json.Value; } |
|||
69
Varlant1n
03.08.21
✎
12:25
|
(67) Разработчики подключают данный аппарат через powershell. Мне же нужна интеграция с 1С. Я прописал все. Я посылаю все, что нужно в json файлах в на девайс, но мне нужно получитьь ответ от девайса. А для этого служит "KeyValuePair<DateTime, string> requestResponseList"
|
|||
70
Garykom
гуру
03.08.21
✎
12:25
|
Наймите уже программиста
|
|||
71
Garykom
гуру
03.08.21
✎
12:26
|
(69) ты сейчас пишешь редкостный бред
|
|||
72
Serginio1
03.08.21
✎
12:28
|
Получи ConnectManager и вызови
GetResponseList = ConnectManager.GetResponseList; Для каждого json Из GetResponseList Цикл Сообщить(""+стр.Key+"="+стр.Value) КонецЦикла; Этот |
|||
73
Varlant1n
03.08.21
✎
12:29
|
(71) Я написал выше о том, что в качестве примера подключения девайса, разработчики показывают все это через PowerShell. Я же хочу подключить интеграцию через 1С. Все запросы я прописал. И все работает. То есть я могу послать все, что мне нужно на девайс. Осталось только смочь получить ответы от него.
|
|||
74
Varlant1n
03.08.21
✎
12:31
|
(72) Вангую ругань на неопознанный итератор
|
|||
75
acht
03.08.21
✎
12:32
|
(72) Уже было в (27), итератор не доступен =)
Самое смешное, что у него там уже есть какая-то COM обертка, про которою он молчит как партизан и несет ахинею про powershell. |
|||
76
Varlant1n
03.08.21
✎
12:33
|
(74) Да, так и есть "Итератор для значения не определен". Как я понимаю тут дело в том, что итератор в цикле должен иметь определенный тип, чтобы смочь получить данные из "requestResponseList "
|
|||
77
Serginio1
03.08.21
✎
12:44
|
(76) Да должен поддерживать IEnumerable.
Так из документации мы знаем что List<T> поддерживает интерфейс IEnumerable https://msdn.microsoft.com/ru-ru/library/system.collections.ienumerable(v=vs.100).aspx Перечислимый=Врап.ПолучитьИнтерфейс(Список,"IEnumerable"); Перечислитель=Перечислимый.GetEnumerator(); // На всякий случай приведем к Интерфейсу IEnumerator Перечислитель=Врап.ПолучитьИнтерфейс(Перечислитель,"IEnumerator"); // Теперь можем пройтись по коллекции Пока Перечислитель.MoveNext() Цикл // Врап.ВСтроку вывоит строковое представление всех типов в том числе числовые, строки, неопределено Сообщить(Врап.ВСтроку(Перечислитель.Current)); КонецЦикла; |
|||
78
fisher
03.08.21
✎
12:45
|
(76) Попробуй выполнить GetResponseList().ToArray()
Выдаст ошибку или нет. (77) О. Или так. |
|||
79
Serginio1
03.08.21
✎
12:48
|
Посмотри https://infostart.ru/1c/articles/466196/
Но проще на C# полную обработку данных сделать, а из 1С уже вызвать только нужные данные |
|||
80
Varlant1n
03.08.21
✎
12:52
|
(77) Брат, спасибо что-то получилось. Я получил ответы от девайса. Буду теперь с ними разбираться. Все же огромное вам всем спасибо! Желаю всем хорошего дня!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |