Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 сен 2021, 09:33

Параметр в Com запрос

Автор Зингер, 24 дек 2016, 22:24

0 Пользователей и 1 гость просматривают эту тему.

Зингер

Есть простенький код, выбирает и регистра остатки:


&НаКлиенте
Процедура ПроверитьОстаткиВ1(Команда)
Запрос =КомОбъект.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ТоварыНаСкладахОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Номенклатура = &Номенклатура
| И Склад = &Склад
| И Характеристика = &Характеристика) КАК ТоварыНаСкладахОстатки";

Запрос.УстановитьПараметр("Номенклатура",Объект.Номенклатура);
Запрос.УстановитьПараметр("Склад",Объект.Склад);
Запрос.УстановитьПараметр("Характеристика",Объект.Характеристика);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;
КонецПроцедуры


Получаю ошибку
Цитировать{Форма.Форма.Форма(65)}: Ошибка при вызове метода контекста (Выполнить)
   РезультатЗапроса = Запрос.Выполнить();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.5.1460): {(6, 17)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
Номенклатура <<?>>= &Номенклатура

Как передать параметры в такой запрос?



LexaK

при выполнении запросов по внешнему соединению, можно передавать параметры простых типов
Строка, Число, Дата, ...

например товар можно искать проверять не по ссылке &Номенклатура, а по коду, вот ваш пример


    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    ТоварыНаСкладахОстатки.КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(
    |            ,
    |            Номенклатура.Код = &НоменклатураКод
    |                И Склад.Код = &СкладКод
    |                //И Характеристика = &Характеристика
    |          ) КАК ТоварыНаСкладахОстатки";
   
    Запрос.УстановитьПараметр("НоменклатураКод",Объект.Номенклатура.Код);
    Запрос.УстановитьПараметр("СкладКод",Объект.Склад.Код);


ссылками тоже можно оперировать, но при этом надо четко представлять что и как выделаете,
как подсказка
превращаете ссылку в строку, передаете ее в параметры/переменные кода выполняемого во внешнем соединении, там выполняете обратное превращение из строки в ссылку, к сожалению только так.

и это при условии что у одних и тех-же элементов одинаковые ссылки (ГУИДы)
ответ Понравился? (в смысле пригодился?)

Зингер

Запрос.УстановитьПараметр("НоменклатураКод",Объект.Номенклатура.Код);

Цитировать{Форма.Форма.Форма(62)}: Поле объекта не обнаружено (Код)
   Запрос.УстановитьПараметр("Номенклатура",Объект.Номенклатура.Код);

LexaK

Ну да, это же НаКлиенте!
попробуйте НаСервере это сделать!
(ой даже не знаю, все у вас так сложно)
ответ Понравился? (в смысле пригодился?)

sertak

Вы на клиенте, коды объектов, раз уж вы будете искать по ним, предварительно придется получить из какой-нибудь серверной функции.

Зингер

Цитата: LexaK от 24 дек 2016, 23:08
Ну да, это же НаКлиенте!
попробуйте НаСервере это сделать!
(ой даже не знаю, все у вас так сложно)
КомОбъект определен на Клиенте. Соответственно сервер его не видит.

LexaK

так я о чем и говорю, что настоящие герои ни когда прямо не ходят, все через ж... норовят.
кто вам мешает ВСЕ сделать на сервере?
ответ Понравился? (в смысле пригодился?)

sertak

COM будет виден везде, проблемы могут быть только если у вас 64-битный сервер приложений 1С, но это тоже решаемо.
Но раз на клиенте, и хорошо. Добавьте функцию с директивой компилятора &НаСервере для получения кода товара по ссылке и передавайте в параметр запроса:

Запрос.УстановитьПараметр("Номенклатура",ПолучитьКодНоменклатуры(Объект.Номенклатура));
...

&НаСервереБезКонтекста
Функция ПолучитьКодНоменклатуры(Номенклатура)
    Возврат Номенклатура.Код;
КонецФункции


Но, конечно, лучше перенести работу с запросами на сервер.

Зингер

Цитата: sertak от 24 дек 2016, 23:28
COM будет виден везде, проблемы могут быть только если у вас 64-битный сервер приложений 1С, но это тоже решаемо.
Но раз на клиенте, и хорошо. Добавьте функцию с директивой компилятора &НаСервере для получения кода товара по ссылке и передавайте в параметр запроса:

Запрос.УстановитьПараметр("Номенклатура",ПолучитьКодНоменклатуры(Объект.Номенклатура));
...

&НаСервереБезКонтекста
Функция ПолучитьКодНоменклатуры(Номенклатура)
    Возврат Номенклатура.Код;
КонецФункции


Но, конечно, лучше перенести работу с запросами на сервер.
Запрос отработал. Вернул 0. На самом деле там больше нуля.

sertak

Отладчик вам поможет. Какой код передан в параметр? Также попробуйте выполнить запрос во внешней базе в консоли запросов.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск