Имя: Пароль:
1C
1С v8
Неверные параметры ВложенныйЗапрос.Номенклатура В(<<?>>&СписокНоменклатур)
0 KazSever
 
11.03.21
10:23
Коллеги, приветствую. Нужна ваша помощь.
Делаю запрос к другой базе через COM, в условии запроса передаю массив, со список номенклатур. При попытке выполнить запрос выходит сообщение об ошибке:
"{ВнешняяОбработка.ВыгрузкаЗаказаВKaspi.Форма.Форма.Форма(1572)}: Ошибка при вызове метода контекста (Выполнить)
    РезультатЗапроса = ЗапросСОМ.Выполнить().Выгрузить();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.16.1814): {(117, 33)}: Неверные параметры
ВложенныйЗапрос.Номенклатура В(<<?>>&СписокНоменклатур)
"

Массив я создаю так же, через соединение:
"Функция ПолучитьСписокНоменклатурCOM(Соединение)
    
    Соединение = ПодключитьсяКбазе();
    
    Массив = Соединение.NewObject("Массив");
    
    Для Каждого Строка Из ПолучитьСписокНоменклатур() Цикл
        
        номПоиск = Соединение.Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Строка.Артикул);
        
        Если ЗначениеЗаполнено(номПоиск.Description) Тогда
            Массив.Добавить(номПоиск);
        КонецЕсли;
    КонецЦикла;
    
    Возврат Массив;
    
КонецФункции
"
1 Волшебник
 
11.03.21
10:25
ВложенныйЗапрос.Номенклатура.Артикул В (&СписокАртикуловЧерезЗапятую)
2 KazSever
 
11.03.21
10:26
(1) В массиве не список артикулов, а ссылки в COM базе
3 НЕА123
 
11.03.21
10:31
(0)
> Соединение = ПодключитьсяКбазе();
это надо?
4 KazSever
 
11.03.21
10:32
(3) не стал писать сюда, соединение есть - все норм работает, спасибо.
5 Волшебник
 
11.03.21
10:35
(2) Сделай строку артикулов через запятую, а не массив
6 KazSever
 
11.03.21
10:42
(5) Ок, попробую
7 polosov
 
11.03.21
10:43
(1) С каких пор такое работает?
"В" проверяет вхождение в коллекцию, а не в строку же.
8 Вафель
 
11.03.21
10:43
нужен не массив а коммассив
9 Вафель
 
11.03.21
10:44
то бишь comsafearray
10 KazSever
 
11.03.21
10:51
(9) Массив = Соединение.NewObject("Массив"); это не оно?
11 Вафель
 
11.03.21
10:58
(10) получается что нет. так  список должен работать
12 KazSever
 
11.03.21
11:01
(11) понял
13 KazSever
 
11.03.21
11:26
(11) Новый COMSafeArray(<Массив>, <ТипЭлемента>, <<разм0>,...,<размN-1>>) - ТипЭлемента - в примере синтакс-помощника стоит VT_I4, как определить какой мне нужен, если я использую массив из ссылок справочника номенклатуры?
14 Галахад
 
гуру
11.03.21
12:04
Вроде в (0) все в порядке. Наверное ошибка где-то в другом месте.
15 НЕА123
 
11.03.21
12:11
(1)+
&СписокАртикуловЧерезЗапятую Подобно "%"+ВложенныйЗапрос.Номенклатура.Артикул+"%"
?
16 KazSever
 
11.03.21
12:29
(15) тоже думал об этом, но все же хотелось добить тему с массивом. Неужели это такое непреодолимое препятствие ...
17 SeriyP
 
11.03.21
13:18
МассивСОМ = СоединениеCOM.NewObject("Массив")
18 SeriyP
 
11.03.21
13:21
у вас в массиве COM - COM ссылки. Заполните массивСОМ строками
19 Галахад
 
гуру
11.03.21
13:22
(18) А зачем? Чем плохи ссылки?
20 KazSever
 
11.03.21
13:24
(19) это как строками?
21 hhhh
 
11.03.21
13:28
(16) а зачем у вас ПодключитьсяКБазе? Один раз подключились в начале и всё, дальше пользуйтесь переменной Соединение.
22 НЕА123
 
11.03.21
13:29
(20)
<<Массив.Добавить(номПоиск)
>>Массив.Добавить(Строка.Артикул)
видимо так (18) думается...
23 KazSever
 
11.03.21
13:30
(21) Соединение = ПодключитьсяКбазе(); -
эту строку я уже убрал.
24 Галахад
 
гуру
11.03.21
13:30
(21) Круто! Два разных подключения.
25 Галахад
 
гуру
11.03.21
13:33
(23) Ну тогда в (0) все должно работать.
26 KazSever
 
11.03.21
13:33
Вот такой вид сейчас

Функция ПолучитьСписокНоменклатурCOM(Соединение)
    
    Массив = Новый Массив;
    
    Для Каждого Строка Из ПолучитьСписокНоменклатур() Цикл
        
        номПоиск = Соединение.Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Строка.Артикул);
        
        Если ЗначениеЗаполнено(номПоиск.Description) Тогда
            Массив.Добавить(номПоиск);
        КонецЕсли;
    КонецЦикла;
    
    Массив_СОМ = Новый COMSafeArray(Массив, "VT_VARIANT");
    
    Возврат Массив_СОМ;
    
КонецФункции
27 hhhh
 
11.03.21
13:34
(19) ребята правы в общем-то. Нафига

НайтиПоРеквизиту("Артикул", Строка.Артикул);

тем более в той, а не в этой базе.

тогда уже лучше сразу в запросе Артикулы сравнивать, быстрее получится.
28 Галахад
 
гуру
11.03.21
13:36
(27) Так-то да, но и через массив ссылок должно работать.
29 hhhh
 
11.03.21
13:37
это какой-то идиотизм

Массив_СОМ = Новый COMSafeArray(Массив, "VT_VARIANT");

у вас же сначала правильно было

Массив = Соединение.NewObject("Массив");
30 KazSever
 
11.03.21
13:38
(29) Пробую же, как было - не работает, собственно и это тоже. Такая же ошибка.
31 НЕА123
 
11.03.21
13:40
если (18) верно то может
Массив.Добавить(номПоиск.Ссылка);
?
32 KazSever
 
11.03.21
13:40
(27) здесь есть мысль выводить данные о не найденных номенклатурах, а в  запросе так не получится.
33 Вафель
 
11.03.21
13:40
у тебя в массиве левые значения
34 KazSever
 
11.03.21
13:42
35 KazSever
 
11.03.21
13:43
вот что COMSafeArray хранит в себе, на сколько я понимаю "ссылка" там нет, а просто "ref" - тим тот же - СОМобъект
36 KazSever
 
11.03.21
13:44
*тип
37 Галахад
 
гуру
11.03.21
13:45
Запрос, наверное кривой.
38 Вафель
 
11.03.21
13:45
у тебя объекты чтоли там, а не ссылки?
39 KazSever
 
11.03.21
13:45
40 hhhh
 
11.03.21
13:46
(36) вот это может?

      Если ЗначениеЗаполнено(номПоиск.Description) Тогда
  
пишите всё по-русски, не надо мудрить. вот так можно

      Если НЕ номПоиск.Пустая() Тогда
41 Вафель
 
11.03.21
13:47
а как параметр устанавливаешь?
42 Почему 1С
 
11.03.21
13:48
Покажи сам запрос и установку параметров в запросе. Ну и я надеюсь ты убрал строку  Соединение = ПодключитьсяКбазе(); в функции формирования массива
43 KazSever
 
11.03.21
13:48
(40) ну так-то значения есть в массиве и они верные
44 PR
 
11.03.21
13:49
(10) Оно
45 KazSever
 
11.03.21
13:49
(42) Условие запроса - https://wampi.ru/image/RfJufvP
46 PR
 
11.03.21
13:50
Что вы обсуждаете после (10)?
47 KazSever
 
11.03.21
13:51
Установка параметра https://wampi.ru/image/RfJuN66
48 KazSever
 
11.03.21
13:52
(46) Обсуждаем, что не так и почему не взлетает ))
49 Почему 1С
 
11.03.21
13:53
(47) веерни Массив = Соединение.NewObject("Массив");
50 PR
 
11.03.21
13:53
(47) Что это за дичь?
Что мешает просто создать как в (10) и заполнить COM массив?
51 hhhh
 
11.03.21
13:54
(45) так у тебя массив_COM с соединением вообще никак не связан, чего это вообще налепел несусветное.
52 PR
 
11.03.21
13:54
+(50) Если речь идет про COM масив, откуда у тебя просто массив вообще в принципе, нахрена он тебе?
53 PR
 
11.03.21
13:55
(51) Настоящему идейцу это до луны, да, зачем читать (10), и так сойдет
54 KazSever
 
11.03.21
13:55
(51) слепил как смог, информации толком нет
55 Вафель
 
11.03.21
13:56
(53) у тс изначально было (10)
56 PR
 
11.03.21
13:56
(54) Нет информации, серьезно?
Ты издеваешься что ли, весь инет завален
Прочитай (10) что ли еще раз и загугли текст из (10)
57 Галахад
 
гуру
11.03.21
13:56
Упрости запрос и проверь:

    ВЫБРАТЬ
        Т.Ссылка КАК Ссылка
    ИЗ
        Справочник.Номенклатура КАК Т
    ГДЕ
        Т.Ссылка В(&Список)
58 PR
 
11.03.21
13:57
(55) У ТС изначально в функции Соединение делается, а кто сказал, что оно сохраняется после выхода из процедуры?
59 KazSever
 
11.03.21
13:58
(56) Сам почитай мой вопрос и там все увидишь
60 hhhh
 
11.03.21
13:58
(56) так у него в (0) так и было. Только он 2 соединения навоял.
61 PR
 
11.03.21
13:58
(59) Это лучше ты почитай (58)
62 KazSever
 
11.03.21
13:59
(60) Это было убрано уже давно
63 PR
 
11.03.21
13:59
(60) Ну да, по большому сходил на работе, а задницу подтер дома, бывает
64 PR
 
11.03.21
14:00
(62) Так ты бы написал тогда актуальный код и полностью, а то надоело следить за обрывочным описанием версий
65 PR
 
11.03.21
14:00
+(64) В (26) код последний или уже нет?
66 hhhh
 
11.03.21
14:01
(62) так ты вообще асё похерил. А мы говорили убрать только одну строчку из (0).
67 PR
 
11.03.21
14:01
Капец, в ветке куча говна, в каждом варианте свои ошибки, но когда на них указываешь, тычат в другой вариант, где этой ошибки нет, зато другие есть
Серьезно?
68 PR
 
11.03.21
14:02
Стаж 12 лет, не верю
69 PR
 
11.03.21
14:06
ТС, исключи из уравнения ту причину, что может быть у тебя что-то теряется из-за использования процедуры, напиши линейный код и выложи сюда актуальную версию
70 PR
 
11.03.21
14:07
+(69) _Полную_ версию, включая создание соединения, подготовку массива и выполнение запроса
71 KazSever
 
11.03.21
14:19
(0) Косяк был в "Соединение = ПодключитьсяКбазе();", вернул как было без него и все взлетело. Почему-то не заметил сразу и пошел по другому пути.
Всем спасибо - вопрос закрыт!
72 PR
 
11.03.21
14:20
(71) Удачи
73 breezee
 
11.03.21
17:56
Запилите веб сервис. Это быстро и удобно. Правда
74 Вафель
 
11.03.21
18:00
это при условии что уже веб сервер стоит