Вход | Регистрация
 

Помогите переконвертировать код C# в 1С

Помогите переконвертировать код C# в 1С
Я
   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() и перебирай его результат, там всё очевидно станет, если есть хотя бы базовые навыки владения отладчиком.
   acces969
 
2 - 02.08.21 - 09:14
(1) + если не будет читать, то читай в соответствие (по умолчанию читает в структуру, из за этого поля с именами "1", "наименование с пробелами" или "" приведет к исключению
   fisher
 
3 - 02.08.21 - 09:16
(0) > Я не понял, что нужно делать с "KeyValuePair<DateTime, string>"
В 1С прямой аналог - соответствие.
   fisher
 
4 - 02.08.21 - 09:18
Как уже сказали, если парсишь json, то тебе нужно добиться чтобы requestResponseList был массивом соответствий и код получится один в один.
   Garykom
 
5 - 02.08.21 - 09:52
(3) КлючИЗначение (KeyAndValue) а не Соответствие
   Garykom
 
6 - 02.08.21 - 09:53
Походу тут форум не 1Сников а C#'стов, которые 1С уже плохо знают...
   Почему 1С
 
7 - 02.08.21 - 09:59
(5) Которое лежит в соответствии...
   Garykom
 
8 - 02.08.21 - 10:09
(7) не обязательно
КлючИЗначение (KeyAndValue)

Свойства:
Значение (Value)
Ключ (Key)
Описание:
Элемент коллекции Соответствие и Структура. Представляет собой пару из ключа и соответствующего ключу значения.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Возможен обмен с сервером. Сериализуется. Может использоваться в реквизитах управляемой формы. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: KeyAndValue.
См. также:
Соответствие, метод Получить
КоллекцияОформленийДат, метод Получить
Использование в версии:
Доступен, начиная с версии 8.0.
   Varlant1n
 
9 - 02.08.21 - 10:17
Спасибо всем за ответы. Сейчас буду разбирать ваши замечания и предложения. Хорошей и удачной рабочей недели всем!
   fisher
 
10 - 02.08.21 - 10:37
(5)(8) > не обязательно
А у него разве есть конструктор? Как ты его в массив положишь?
   Garykom
 
11 - 02.08.21 - 10:40
(10) и Структура
   fisher
 
12 - 02.08.21 - 10:42
(11) и животноводство? :)
   Garykom
 
13 - 02.08.21 - 10:47
(12) Признай уже свой двойной косяк ))
   fisher
 
14 - 02.08.21 - 10:49
(13) Да мне косяк признать вообще не проблема. Понять бы только в чем он, да еще и двойной.
Хотя в шарпе не копенгаген. Если requestResponseList на самом деле не лист, а хэшсет какой-нить, тогда твой ответ в (5) обретает смысл, если соответствием будет requestResponseList
   Garykom
 
15 - 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> могут быть любые объекты
   fisher
 
16 - 02.08.21 - 10:56
(15) Причем тут это? Если это лист а не сет, то в 1С аналогом будет или массив или список значений. А туда элементами КлючИЗначение я не представляю, как ты засунешь без обертки.
   Почему 1С
 
17 - 02.08.21 - 12:03
(11) У структуры ключ не может быть датой, как указано в (0), хотя у учетом json это автор скорее всего перепутал местами типы ключа и значения.
   Varlant1n
 
18 - 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# как раз таки цикл, но ничего не срабатывает.(((( У кого-то есть каике-то идеи?
   Garykom
 
19 - 02.08.21 - 17:13
(18) не справишься
найми уже программиста
   ДенисЧ
 
20 - 02.08.21 - 17:17
Строка ConnectManager.GetResponseList() не может стать сом-объектом. Она может вернуть тебе объект-рыбу. А у него уже есть свойства и методы получения данных
   Varlant1n
 
21 - 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С я попробовал все варианты, но не смог получить то же самое.
   fisher
 
22 - 02.08.21 - 17:24
Так и подумал, что это логи какие-то. Что еще может быть дата плюс текст? :)
(18) А не факт, что из 1С вообще получится через это API без прокладок. Надо смотреть в доке какой объект должен вернуть GetResponseList() и хватает ли у него методов и свойств, чтобы без итератора обойти элементы коллекции. Если можно получить количество элементов и взять элемент по номеру - тогда через это и делай.
   Varlant1n
 
23 - 02.08.21 - 17:58
(22) Когда пускаю через цикл, сразу же вылетает ошибка с итератором
   fisher
 
24 - 02.08.21 - 18:00
(23) Да ты что! Тогда попробуй поискать на этой страничке по словосочетанию "без итератора".
   Varlant1n
 
25 - 02.08.21 - 18:02
(24) Надеюсь, что Вы на меня не разозлитесь за вопрос, но как можно обойти коллекцию без итератора?) =(((
   fisher
 
26 - 02.08.21 - 18:03
(25) > Если можно получить количество элементов и взять элемент по номеру - тогда через это и делай.
   Varlant1n
 
27 - 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;
}
   Varlant1n
 
28 - 02.08.21 - 18:22
(27) Но все равно выдает ошибку итератора. Хотя я задал и тип и наименование точно такое же
   acht
 
29 - 02.08.21 - 18:26
(6) Здесь место встречи 1Сников, которые ни 1С не C# не знают.
   Garykom
 
30 - 02.08.21 - 18:28
(29) +100
 
 
   acht
 
31 - 02.08.21 - 18:28
(18) А теперь еще и COM объект откуда-то возникает...
   Garykom
 
32 - 02.08.21 - 18:28
(27) Ответь что такое "ConnectManager.GetResponseList;" и откуда оно?
   Varlant1n
 
33 - 02.08.21 - 18:35
(32) Connectmanager это COMОбъект с помощью которого идет подключение через wifi к девайсу. У него есть свои функции и процедуры по типу "connectDevice()" и тд. И в апишках есть еще "KeyValuePair<DateTime, string> requestResponseList" который нужен мне для получения ответа от дейвайса. И приписан пример для с#. Через powershell и cmd все работает на ура, а вот в 1С я никак не могу найти путь к получению ответа от девайса.
   Varlant1n
 
34 - 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
   Garykom
 
35 - 02.08.21 - 18:45
(33) >Connectmanager это COMОбъект с помощью которого идет подключение

GetResponseList = ConnectManager.GetResponseList();
КоличествоВсего = GetResponseList.Count();
Для НомерЭлемента = 0 По КоличествоВсего Цикл
 Элемент = GetResponseList[НомерЭлемента];
 Сообщить("Key="+Элемент.Key+ ", Value="+ Элемент.Value);
КонецЦикла;

   Garykom
 
36 - 02.08.21 - 18:46
(35) ошибку По сам исправь
   Garykom
 
37 - 02.08.21 - 18:47
(36)+
Для НомерЭлемента = 1 По КоличествоВсего Цикл
 Элемент = GetResponseList[НомерЭлемента-1];
   Varlant1n
 
38 - 02.08.21 - 18:48
(35) Пробовал подобное, но "Метод объекта не обнаружен (Count)"
   Varlant1n
 
39 - 02.08.21 - 18:50
Кстати, в powershell выдается подсказка "System.Collections.Generic.List[string] GetResponseList()" которая мне ничего не дает конечно же, но мб кто-то что-то поймет
   Garykom
 
40 - 02.08.21 - 18:52
(38) КоличествоВсего = GetResponseList.Count;

без скобок забыл это не метод а свойство
   Varlant1n
 
41 - 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.
   Varlant1n
 
42 - 02.08.21 - 19:38
(41) Нет, они никак не связаны
   Serginio1
 
43 - 02.08.21 - 21:13
   acht
 
44 - 02.08.21 - 21:48
(43) Кажется, это был контрольный из миномета.
   oleg_km
 
45 - 03.08.21 - 00:10
(44) Да нет, в данной ситуации это самое верное решение.
   Varlant1n
 
46 - 03.08.21 - 10:04
(43) Брат, у тебя ссылка на скачивание NetObjectToIDispatch45 недействительна(
   Serginio1
 
47 - 03.08.21 - 10:20
   Varlant1n
 
48 - 03.08.21 - 10:23
   Varlant1n
 
49 - 03.08.21 - 10:24
(48) То есть по данной ссылке не начинается скачка
   Varlant1n
 
50 - 03.08.21 - 10:25
Все, скачалось. Открыл в другом баруезере.
   Varlant1n
 
51 - 03.08.21 - 10:25
Буду сейчас пробовать
   ДенисЧ
 
52 - 03.08.21 - 10:27
(47) "Google Chrome блокирует некоторые скачивания"

Нехорошо вирусы выкладывать )))
   Salimbek
 
53 - 03.08.21 - 10:44
(41) "Не, не прокатило." - раздражает, когда говорят "не прокатило", но не указывают почему. Может у тебя тупо синтаксическая ошибка где-то, или дальше в коде ошибка, но нет, ничего я вам не скажу. Просто "Не прокатило".
   Varlant1n
 
54 - 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): Класс не зарегистрирован"
   Garykom
 
55 - 03.08.21 - 11:01
(54) разрядность не та
   Garykom
 
56 - 03.08.21 - 11:03
и возможно в этом и трабла что у тебя не работает
тупо 64 битная 1С у тебя а твое только 32 бит
   Serginio1
 
57 - 03.08.21 - 11:07
   Salimbek
 
58 - 03.08.21 - 11:39
(57) Твоя ссылка у меня вышла какая-то кривая с ответом в виде 404 , я из нее нормальную то получил, но попробую, на всякий случай, выложить еще раз:
Использование классов .Net в 1С для новичков
   Varlant1n
 
59 - 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,

П.С. данные ошибки невозмлжно скопировать, поэтому не написал их польностью. Надебс, что кто-то сталкивался с подобным.
   Garykom
 
60 - 03.08.21 - 11:47
(59) муахаха
 
 
   Garykom
 
61 - 03.08.21 - 11:47
ТС честно признай уже что программинг это не твое
Пока по крайней мере ибо у тебя базовых знаний тупо нет
   Serginio1
 
62 - 03.08.21 - 12:10
(59) Зачем тебе словарь зоздавать? Судя по (27) тебе нужно вызвать метод, пройтись по коллекции и получить данные
   Serginio1
 
63 - 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));
   Varlant1n
 
64 - 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`ку.
   Garykom
 
65 - 03.08.21 - 12:22
(64) Ты можешь скинуть полный пример а не обрезок?
И сам мануал?
   Varlant1n
 
66 - 03.08.21 - 12:22
(64) В powershell мне доступны подсказки для "requestResponseList" и он выдает:
System.Collections.Generic.Dictionary[datetime,string] requestResponseList {get;set;}
   Garykom
 
67 - 03.08.21 - 12:24
(66) причем тут powershell и какое отношение он имеет к примеру на C#/.Net ?
   Varlant1n
 
68 - 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;
}
   Varlant1n
 
69 - 03.08.21 - 12:25
(67) Разработчики подключают данный аппарат через powershell. Мне же нужна интеграция с 1С. Я прописал все. Я посылаю все, что нужно в json файлах в на девайс, но мне нужно получитьь ответ от девайса. А для этого служит "KeyValuePair<DateTime, string> requestResponseList"
   Garykom
 
70 - 03.08.21 - 12:25
Наймите уже программиста
   Garykom
 
71 - 03.08.21 - 12:26
(69) ты сейчас пишешь редкостный бред
   Serginio1
 
72 - 03.08.21 - 12:28
Получи ConnectManager и вызови 
GetResponseList = ConnectManager.GetResponseList;
            
Для каждого json Из GetResponseList Цикл
                
    Сообщить(""+стр.Key+"="+стр.Value)
                
КонецЦикла;

Этот
   Varlant1n
 
73 - 03.08.21 - 12:29
(71) Я написал выше о том, что в качестве примера подключения девайса, разработчики показывают все это через PowerShell. Я же хочу подключить интеграцию через 1С. Все запросы я прописал. И все работает. То есть я могу послать все, что мне нужно на девайс. Осталось только смочь получить ответы от него.
   Varlant1n
 
74 - 03.08.21 - 12:31
(72) Вангую ругань на неопознанный итератор
   acht
 
75 - 03.08.21 - 12:32
(72) Уже было в (27), итератор не доступен =)

Самое смешное, что у него там уже есть какая-то COM обертка, про которою он молчит как партизан и несет ахинею про powershell.
   Varlant1n
 
76 - 03.08.21 - 12:33
(74) Да, так и есть "Итератор для значения не определен". Как я понимаю тут дело в том, что итератор в цикле должен иметь определенный тип, чтобы смочь получить данные из "requestResponseList "
   Serginio1
 
77 - 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));

КонецЦикла;
   fisher
 
78 - 03.08.21 - 12:45
(76) Попробуй выполнить GetResponseList().ToArray()
Выдаст ошибку или нет.
(77) О. Или так.
   Serginio1
 
79 - 03.08.21 - 12:48
Посмотри https://infostart.ru/1c/articles/466196/
Но проще на C# полную обработку данных сделать, а из 1С уже вызвать только нужные данные
   Varlant1n
 
80 - 03.08.21 - 12:52
(77) Брат, спасибо что-то получилось. Я получил ответы от девайса. Буду теперь с ними разбираться. Все же огромное вам всем спасибо! Желаю всем хорошего дня!


Список тем форума
 
Прочитай, хотя бы, Митичкина "Разработка в системе 1С:Предприятие 8". Волшебник
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.