Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Передача параметров через OLE (http://forums.kuban.ru/f1040/peredacha_parametrov_cherez_ole-6117541.html)

eilyich 23.09.2014 07:27

Передача параметров через OLE
 
Есть две базы б1, б2
Нужно подключиться из б1 к б2
в б2 в глобальном модуле есть экспортная функция

ПолучитьТЗ(ДатаОтч, СписНоменклатуры) Экспорт

с двумя параметрами, дата и список значений.
Эта функция возвращает в б1 таблицу значений с строковыми значениями (код товара, количество)

Вопрос: как передать в параметр СписНоменклатура список значений из б1, состоящий из строковых значений (коды номенклатуры) ?

такая конструкция не пашет:
СписНоменкл = СоздатьОбъект("СписокЗначений");
СписНоменкл.ДобавитьЗначение("10256");
СписНоменкл.ДобавитьЗначение("10508");
ТЗРез = ДругаяБаза.EvalExpr("СпецФункцияOLEЗапросОстаткиРезервы(""" + ДатаКонца + """, " + СписНоменкл + ")");

дату передаю как строку все отлично, а вот как список передать?

Заранее благодарен за ответы.

101 23.09.2014 07:44

как текст, оле понимает - число, строку , дату

eilyich 23.09.2014 07:45

сори ошибся, немного )
не так
ТЗРез = ДругаяБаза.EvalExpr("СпецФункцияOLEЗапросОстаткиРе зервы(""" + ДатаКонца + """, " + СписНоменкл + ")");
а так:
ТЗРез = ДругаяБаза.EvalExpr("ПолучитьТЗ(""" + ДатаКонца + """, " + СписНоменкл + ")");
и СписНоменклатура ))
ну вопрос думаю понятен

eilyich 23.09.2014 07:48

а на сколько длинная строка может быть передана ?, или даже не заморачиваться по этому поводу ?, а то например у меня в базе б1 могут выбрать все товары из группы ХХХ, а там их тысяча, представляю эту строчку типа (65654;65321;3564.....)

VZ 23.09.2014 07:52

Через оле-горлышко пролазят токмо "базовые" типы данных: число, строка, дата. Коллекция в сей список не входит.
Если коллекция достаточно короткая, можно передать ее через строку с разделителями.
А так же: EvalExpr предполагает, что передаваемый параметр содержит известное принимающему выражение. Но откуда принимающий модуль знает, что [em]СписНоменкл[/em] это объект типа СЗ? У него такого объекта нет.

eilyich 23.09.2014 07:58

VZ какже тогда передать большой список?, одна идея есть, например через файлик, но помоему бредовая слегка идея ))

101 23.09.2014 08:01

я бы вкурил в тему на счет передачи данных через значениевфайл , значениеизфайла и ТЗ со строками вот тебе и неограниченная передача и обрабатывать удобно

eilyich 23.09.2014 08:02

101 ну я про тоже и подумал, блин чтото не особо такой вариант нравится

101 23.09.2014 08:07

как раз такой вариант в РАЗЫ быстрее чем OLE

roma n 23.09.2014 08:08

Не нравится через файл - заверни в ЗначениеВСтрокуВнутр и передавай, на той стороне -разворачивай.

roma n 23.09.2014 08:09

8-101 > +100500. На мелочи не заметно, а на значительных объёмах данных - видно невооружённым глазом

eilyich 23.09.2014 08:10

Наверное через файл сделаю, всем спасиб!

VZ 23.09.2014 08:21

9-roma n > ЗначениеВСтроку() способно сотворить такую строку, что ОЛЕ ей подавится ;)
Впрочем, это можно установить эксперементально:
В цикле наращивать исходную строку определенными порциями, передавать ОЛЕ-приемнику, а тот пусть возвращает принятое в другую переменную.
Несовпадение длин (или вылет) обозначит предельную длину строки ;)
Еще можно пользовать ЗначениеВФайл(), а уж имя файла точно можно передать.
И кстати: внутренние идентификаторы объектов - это строка ;)

eilyich 23.09.2014 08:38

VZ "И кстати: внутренние идентификаторы объектов - это строка " это я понимаю, я туда коды номенклатуры положу строковые. ) Просто затупил с момента когда понял что СЗ передавать нельзя, а в мыслях все уже было так красиво мля..))

roma n 23.09.2014 08:39

12-VZ > Длину не вычислял, массив оокло тысячи ссылок передавал без потерь. С большими объёмами не экспериментирова,-: мне легче всё в файлик сложить и не парить мозг вопросом "пролезет/не пролезет" :)

roma n 23.09.2014 08:40

13-ilyich_ > тебе ни разу не про коды говорят.

VZ 23.09.2014 09:00

14-roma n > А можно подробнее про передачу массива? Т.е., на своей стороне имеем объявляем [em]Перем МойМассив[1000][/em], и потом что-то вроде [em]ДругаяБаза.EvalExpr("СкушайМассив(1000,МойМассив)");[/em]
?

VZ 23.09.2014 09:09

13-ilyich_ > Ну, в сабжевом случае ничто не мешает применить конструкцию [em]ДругаяБаза.ЗначениеИзСтроки(ЗначениеВСтроку(СписНоменклатуры));[/em]

Чучундер 23.09.2014 10:31

Попробуй просто:
глРасшифровка - есть в типовой базе, экспортная переменная, вот в нее и пихай что надо
.

Оле.глРасшифровка = Оле.EvalExpr("СоздатьОбъект(""СписокЗначений"")");
Оле.глРасшифровка.ДобавитьЗначение("хрень");
Оле.глРасшифровка.ДобавитьЗначение("мутотень");
Оле.глРасшифровка.ДобавитьЗначение("колокольчик");
Результат = Оле.EvalExpr("КакаяТоФункцияСПараметрами(глРасшифровка)");

eilyich 23.09.2014 10:37

17-VZ >криво парсится, не работает. ошибки валятся в стиле "ожидается символ ")"..."

eilyich 23.09.2014 10:41

18-Чучундер >пробовал так почему-то не получилось, потом сюда на форум пришел, ща еще раз попробую может ошибся где-то.

roma n 23.09.2014 10:47

16-VZ > я в контексте "[em]заверни в ЗначениеВСтрокуВнутр[/em]" и "[em]ЗначениеВСтроку() способно сотворить такую строку, что ОЛЕ ей подавится[/em]"
:) через строку такой массив передаётся без потерь

roma n 23.09.2014 10:48

19-ilyich_ > [em]ошибки валятся в стиле "ожидается символ ")"[/em] - разруха - она не в сортирах

eilyich 23.09.2014 11:16

18-Чучундер > где же ты был раньше, спасибо тебе огромное!!! )) работает! Я по другому пытался сделать через ОЛЕ.ExecuteBatch("глРасшифровка =СоздатьОбъект(""СписокЗначений"")"); не работало.

Чучундер 23.09.2014 16:11

(23) ну так на ткой код она тебе вернет ошибку типа неизвестный оператор... Экзекутебач должна возвращать вычесленное значение. а у тебя написан код не вычисления значения, а присвоения... то есть немножко не то


Текущее время: 19:31. Часовой пояс GMT +3.