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

Параметр в 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

Поиск