Имя: Пароль:
1C
 
Помогите переконвертировать код 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Объект с помощью которого идет подключение


GetResponseList = ConnectManager.GetResponseList();
КоличествоВсего = GetResponseList.Count();
Для НомерЭлемента = 0 По КоличествоВсего Цикл
Элемент = GetResponseList[НомерЭлемента];
Сообщить("Key="+Элемент.Key+ ", Value="+ Элемент.Value);
КонецЦикла;
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
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) Брат, спасибо что-то получилось. Я получил ответы от девайса. Буду теперь с ними разбираться. Все же огромное вам всем спасибо! Желаю всем хорошего дня!
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.