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

Ошибка выполнения запроса к номенклатуре

Автор info_infoman, 19 окт 2015, 13:58

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

info_infoman

Добрый день платформа 8.3
запрос такой :

Запрос = Новый Запрос(
"ВЫБРАТЬ  Номенклатура.Код
|ИЗ
|  Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Код = &Код");


Запрос.УстановитьПараметр("Код", Код);
ВыборкаПоТоварам = Запрос.Выполнить().Выбрать();


работает этот куско кода в регламентном задании в общем модуле
ошибка при выполнении регламентного задания следующая
Цитировать
{ОбщийМодуль.ПодключаемоеОборудованиеOfflineАвто.Модуль(720)}: Ошибка при вызове метода контекста (Выполнить)
      ВыборкаПоТоварам = Запрос.Выполнить().Выбрать();
по причине:
{(5, 2)}: Поле не найдено "Номенклатура.Код"
<<?>>Номенклатура.Код = &Код

Kironten

1с не любит когда применяются имена переменных используемые системой.
Поменяйте "Номенклатура" на, например "СпрНоменклатура".
А вообще крайне непонятное действие:
Вы пытаетесь получить код элемента номенклатуры, и для этого передаете в запрос этот самый код номенклатуры. Бессмыслица.

Rasty

Создайте запрос конструктором запроса и по старинке
Запрос = Новый Запрос;
Запрос.Текст =
"Текст Запроса"
Помогли - Скажи спасибо! Решил сам - поделись решением!
:)

info_infoman

Извините просто мистика какаято.....
запрос вдруг заработал
стал его развивать до нужной кондиции

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

вот код
Запрос = Новый Запрос(
"ВЫБРАТЬ  Номенклатура.Код,
|  Номенклатура.Наименование,
|  Номенклатура.ЕдиницаИзмерения
|ИЗ
|  Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Код = &Код");

Для каждого СтрокаТЧ Из МассивДанных Цикл
Запрос.УстановитьПараметр("Код", СтрокаТЧ.Код);
ВыборкаПоТоварам = Запрос.Выполнить().Выбрать();

//////////////// запись последнего номера транзакции////
Документ1 = Новый ТекстовыйДокумент(); Документ1.Прочитать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);
Документ1.ЗаменитьСтроку(1, СтрокаТЧ.Код);
Документ1.Записать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);


в этом коде я запросил 3 параметра
и при это программа не ругнулась
и вывела в файл номер код номенклатуры искомый в справочнике
код этот = 362 и он точно там есть

однако когда делаю вот так:

Запрос = Новый Запрос(
"ВЫБРАТЬ  Номенклатура.Код,
|  Номенклатура.Наименование,
|  Номенклатура.ЕдиницаИзмерения
|ИЗ
|  Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Код = &Код");

Для каждого СтрокаТЧ Из МассивДанных Цикл
Запрос.УстановитьПараметр("Код", СтрокаТЧ.Код);
ВыборкаПоТоварам = Запрос.Выполнить().Выбрать();

//////////////// запись последнего номера транзакции////
Документ1 = Новый ТекстовыйДокумент(); Документ1.Прочитать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);
Документ1.ЗаменитьСтроку(1, ВыборкаПоТоварам.Наименование);
Документ1.Записать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);

выводит пустоту
да вообщем то любое поле пустое какое не запросить пустота
даже код(ВыборкаПоТоварам.код)

мистика:mellow:

Kironten

Не мистика, а перебирать выборку надо.
Кто будет делать ВыборкаПоТоварам.Следующий() за вас?

info_infoman

блин неужели дело в том что СтрокаТЧ.Код это не есть число(тип данных)
сейчас проверю
Добавлено: 19 окт 2015, 15:16


Цитата: Kironten от 19 окт 2015, 15:14
Не мистика, а перебирать выборку надо.
Кто будет делать ВыборкаПоТоварам.Следующий() за вас?
а это обязательно если код - уникальный
и я конкретно запрашиваю конкретный код?

перебирать обязательно?
или можно применить ВЫБРАТЬ 1

Vladimir_Sh

info_infoman, простите но вам СЮДА или если нет ИТС тогда СЮДА
Если я Вам помог, нажми - Спасибо!

Kironten

Цитата: info_infoman от 19 окт 2015, 15:15
блин неужели дело в том что СтрокаТЧ.Код это не есть число(тип данных)
сейчас проверю
Добавлено: 19 окт 2015, 15:16


Цитата: Kironten от 19 окт 2015, 15:14
Не мистика, а перебирать выборку надо.
Кто будет делать ВыборкаПоТоварам.Следующий() за вас?
а это обязательно если код - уникальный
и я конкретно запрашиваю конкретный код?

перебирать обязательно?
или можно применить ВЫБРАТЬ 1

Вы, похоже не совсем понимаете работу с результатом запроса.

   
Для каждого СтрокаТЧ Из МассивДанных Цикл
    Запрос.УстановитьПараметр("Код", СтрокаТЧ.Код);
    ВыборкаПоТоварам = Запрос.Выполнить().Выбрать();
    ВыборкаПоТоварам.Следующий();//получите только первую запись, если она конечно есть.   
//////////////// запись последнего номера транзакции////
Документ1 = Новый ТекстовыйДокумент();               
Документ1.Прочитать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);
Документ1.ЗаменитьСтроку(1, ВыборкаПоТоварам.Наименование);
Документ1.Записать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);

Это при учете, что Вы все таки в запросе получили какие-либо данные.
И еще, запрос в цикле - грубейшая ошибка.

info_infoman

ЦитироватьВыборкаПоТоварам.Следующий();//получите только первую запись, если она конечно есть.

мне действительно нужна только одна строка

мне известен конкретный код номенклатуры
я его получаю в цикле

далее мне нужно сделать запрос и по этому коду вытащить из справочника конкретные параметры по номенклатуре

что касается есть данные или нет то они есть ибо если я не задаю в запросе конкретный код (ГДЕ Номенклатура=&Код)
то данные появляются а именно количество записей становится равной количеству записей в справочнике и кроме того в файл выгружается (если потом проходить массив в цикле) последняя запись из справочника

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

вот пример  выдает последний элемент в справочнике номенклатура с кодом 8:
   Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклат.Код,
| Номенклат.Наименование КАК Наименование,
| Номенклат.ЕдиницаИзмерения.Код
|ИЗ
| Справочник.Номенклатура КАК Номенклат";

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Документ1 = Новый ТекстовыйДокумент(); Документ1.Прочитать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);
Документ1.ЗаменитьСтроку(1,ВыборкаДетальныеЗаписи.Наименование);
Документ1.Записать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);

при этом количество записей в ВыборкаДетальныеЗаписи равно8

если же задаю запрос с конкретным кодом а именно кодом 8 или любым другим который точно есть в справочнике, то вместо наименования выгружается пустота, а количество записей равно 1

   Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклат.Код,
| Номенклат.Наименование КАК Наименование,
| Номенклат.ЕдиницаИзмерения.Код
|ИЗ
| Справочник.Номенклатура КАК Номенклат
|ГДЕ
| Номенклат.Код = &Код";

Запрос.УстановитьПараметр("Код", 8);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();

Документ1 = Новый ТекстовыйДокумент(); Документ1.Прочитать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);
Документ1.ЗаменитьСтроку(1, ВыборкаДетальныеЗаписи.Наименование); Документ1.Записать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);

Добавлено: 20 окт 2015, 08:17


вот скрины выполнения с отбором по коду и без отбора по коду
номенклатура с кодом 150


Добавлено: 20 окт 2015, 08:56


если же делаю запрос с заранее неправильным кодом то колличество записей равно 0!
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклат.Код,
| Номенклат.Наименование КАК Наименование,
| Номенклат.ЕдиницаИзмерения.Код
|ИЗ
| Справочник.Номенклатура КАК Номенклат
|ГДЕ
| Номенклат.Код = &Код";

Запрос.УстановитьПараметр("Код", 15000000000000000000000000);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
Документ1 = Новый ТекстовыйДокумент(); Документ1.Прочитать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);
Документ1.ЗаменитьСтроку(1,ВыборкаДетальныеЗаписи.Количество()); Документ1.Записать(ФайлОтчета+"transnumber.txt", КодировкаТекста.ANSI);

значит все таки мои запросы с кодом работают, просто не выводится результат, почему то (((

Теги:

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

Рейтинг@Mail.ru

Поиск