Имя: Пароль:
1C
1C 7.7
v7: Как связать запрос и с элементом справочника полученного методом выбрать?
,
0 Gugolovski
 
19.05.17
07:20
ОстРозн = СоздатьОбъект("Запрос");
СпрНоменклатура  = СоздатьОбъект("Справочник.Номенклатура");
    
    ТекстОстРозн =
    "
    |Фирма = Регистр.ОстаткиТМЦ.Фирма;
    |Товар = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Колво = Регистр.ОстаткиТМЦ.Количество;
    |Цена  = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |";    
    
Если ОстРозн.Выполнить(ТекстОстРозн) = 0 Тогда
        Сообщить("Запрос не выполнен");
        Возврат;
КонецЕсли;      
  
СпрНоменклатура.Выбрать("Выбираем товар","ДляВыбора"); //вот тут я выбрал элемент справочника и как обратиться к запросу

Сообщить("хочу цену");

**************************************
Не понимаю как запросы работают. Как можно связать запрос и элемент справочника?
1 Zmich
 
19.05.17
07:32
(0). Выбрать сделать перед запросом. В тексте добавить строку
|Условие (Товар = СпрНоменклатура);
Помимо этого, в тексте запроса по регистру нужна функция (например, КонОст).
2 Gugolovski
 
19.05.17
07:43
Изменил на
***********************    
...
СпрНоменклатура.Выбрать("Выбираем товар","ДляВыбора");
    ТекстОстРозн =
    "
    |Фирма = Регистр.ОстаткиТМЦ.Фирма;
    |Товар = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Колво = Регистр.ОстаткиТМЦ.Количество;
    |Цена  = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |Функция Количество = КонОст(Колво);
    |Условие (Товар = СпрНоменклатура);    
    |";
    
    
    Если ОстРозн.Выполнить(ТекстОстРозн) = 0 Тогда
        Сообщить("не работает");
        Возврат;
    КонецЕсли;
        
    Сообщить(ОстРозн.Цена);

//*********************************
но это не работает. Почему так?
3 Zmich
 
19.05.17
07:47
(2). Еще нужна группировка в запросе.
|Группировка Товар;

Потом обход результата запроса:

Пока ОстРозн.Группировка(1) = 1 Цикл
  Сообщить(ОстРозн.Цена);
КонецЦикла;
4 VladZ
 
19.05.17
07:55
Во-первых, имена переменных должны быть читаемы. Что такое "ОстРозн" ?  Неужели трудно написать "ЗапросПоОстаткам"? Это повышает читабельность кода и снижает количество ошибок.

Во-вторых, почитай букварь по запросам.  Делаешь запрос - укажи группировку. Эта та  выборка, по которой ты будешь потом обходить запрос. Запросы в 7.7 отличаются от восьмерочных (и тем более от SQL). Тут наскоком не проскочишь.

"Как можно связать запрос и элемент справочника?" - вот тут вообще не понял, что хотел. Другими словами опиши.
5 Zmich
 
19.05.17
08:01
Да, еще такой момент с выбором в диалоге. Надо так:
Если СпрНоменклатура.Выбрать("Выбираем товар","ДляВыбора") = 1 Тогда
ТекНоменклатура = СпрНоменклатура.ТекущийЭлемент();
КонецЕсли;

И в тексте запроса поменять переменную в Условии.
6 Масянька
 
19.05.17
08:02
(4) Вангую: запрос по указанной номенклатуре.
7 Gugolovski
 
19.05.17
08:16
Все верно Масянька. ) Попробовал вся привести в соответствии с вышеуказанными рекомендациями (насколько я их понял). + Указал в диалоге склад (ВыбСклад).  Получилось так:
//*******************************
Запрос = СоздатьОбъект("Запрос");
    СпрНоменклатура  = СоздатьОбъект("Справочник.Номенклатура");
    
    Если СпрНоменклатура.Выбрать("Выбираем товар","ДляВыбора") = 1 Тогда
    ТекНоменклатура = СпрНоменклатура.ТекущийЭлемент();
    КонецЕсли;

    ТекстЗапроса =
    "    
    |Товар = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Колво = Регистр.ОстаткиТМЦ.Количество;
    |Цена  = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |Функция Количество = КонОст(Колво);
    |Группировка Товар;
    |Условие (Товар = ТекНоменклатура);
    |Условие(Склад = ВыбСклад);    
    |";
    
    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Сообщить("не работает");
        Возврат;
    КонецЕсли;
    
    Пока Запрос.Группировка(1) = 1 Цикл
      Сообщить(Запрос.Цена);
    КонецЦикла;
        
//**********************************************
Цена вышла, однако, в окне сообщений ответ вышел в 4 строки:
0
0
0
23

, где 23 - это реальная цена. А что значат нули?
8 Масянька
 
19.05.17
08:17
(7) Я сегодня - колдунья :)
9 Gugolovski
 
19.05.17
08:20
(8) Коли так, покрошишь парочку жаб в ступке, чтоб все работало?
10 Масянька
 
19.05.17
08:21
(9) Жабки закончились...
11 Gugolovski
 
19.05.17
08:24
(10) Несколько смущают нули в окне сообщений, но в принципе  получил, что хотел - запрос работает. Спасибо большое за помощь.
12 Zmich
 
19.05.17
08:25
(9). Похоже, учитываются группы вышестоящих уровней. Вот так попробуй:
|Группировка Товар без групп;
13 Масянька
 
19.05.17
08:26
(11)     ТекстЗапроса =
    "    
    |Товар = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Колво = Регистр.ОстаткиТМЦ.Количество;
    |Цена  = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |Функция Количество = КонОст(Колво);
    |Группировка Товар Без Групп;
    |Группировка Цена;
    |Условие (Товар = ТекНоменклатура);
    |Условие(Склад = ВыбСклад);    
    |";
    
    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Сообщить("не работает");
        Возврат;
    КонецЕсли;
    
    Пока Запрос.Группировка(1) = 1 Цикл
    Пока Запрос.Группировка(2) = 1 Цикл
      Сообщить(Запрос.Цена);
    КонецЦикла;
    КонецЦикла;
Так - есть нули?
14 Gugolovski
 
19.05.17
08:33
(13) Все верно - нулей более нет. А говорила кончились))
15 Масянька
 
19.05.17
08:36
(14) С тебя - метла + серебряная ступа.
16 Gugolovski
 
19.05.17
08:38
Я что значат в группировках цифры один и два? Группировка(1), Группировка(2). В описании указано так: <Группировка> - выражение, содержащее номер или имя группировки.
Правильно ли я понимаю что это порядковый номер, так как они были указаны в запросе?
И возможно ли такое написание: Группировка("Товар Без Групп"), Группировка("Цена")?
17 Масянька
 
19.05.17
08:40
(16) Первая группировка по товару, вторая по цене.
Можно писать: Группировка ("Товар"), Группировка ("Цена").

Когда ждать метлу и ступу?
18 Смотрящий
 
19.05.17
08:44
(17) Через три года ;)
19 vcv
 
19.05.17
08:48
Если нужно сначала запросом получить все цены, а потом для разных номенклатур брать цену из запроса, то есть Получить

Получить(<?>)
Синтаксис:
Получить(<ЗначениеГруппировки1>,...,<ЗначениеГруппировкиN>)
Назначение:
Прямое позиционирование на запись в выборке по конкретным значениям группировок.
Возвращает: 1 - если запись найдена, 0 - иначе.
Параметры:
<ЗначениеГруппировкиN> - значение параметра N-ой группировки запроса.
Замечание:
Опущенные при вызове последние значения группировок должны заменяться запятыми. Если при вызове метода опущены все параметры, то выборка позиционируется на самое начало временного набора данных, на строку итогов. После выполнения метода Получить может осуществляться дальнейший обход выборки вызовами метода Группировка.
20 Gugolovski
 
19.05.17
08:49
(17) Как говорится будете у нас на Колыме.. Приезжай в Находку, будет и метла и ступка и стопка
21 vcv
 
19.05.17
08:49
Зачастую более просто и эффективно не обращаться к результатам запроса, а выгрузить его в таблицу значений и искать уже в ней нужное.
22 Gugolovski
 
19.05.17
08:55
(21) Спасибо
23 пипец
 
19.05.17
09:14
как не странно но в 7-ке есть конструкторы запросов ...
24 Gugolovski
 
19.05.17
10:02
Еще один вопрос возник в догонку.
Изначально склад выбирался в диалоге, но сам выбор склада избыточен.
Решил удалить диалог и прописать нужный склад непосредственно в обработку.
//***********************
СпрСклады = СоздатьОбъект("Справочник.Склады");
СпрСклады.НайтиПоКоду("00004");
ВыбСклад =  СпрСклады.Наименование;
//***********************
Однако после этого запрос стал выдавать нулевую цену. Почему так?
25 Масянька
 
19.05.17
10:04
(24) Потому что не "ВыбСклад =  СпрСклады.Наименование;@? а "ВыбСклад =  СпрСклады.ТекущийЭлемент();"
Метлы и ступы с тебя мало :)
26 Gugolovski
 
19.05.17
10:09
(25) ага. Я так и знал))
27 VladZ
 
19.05.17
10:12
(24) ВыбСклад =  СпрСклады.Наименование;  -> после фразы такой падаваном тебе  быть у Масяньки год еще!
28 Масянька
 
19.05.17
10:14
(27) Чёй-то падаваном? Падавана еще заслужить надо.
Котом. Мышей ловить и крыс.
29 Масянька
 
19.05.17
10:15
+ (28) И влюбленных по ночам распугивать.