Имя: Пароль:
1C
 
Вопрос по 1С7.7. Запрос.Товарисчи помогите...
0 Sych_Sych_Sych
 
29.09.08
08:29
Задача стоит такая нужно отобрать номенклатуру у которой производитель "Произв" и она есть на остатках.
По отдельности эти условия в запросе работают,т.е. отдельно показать остатки номенклатуры больше 0,или отдельно показать номенклатуру с производителем  "Произв" а как вместе сделать не получается. Вот мой запрос он тупо берет и все остатки мне вываливает

ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Обрабатывать НеПомеченныеНаУдаление;
|ЗначениеСвойства = Справочник.СвойстваНоменклатуры.ЗначениеСвойства;
|Номенклатура = Справочник.СвойстваНоменклатуры.Владелец,Регистр.ОстаткиТМЦ.Номенклатура;
|Количество = Регистр.ОстаткиТМЦ.Количество;    
|Функция КоличествоКонОст = КонОст(Количество);
|Группировка Номенклатура;
|Условие((ЗначениеСвойства=Произв) И (Количество>0));
|"

Подскажите что я не так делаю.Плиз
1 Дятелище 1с
 
29.09.08
08:31
+групировка
2 Дятелище 1с
 
29.09.08
08:31
+групПировка
3 dk
 
29.09.08
08:31
1. хде дата?
2. (Количество>0) замени на (Запрос.КоличествоКонОст>0)
4 Sych_Sych_Sych
 
29.09.08
08:34
1)Дата и не нужна он рассчитает на точку актуальности
2)(Запрос.КоличествоКонОст>0) не работает  выходная ТЗ  вообще пустая
5 Sych_Sych_Sych
 
29.09.08
08:34
Дятелище 1с
6 Sych_Sych_Sych
 
29.09.08
08:34
Дятелище 1с
а какая +группировка по чем
7 dk
 
29.09.08
08:34
(2) +1
8 Sych_Sych_Sych
 
29.09.08
09:05
Ауу, ГУРУ 1с где ВЫ?ну ооочень надо
9 Темный Эльф
 
29.09.08
09:14
Сделай первый запрос для получения списка номенклатуры, а затем подставь этот список во второй запрос. И вот это "Количество>0" работать не будет в принципе. Кроме того, в запросе к регистру с функцией НачОст и так получишь только те позиции, которые имеют остатки. Если, конечно будешь делать запрос только к регистру.
10 Sych_Sych_Sych
 
29.09.08
09:17
Я тоже уже начал подумывать чтоб разбить на два запроса,ведать в 7-ке нельзя данную задачу решить одним запросом
спасибо за совет
11 Ёпрст2
 
29.09.08
09:19
(10) Можно. Можно одним запросом.
12 Sych_Sych_Sych
 
29.09.08
09:21
(11)
Подскажи буду благодарен:)
13 Ёпрст2
 
29.09.08
09:23
(12) Если производитель - ОсновноеСвойство Номенклатуры, то просто условие, если это одно из значений Свойств Номенклатуры - внешняя функция в условии запроса.
14 Sych_Sych_Sych
 
29.09.08
09:27
"Производитель" это одно из свойств номенклатуры.
"внешняя функция в условии запрос" как эта фуркция должна выглядетьт
15 Sych_Sych_Sych
 
29.09.08
09:27
"Производитель" это одно из значений свойств номенклатуры.
16 Guk
 
29.09.08
09:28
(0) будь здоров...
17 Ёпрст2
 
29.09.08
09:31
Какие ленивые все в понедельник...
Ща кофий выпью, напишу.
18 Sych_Sych_Sych
 
29.09.08
09:33
(17)
Жду с нетерпением:)
19 Ёпрст2
 
29.09.08
09:39
Перем Спр;
//ВыбВидСв - выбранный Элемент справочника ВидыСвойств

Функция ПроверитьПроизводителя(Номенклатура)
  Спр.ИспользоватьВладельца(Номенклатура);
  Возврат Спр.НайтиПоРеквизиту("ВидСвойства",ВыбВидСв,0);
КонецФункции
.........
|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
|Количество = Регистр.ОстаткиТМЦ.Количество;    
|Функция КоличествоКонОст = КонОст(Количество);
|Группировка Номенклатура;
|Условие(ПроверитьПроизводителя(Номенклатура)=1);
........
Спр = СоздатьОбъект("СвойстваНоменклатуры");
20 Ёпрст2
 
29.09.08
09:41
+19 А вот по Значениям свойств, такой фокус просто так не выйдет, ибо Зн.Свойств подчиненный, и владелец у него - виды свойств....
21 Sych_Sych_Sych
 
29.09.08
09:42
(19)
Прикольно!спасибо, сейчас буду проверять
22 Ёпрст2
 
29.09.08
09:42
+20 И нам отсюда не видно, откуда ты своего Произв взял.
23 Sych_Sych_Sych
 
29.09.08
09:45
Производитель берется с из элемента формы(Поля ввода) тип Справочник.ЗначениеСвойств
24 Ёпрст2
 
29.09.08
09:46
Хотя тоже можешь:
Функция ПроверитьПроизводителя(Номенклатура)
  Спр.ИспользоватьВладельца(Номенклатура);
  Возврат Спр.НайтиПоРеквизиту("ЗначениеСвойства",Произв,0);
КонецФункции
25 Ёпрст2
 
29.09.08
09:47
(23) См. 24.
26 Sych_Sych_Sych
 
29.09.08
09:48
ок спс
27 Sych_Sych_Sych
 
29.09.08
10:07
(25)
еще сделал вторым способом сейчас сравню что по скорости быстрее

   ТЗ=СоздатьОбъект("ТаблицаЗначений");
   Список=СоздатьОбъект("СписокЗначений");
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Обрабатывать НеПомеченныеНаУдаление;
   |ЗначениеСвойства = Справочник.СвойстваНоменклатуры.ЗначениеСвойства;
   |Номенклатура = Справочник.СвойстваНоменклатуры.Владелец;
   |Группировка Номенклатура;
   |Условие(ЗначениеСвойства=Произв);
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   Запрос.Выгрузить(ТЗ);  
   
   ТЗ.ВыбратьСтроку(,"ТЗ 1-я с товаром по группе");
   
   ТЗ.Выгрузить(Список,2,ТЗ.КоличествоСтрок(),1);
   Список.ВыбратьЗначение(,"А это уже список значений");

   ТекстЗапроса ="//{{ЗАПРОС(нов)
   |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
   |Количество = Регистр.ОстаткиТМЦ.Количество;
   |Функция КоличествоНачОст = КонОст(Количество);
   |Группировка Номенклатура;
   |Условие(Номенклатура В Список);
   |";//}}ЗАПРОС

   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   Запрос.Выгрузить(ТЗ);  
   
   ТЗ.ВыбратьСтроку(,"ТЗ 2-я с товаром и остатками");
28 Sych_Sych_Sych
 
29.09.08
11:24
Мой способ оказался более быстрее минут 25 для 15000 номенклатуры,по сравнению с 1 способом минуты 3 для 60 ноенклатуры
Все равно спасибо,узнал как внешними ф-ми в запросе пользоваться
29 Mikle Shaman
 
29.09.08
11:38
Вообще-то, если совсем коректно, то лучше пробежать один раз по справочнику номенклатуры и запихать в СписокЗначений все элементы, удовлетворяющие заданному условию. А в запросе просто проверять переменную на вхождение в СписокЗначений. ИМХО, так быстрее и правильнее.