Имя: Пароль:
1C
1С v8
Не работает запрос
0 Альбатрос
 
13.08.12
07:06
Здрассьте!!! Задача: сделать запрос в нужный заказПоставщику в ТЧ по нужной номенклатуре. Сделал вот такой запрос:


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

   
       
       Если ТипЗнч(СтрокаТЧ.НовоеРазмещение) = Тип("ДокументСсылка.ЗаказПоставщику") тогда
                                       
           Запрос.УстановитьПараметр("ТекДок", СтрокаТЧ.НовоеРазмещение);
           Запрос.УстановитьПараметр("ТекНом",СтрокаТЧ.Номенклатура);
           Рез = Запрос.Выполнить();
           Если рез.Пустой() тогда
                Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе отсутствует данная номенклатура");
                Отказ = Истина;
            Иначе Выборка = рез.Выбрать();
                Если СтрокаТЧ.Количество > Выборка.Количество тогда
                    Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе не хватает кол-ва данной номенклатуры");
                    Отказ = Истина;
                КонецЕсли;
            КонецЕсли;
       КонецЕсли;
   
   
Вываливается ошибка:


Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.РезервированиеТоваров.МодульОбъекта(568)}: Поле объекта не обнаружено (Колво)

Что неправильно в запросе?
1 Красный рассвет
 
13.08.12
07:10
а где строка 568-то?
2 Альбатрос
 
13.08.12
07:11
(1) Неправильно скопировал. Ошибка в этой строке:
Если СтрокаТЧ.Количество > Выборка.Колво тогда
3 ZanderZ
 
13.08.12
07:13
(2) ты посмотри в отладчике что тебе выборка возвращает...
4 Красный рассвет
 
13.08.12
07:13
А где Выборка.Следующий() ?
5 Красный рассвет
 
13.08.12
07:16
Вообще надо было выбирать из таблицы Документ.ЗаказПоставщику.Товары, а не Документ.ЗаказПоставщику
6 Альбатрос
 
13.08.12
07:33
(4)(5) Спасибо! Оба замечания в тему. Все работает.
7 Альбатрос
 
13.08.12
07:42
Не все гладко. Почему то не срабатывает отбор по номенклатуре. Возвращает Выборка.Количество с типом Null, если нужной номенклатуры в ТЧ нет. Соответственно вываливается ошибка на: Если СтрокаТЧ.Количество > Выборка.Количество тогда

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.РезервированиеТоваров.МодульОбъекта(567)}: Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)



Новый текст запроса:

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

   
   
       
       Если ТипЗнч(СтрокаТЧ.НовоеРазмещение) = Тип("ДокументСсылка.ЗаказПоставщику") тогда
                                       
           Запрос.УстановитьПараметр("ТекДок", СтрокаТЧ.НовоеРазмещение);
           Запрос.УстановитьПараметр("ТекНом",СтрокаТЧ.Номенклатура);
           Рез = Запрос.Выполнить();
           Если рез.Пустой() тогда
                Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе отсутствует данная номенклатура");
                Отказ = Истина;
            Иначе Выборка = рез.Выбрать();
                Пока выборка.Следующий() цикл
                Если СтрокаТЧ.Количество > Выборка.Количество тогда
                    Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе не хватает кол-ва данной номенклатуры");
                    Отказ = Истина;
                КонецЕсли;
                КонецЦикла;
            КонецЕсли;
       КонецЕсли;


Что неправильно я указал в условии?
8 Wobland
 
13.08.12
07:54
Если СтрокаТЧ

запрос в цикле? где моя линейка..
9 Альбатрос
 
13.08.12
07:56
(8) Это тестовый. Чтоб понять как сделать отбор в табличной части. Почему, если в ТЧ отсутствует указанная номенклатура, выборка не пустая? более того, возвращает с типом значения Null
10 Красный рассвет
 
13.08.12
07:57
isnull (СУММА(ЗаказПоставщикуТовары.Количество),0)
11 Светлый Гений
 
13.08.12
07:59
Выборка не пустая, потому что нет группировочного поля, а есть только СУММА(ЗаказПоставщикуТовары.Количество). Если добавить группировочное поле, например ссылку на документ, то выборка станет пустой. По-моему так.
12 aleks-id
 
13.08.12
08:08
мой мозг испепелен сим волшебным кодом
13 Альбатрос
 
13.08.12
08:12
(11) Именно так, спасибо за разъяснение.
(12) Что неправильно?
14 Anastasiy
 
13.08.12
08:14
ЕСТЬNULL(твой параметр,0)
15 the_pal
 
13.08.12
08:17
или добавить условие:
Имеющие  СУММА(ЗаказПоставщикуТовары.Количество) >0
16 Альбатрос
 
13.08.12
08:19
Добавил группировку как посоветовали в (11), ненужные выборки исчезли. Но вариант с ЕСТЬNULL я тоже попробовал.
17 aleks-id
 
13.08.12
08:20
(13) да там же цикл в цикле!!!
18 Альбатрос
 
13.08.12
08:22
(17) Ну это да, я щас поправлю.
19 aleks-id
 
13.08.12
08:23
(18) смысл тогда делать такую ветку? надо было изначально правильно составить запрос _БЕЗ_ цикла вообще а вот потом спрашивать - а чё это у меня тут нулл??
20 Альбатрос
 
13.08.12
08:30
(19) Ну так ветка не про запрос в цикле, а про "чё это у меня тут нулл??". Две несвязанные проблемы. Тем более у меня пока трудности с тем, чтобы составить грамотный запрос, не пихая его в цикл. Но я над этим работаю, и благодарен, что народ мне здесь помогает, и надеюсь будет помогать в будущем.
21 aleks-id
 
13.08.12
08:35
(20) вот и надо было тогда спросить: помогите избавиться от циклов. тебе бы посоветовали тогда как запрос сделать грамотно и как выбрать только неправильные строки для вывода сообщения об ошибке. копай в этом направлении
22 Альбатрос
 
13.08.12
08:45
Ну вот я и встал на месте. Не могу понять как связать ТЧ док-та резервирования с ТЧ запрашиваемых заказов. Запросом можно? Док-т не должен быть записан?
23 ILM
 
гуру
13.08.12
08:49
(22) Брррр... Давайте по порядку формулировать.
1) Есть заказы с ТЧ.
2) Есть документ резерва с ТЧ.
3) Нужно получить .... из заказы.ТЧ связанную по номенклатуре с резерв.ТЧ (ЛЕВОЕ/ПРАВОЕ/ВНУТРЕННЕЕ СОЕДИНЕНИЕ ... ПО ...), при условии (ГДЕ ...).

Так надо?
24 shuhard
 
13.08.12
08:56
(22)[Док-т не должен быть записан]
не обязательно
нет же ни каких проблем выгрузить ТЧ в ТЗ и подсунуть пакетному запросу
25 Альбатрос
 
13.08.12
09:32
(23) Ну да... только маленечко наоборот. Нужно из документа резервирования связать ТЧ с ТЧ указаного заказа. Я так понимаю, нужно использовать ЛЕВОЕ СОЕДИНЕНИЕ.
(24) Сейчас попробую
26 Альбатрос
 
14.08.12
06:58
Уважаемые, вернемся к моему вопросу. Наваял вот такое чудо:

ТабНом = Новый ТаблицаЗначений;
   Массив = Новый Массив;
   Массив.Добавить(Тип("Число"));
   Кч = Новый КвалификаторыЧисла(10,2);
   ОписаниеТиповЧ = Новый ОписаниеТипов(Массив,,,Кч);
   ТабНом.Колонки.Добавить("НомерСтроки", ОписаниеТиповЧ);
   ТабНом.Колонки.Добавить("Ном", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
   ТабНом.Колонки.Добавить("Колво", ОписаниеТиповЧ);
   ТабНом.Колонки.Добавить("Заказ", Новый ОписаниеТипов("ДокументСсылка.ЗаказПоставщику"));
   
   Для каждого СтрокаТЧ из товары цикл
       Если ТипЗнч(СтрокаТЧ.НовоеРазмещение) = Тип("ДокументСсылка.ЗаказПоставщику") тогда
           НовСтрока = ТабНом.Добавить();
           НовСтрока.НомерСтроки = СтрокаТч.НомерСтроки;
           НовСтрока.Ном = СтрокаТЧ.Номенклатура;
           НовСтрока.Колво = СтрокаТЧ.Количество;
           НовСтрока.Заказ = СтрокаТЧ.НовоеРазмещение;
       КонецЕсли;
       
   КонецЦикла;
   
   Запрос = Новый Запрос;
   МенеджерВТ = Новый МенеджерВременныхТаблиц;
   Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
   Запрос.текст = "ВЫБРАТЬ
   |    ТабНом.НомерСтроки КАК НомерСтроки,
   |    ТабНом.Ном КАК НомРезерва,
   |    ТабНом.Колво КАК КолвоРезерва,
   |    ТабНом.Заказ КАК Заказ
   |ПОМЕСТИТЬ ТабРезерва
   |ИЗ
   |    &Данные КАК ТабНом
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ТабРезерва.НомерСтроки,
   |    ТабРезерва.КолвоРезерва - СУММА(ЗаказПоставщикуТовары.Количество) КАК Разн,
   |    ТабРезерва.НомРезерва
   |ИЗ
   |    ТабРезерва КАК ТабРезерва
   |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
   |        ПО ТабРезерва.НомРезерва = ЗаказПоставщикуТовары.Номенклатура
   |            И ТабРезерва.Заказ = ЗаказПоставщикуТовары.Ссылка
   |
   |СГРУППИРОВАТЬ ПО
   |    ТабРезерва.НомерСтроки,
   |    ТабРезерва.КолвоРезерва,
   |    ТабРезерва.НомРезерва";
   
   Запрос.УстановитьПараметр("Данные", ТабНом);
   Рез = Запрос.Выполнить();
   Если рез.Пустой() тогда
       //Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе отсутствует данная номенклатура");
       //Отказ = Истина;
   Иначе Выборка = рез.Выбрать();
       Пока выборка.Следующий() цикл
           Сообщить(""+Выборка.НомРезерва +"   "+Выборка.Разн);
       КонецЦикла;
   КонецЕсли;


Выборка.Разн возвращает НУЛЛ. Скажите, что не так?
27 Светлый Гений
 
14.08.12
07:03
ЗаказПоставщикуТовары.Количество надо на Null проверять
28 Светлый Гений
 
14.08.12
07:03
у тебя ж там левое соединение
29 Альбатрос
 
14.08.12
07:07
(28) Ок, щас добавлю. Но! Он не связывается с соответствующим заказом, я что-то не то намудрил в условиях?
30 Альбатрос
 
14.08.12
07:29
Таки апну, укажите, пожалуйста на ошибку в запросе
31 Альбатрос
 
14.08.12
07:54
Вобщем, разобрался. Есть еще вопрос. Где и как использовать ВЫБОР в запросе, мне нужно завести какую-нибудь переменную в запросе и писать туда "найдено/не найдено" в зависимоти от значения Разн.
32 ZloyProger
 
14.08.12
07:59
Как-то так:
Выбор Когда ЕстьNULL(ТабРезерва.Разн, 0) = 0 Тогда "Не найдено"
Иначе "Найдено"
Конец Как КакаяНибудьПеременная
33 Альбатрос
 
14.08.12
08:06
(32)А куда вставить это условие?
34 Альбатрос
 
14.08.12
08:11
(32) Спасибо, вроде работает