Имя: Пароль:
1C
1С v8
Передача массива из JavaScript в 1С
0 Cmyk32
 
18.07.11
14:11
Всем привет!

В JS у меня есть функция getArray(), возвращающая массив.

В 1С код:
МассивЗаказов = ЭлементыФормы.Карта.Документ.parentWindow.eval("getArray()");
   Для каждого Эл Из МассивЗаказов Цикл
       Сообщить(Эл );
   КонецЦикла;

Программа выдает ошибку "Итератор для значения не определен". Подскажите, как обработать COMОбъект?
1 skunk
 
18.07.11
14:13
для х = 1 по размер цикл
сообщить(МассивЗаказов[х]);
2 H A D G E H O G s
 
18.07.11
14:14
1) По индексу перебирай, если вообще там com объект вернулся
2) Правильнее будет возвратить ComSafeArray - стандартный механизм обмена массивами в COM
3 H A D G E H O G s
 
18.07.11
14:14
(1) нет
4 H A D G E H O G s
 
18.07.11
14:15
(1) Хотяяяя, но нет скорее всего.

для х = 0 по размер-1 цикл
сообщить(МассивЗаказов.Get(x));
5 Cmyk32
 
18.07.11
14:16
(1), (4) не подходит, пробовала :(
Попробую ComSafeArray
6 Cmyk32
 
18.07.11
14:50
(4) ComSafeArray используется и для получения массива в 1с, не только для передачи?
7 H A D G E H O G s
 
18.07.11
14:55
- "Приветствую вас, Дети Ночи!"
- "Че?"
- "Здорово, говорю, упыри..."
- "А, ну привет..."

По сабжу (6):
"Че???"
8 Cmyk32
 
18.07.11
14:58
(7) :)))))))
Примеры в нете про выгрузку с помощью comSafeArray ИЗ 1С, мне надо В 1С? плохо ищу?
9 H A D G E H O G s
 
18.07.11
15:03
(8) А не надо искать - надо его тупо получить в 1С и перебрать.

В чем сложность?

COMSafeArray (COMSafeArray)
COMSafeArray (COMSafeArray)
Методы:

GetDimensions (GetDimensions)
GetLength (GetLength)
GetLowerBound (GetLowerBound)
GetType (GetType)
GetUpperBound (GetUpperBound)
GetValue (GetValue)
IsResizable (IsResizable)
Resize (Resize)
SetValue (SetValue)
Выгрузить (Unload)

Конструкторы:

Из COMSafeArray
Из массива 1
Из массива 2
По типу элемента 1
По типу элемента 2

Описание:

Объектная оболочка над многомерным массивом SAFEARRAY из COM. Позволяет создавать и использовать SAFEARRAY для обмена данными между COM-объектами.
Для передачи массива в качестве параметра метода COM-объекта необходимо построить COMSafeArray нужной размерности с нужным типом элемента и указать построенный COMSafeArray в качестве значения входного параметра. Другие объекты 1С:Предприятия можно использовать в качестве значений входных параметров типа Массив только при наличии исчерпывающей информации о типах параметров в библиотеке типа COM-объекта.
Результат метода COM-объекта или значение выходного параметра типа Массив всегда представляется объектом COMSafeArray.

Доступность:

Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Пример:

Массив = Новый COMSafeArray("VT_I4", 2);
Массив.SetValue(0, 23);
Массив.SetValue(1, 13.5);
COMОбъект = Новый COMObject("ExampleCOMObject.ECOMClass");
COMОбъект.ProcessSafeArray(Массив);


См. также:

COMSafeArray, конструктор Из COMSafeArray
10 H A D G E H O G s
 
18.07.11
15:04
Ах да, вот еще:

https://1cers.ru/users_photo/19975.jpg
11 Serginio1
 
18.07.11
15:21
(0) Попробуй GetValue, он кстати и для массивов Net
12 Cmyk32
 
18.07.11
15:24
(9) А как его получить, а не сформировать?
13 H A D G E H O G s
 
18.07.11
15:27
(12) откуда я знаю?
Как ты вот его получаешь?:
МассивЗаказов = ЭлементыФормы.Карта.Документ.parentWindow.eval("getArray()");

В java-скрипты я - не ездун.
14 Serginio1
 
18.07.11
15:29
(0) А что отладчик говорит?
15 Cmyk32
 
18.07.11
15:34
(14) Тип возвращаемого значения - ComОбъект
http://i057.radikal.ru/1107/bf/c1a9789568ae.jpg

(11) не работает
16 Serginio1
 
18.07.11
15:36
Для интереса посмотри, что возвращает
Метод valueOf
Синтаксис: массив.valueOf()
Результат: строковое значение
Метод valueOf возвращает примитивное значение массива. Для этого все элементы массива преобразуются в строки, и эти строки объединяются в одну строку через запятую. Иными словами, этот метод возвращает тот же результат, что и метод toString.
А цикл от 0
17 Serginio1
 
18.07.11
15:37
для х = 0 по МассивЗаказов.length-1 цикл
сообщить(МассивЗаказов[х]);
18 Cmyk32
 
18.07.11
15:39
(16) Так и есть. Результат - значения через запятую.
length - поле объекта не обнаружено.

Это может быть связано с тем, что у меня массив неограниченной длины?
19 Cmyk32
 
18.07.11
15:40
(18) Нет, не помогло
20 Cmyk32
 
18.07.11
15:42
В js минимализм:
var adressArray = new Array();

функция по добавлению элемента:
function addAdressToArray (NewAdress) {
AdressArray[AdressArray.length] = NewAdress;}

И функция, возвращающая значение в 1с:
function getArray() {return AdressArray;}
21 AquaKosh
 
18.07.11
15:45
Передача массивов между 1С и js уже 100 раз обсуждалась - в поиск.
22 Serginio1
 
18.07.11
15:47
(18) Интересно, что ри этом он показывает элементы 0 и 1.
При этом других свойсв нет. Это может быть только при итераторе.

для х = 0 по 1 цикл
сообщить(МассивЗаказов[х]);
23 Cmyk32
 
18.07.11
15:49
(21)
Про это чтоли?
v8: Из Javascript?
v8: Получение координат из Поле HTML документа в 1с (Google Maps)

Здесь нет решения. У меня так не работает.
24 Fragster
 
гуру
18.07.11
15:50
Для Сч = 0 по Массив.length()-1 Цикл
 Сообщить(Массив.item(i));
КонецЦикла;
25 Fragster
 
гуру
18.07.11
15:51
недавно столкнулся с тем, что по OLE у выборки из результата запроса нет Выборка.Количество(), есть Выборка.Count() только...
26 Cmyk32
 
18.07.11
15:52
(24) {Форма.Форма(147)}: Метод объекта не обнаружен (length)
Для Сч = 0 по МассивЗаказов.length()-1 Цикл

Как-будто объект вообще никак не обрабатывается
27 Fragster
 
гуру
18.07.11
15:53
(26) а item(0) работает? я просто давно в яваскрипт не залезал, не помню, что там у него... вроде у массива length, хотя могу ошибаться... а еще оно регистрочувствительное...
28 Cmyk32
 
18.07.11
15:56
(27) все верно length. Но не работает) и item
29 Serginio1
 
18.07.11
15:59
Судя по 15 должен работать итератор.
Какую ошибку выдает МассивЗаказов[0]?
30 Serginio1
 
18.07.11
16:01
Кстати и в v8: Из Javascript?
итератор работает. Проверь еще
31 Serginio1
 
18.07.11
16:07
(20) Вообщето для добавления существует push
32 Cmyk32
 
18.07.11
16:17
(29) {Форма.Форма(146)}: Получение элемента по индексу для значения не определено
   сообщить(МассивЗаказов[0]);
33 Cmyk32
 
18.07.11
16:21
(21) ты можешь свой пример еще раз выложить?
34 Serginio1
 
18.07.11
16:22
Тое есть перед вызовом, итератора в отладчике показывает два элемента, и при этом заявляет, что итератор неопределен?
МассивЗаказов = ЭлементыФормы.Карта.Документ.parentWindow.eval("getArray()");
   Для каждого Эл Из МассивЗаказов Цикл
       Сообщить(Эл );
   КонецЦикла;
35 Cmyk32
 
18.07.11
16:23
(34)
Да\\
Может у меня каких-то библиотек 1с-их нет?
36 Cmyk32
 
18.07.11
16:25
(34)
Блииииннн!!
Вот так работает:
МассивЗаказов["0"]
37 Cmyk32
 
18.07.11
16:32
(36) Почему?
38 Serginio1
 
18.07.11
16:36
видно индексер строковый
39 Cmyk32
 
18.07.11
16:37
(38) от чего может зависеть?
по первой придется извращаться:
   инд = 0;
   Пока 1 = 1 цикл
       Попытка
           сообщить(МассивЗаказов[строка(инд)]);
           инд = инд + 1;
       Исключение
           прервать;
       КонецПопытки
   КонецЦикла;
40 Serginio1
 
18.07.11
16:38
А МассивЗаказов.Количество() что выдает? или Count()
41 Cmyk32
 
18.07.11
16:52
А вот и не работает это все (количество, count) с массивом заказов)) У меня уже белочка начинается))))
42 smaharbA
 
18.07.11
17:27
ЭлементыФормы.Карта.Документ.script.getArray()
43 smaharbA
 
18.07.11
17:32

Функция ПолучитьОбертку()
   ХТМЛ = СоздатьОбъект("htmlfile");
   ХТМЛ.Open("text/html");
   //<-- Подготовим нужные методы
   ХТМЛ.Write("<script type='text/javascript'>
   |var ХТМЛ;
   |ПолучитьЗначение=function(x,y){return x.constructor == Array ? x[y] : x};
   |УстановитьЗначение=function(x,y,z){x[y]=z};
   |РазмерМассива=function(x){return x.length};
   |Массив=function(){return new Array()};
   |</script>");
   Док=ХТМЛ.documentElement.document;
   // Внедрение объекта Скрипта в самого себя, для сохранности контекста
   Док.script.ХТМЛ=ХТМЛ;
   // Все подготовке -->
   Возврат Док.script;
КонецФункции    // ПолучитьОбертку(Это)

Это=ПолучитьОбертку();
Для Сч=0 По 10 Цикл
   Это.УстановитьЗначение(Массив,Сч,"Значение "+Сч );
КонецЦикла;
Для Сч=0 По Это.РазмерМассива(Массив)-1 Цикл
   Сообщить(Это.ПолучитьЗначение(Массив,Сч));
КонецЦикла;
44 Serginio1
 
18.07.11
19:15
(43) Интересно, а как же 1С узнает количество и значение элементов? Явно не так, но на безрыбье ... Спасибо интересно.
45 orefkov
 
19.07.11
08:52
(0)
В скрипт передавай пустой массив 1С, и добавляй в него.
Скрипт:
"function myFunction(result)
|{
|    result.Add(1)
|    result.Add(2)
|    result.Add(3)
|}"

Вызов из 1С:

Результат = Новый Массив;
ЭлементыФормы.Карта.Документ.parentWindow.myFunction(Результат);
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.