Имя: Пароль:
1C
1C 7.7
v7: Черный запрос на нулевые остатки
,
0 Злопчинский
 
18.12.13
16:25
дано: ТиС, Спр.номенклатура, реквизит "Активен", число
требуется: получить запросом список всех позиций номенклатуры, по которым остаток (Регистр.ОстаткиТМЦ по конкретному складу) = 0 и Активен=2.
.
не получается..?
можно ли..?
63 Ёпрст
 
18.12.13
17:20
мот ты не тот запрос смотришь ?
:)
64 КонецЦикла
 
18.12.13
17:20
(57) Так ему ж действительно нужны нулевые остатки, а ты к регистру запрос делаешь
65 Злопчинский
 
18.12.13
17:20
Исходный запрос
.
    ТекстЗапроса = "
    |Номенклатура     = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад         = Регистр.ОстаткиТМЦ.Склад;
    |Количество     = Регистр.ОстаткиТМЦ.Количество;
    |Активен        = Регистр.ОстаткиТМЦ.Номенклатура.wms_Активен;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Номенклатура Без Групп;
    |Условие(Активен = 2);
    |Условие(Склад в ВыбСклад);
    |";

Дает Ненулевые остатки.
.
надо получить нулевые
66 Diter
 
18.12.13
17:21
я так правил один отчет а проверял другой как то.. было дело.
67 Ёпрст
 
18.12.13
17:21
(62) та не, там же в группировке ВСЕ указано..должен быть весь справочник..
68 Diter
 
18.12.13
17:21
(65) теперь второй запрос по справочнику с невхождением номенклатуры в результаты первого ;)
69 NS
 
18.12.13
17:22
(67) ВСЕ - это весь регистр, вся таблица остатков. У тебя в запросе нет справочника.
70 Ёпрст
 
18.12.13
17:22
(65) блин, по активен фильтр есть в этом запросе ????
Если есть, отфильтруешь по количеству на выходе и привет..
71 NS
 
18.12.13
17:22
Чтоб появился справочник, его через запятую нужно добавить в переменную запроса.
72 NS
 
18.12.13
17:24
Вообще, по остатку можно легко отфильтровав выгрузив в ТЗ (две сортировки), либо просто в процессе перебора.
73 Diter
 
18.12.13
17:25
(69( нет все это все которые есть в справочнике
74 Злопчинский
 
18.12.13
17:25
Вариант со "Все"
.
    ТекстЗапроса = "
    |Номенклатура     = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад             = Регистр.ОстаткиТМЦ.Склад;
    |Количество     = Регистр.ОстаткиТМЦ.Количество;
    |Активен        = Регистр.ОстаткиТМЦ.Номенклатура.wms_Активен;
    |Функция         КоличествоКонОст = КонОст(Количество);
    |Группировка     Номенклатура Без Групп Все;
    |Условие(Активен = 2);
    |Условие(Склад в ВыбСклад);
    |";

.
дает лабуду, попадают записи не удовлетворяющие условию Активен=2
75 NS
 
18.12.13
17:26
(73) В запросе нет справочника! Или 1С уже искусственным разумом обзавелась?
76 Ёпрст
 
18.12.13
17:26
(69) ошибаешься
77 Ёпрст
 
18.12.13
17:27
(75) :))
всё то ты позабывать начал. давно бы слепил тест на демке торговли..
78 Diter
 
18.12.13
17:27
(73) а номенклатура это не элемент справочника? ты стал забывать 7.7
79 Ёпрст
 
18.12.13
17:28
(74) одна из черепашек врёт
..блин Чебур, из-за тебя придётся пофигуратор открыть
80 NS
 
18.12.13
17:28
(78) Никогда в таком контексте оно не отрабатывало. Во всяком случае я ни разу не видел.
81 Diter
 
18.12.13
17:28
(80) всегда.
82 Злопчинский
 
18.12.13
17:28
ну так может кто из спецов (мнящих себя таковым) подцепиться по тиму вживую глянуть?
.
а то пока ни один вариант не работает
83 Diter
 
18.12.13
17:29
отчет остатки товаров режим "все товары" в нашей типовой
84 NS
 
18.12.13
17:29
Почитал доку - по доке действительно да. Вообщем хз :)
Но с условием, противоречащие условию - ну никак попадать не должны.
85 Diter
 
18.12.13
17:29
(82) два запроса или при обходе или вы ТЗ сортировкой. тоже не работают?
86 Злопчинский
 
18.12.13
17:29
(79) ну так цепляйся по тиму, блин вживую ко мне.
87 Злопчинский
 
18.12.13
17:30
(85) да давно уже сделал.
.
фишка-то - хочется одним запросом
88 Злопчинский
 
18.12.13
17:31
идея у мну какая была -
1. номенклатуру определить как регистр+справочник
2. активен определить как регистр+справочник
2. врубить "все"
3. отфильтровать Запрос.КоличествоКоност=0
.
а нифига не выходит
89 Злопчинский
 
18.12.13
17:32
ну, пока Епрст майстрячит у себя в пофигураторе - я отвлекусь минут на 10...
90 Diter
 
18.12.13
17:32
Запрос.КоличествоКоност=0 действительно не всегда срабатывает.
91 NS
 
18.12.13
17:33
(25) У тебя переменной модуля или формы "Активен" случайно нет?
92 Diter
 
18.12.13
17:34
мля.... я пока мониторил ветку вместо того чтобы на флешку записать новую версию md клиента сделал наоборот и на компе затер те изменения что сегодня вносил.... твою....
93 Злопчинский
 
18.12.13
17:38
(91) нет
94 Злопчинский
 
18.12.13
17:39
(92) это на тебе карма отыгралась, что ты мен ягнобил как фикся... так что следующий раз будь пердельно бздителен
95 Ёпрст
 
18.12.13
17:40
Действительно, ВСЕ ..убивает все фильтры к едрени фени :)
96 Ёпрст
 
18.12.13
17:41
Ну делай 2-мя запросами.. куле
:)
97 Ёпрст
 
18.12.13
17:41
не выёживайся..
или прямым запросом
98 Diter
 
18.12.13
17:44
(94) ;)~

копия осталась в newstru ;)
99 Ёпрст
 
18.12.13
17:46
Так Пробуй, по заветам Гука

       ТекстЗапроса = "
    |Номенклатура     = Справочник.Номенклатура.ТекущийЭлемент,Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад             = Регистр.ОстаткиТМЦ.Склад;
    |Активен= Справочник.Номенклатура.Активен,Регистр.ОстаткиТМЦ.Номенклатура.Активен;
    |Количество     = Регистр.ОстаткиТМЦ.Количество;
    |Функция         КоличествоКонОст = КонОст(Количество);
    |Группировка     Номенклатура Без Групп Все ВошедшиеВЗапрос;
    |Условие Активен =2;


вроде работает
100 Злопчинский
 
18.12.13
17:47
(98) это потому что я просто добрый и не мстительный
101 Злопчинский
 
18.12.13
17:48
(96) ну, блин, так не интересно, так я давно сделал уже
102 Ёпрст
 
18.12.13
17:48
Хотя не, не работает
..
кажет только, если номенклатурка участвовала в расчете регистра..
103 Злопчинский
 
18.12.13
17:50
а Если фильтр сделать самопальной функцией..?
104 Ёпрст
 
18.12.13
17:52
А ёпта.. всомнил я, как обходить это г.. делал же когда-то, обход регистров с нулевыми ресурсами..от жешь склероз.. на вот, наслаждайся:

       ТекстЗапроса = "
    |Номенклатура     = Справочник.Номенклатура.ТекущийЭлемент,Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад             = Регистр.ОстаткиТМЦ.Склад;
    |Активен= Справочник.Номенклатура.Активен,Регистр.ОстаткиТМЦ.Номенклатура.Активен;
    |Количество     = Регистр.ОстаткиТМЦ.Количество;
    |Функция         КоличествоКонОст = КонОст(Количество);
    |Функция         Вася = Сумма(1);
    |Группировка     Номенклатура Без Групп ;
    |Условие Активен =2;
105 Злопчинский
 
18.12.13
17:58
(104) и впихнуть условие на отсев ненулевых остатков?
106 Ёпрст
 
18.12.13
18:00
(105) это врят ли..
107 Ёпрст
 
18.12.13
18:01
можно сделать через ж..у во внешней функции, но это уже запрос в запросе будет..
108 Ёпрст
 
18.12.13
18:01
:)
109 Ёпрст
 
18.12.13
18:01
смысла нет, проще уж выгрузить итоги тогда, вс1ё быстрее
110 Злопчинский
 
18.12.13
18:02
(106) а нахрена ненулевые остатки? их бы сразу в запросе исключить...
111 Злопчинский
 
18.12.13
18:03
(109) ну и что в итогах тогда будет - остатки, потом по номенклатуре бежать и фильтровать..?
112 Ёпрст
 
18.12.13
18:03
(111) ага, только так..
Тебе же группы не нужны, отфильтруешь быстро
113 Злопчинский
 
18.12.13
18:05
(112) if проверю товй вариант.
.
самое интересное, что пожожую фичу мы уже обсуждали какую-то родственную, и я втой ветке был... а уже и не помнишь всего
114 Злопчинский
 
18.12.13
18:14
Проверил (104)
.
нулевые сотатки выдаются, но выдаются и ненулевые остатки.
От ненулевых избавиться внутри запроса не получается... бяка..
115 Злопчинский
 
18.12.13
18:17
С выгрузкой итогов - тоже не сильно кузяво.
Выгрузив итоги - надо ТЗ свернуть по номенклатуре и количеству.
В результате свертки может получиться нулевое количество. это значит надо ТЗ дополнительно фильтровать.
116 Злопчинский
 
18.12.13
18:24
Впрочем и запрос такую же хрень даст, так что все равно даже результат запроса надо фильтровать...
117 Ёпрст
 
19.12.13
08:39
(115) в выгрузитьИтоги ТЗ всегда свёрнута.
118 Ёпрст
 
19.12.13
08:40
(114) ну и че ? на выходе отфильтруешь..

Можно и..во внешней функции фильтровать, но это будет.. "запрос в запросе."
119 Ёпрст
 
19.12.13
08:41
А на ТА.. попробуйц воткнуть через Запрос.КонОст..там должно верно казать (надо проверить)
120 Злопчинский
 
19.12.13
13:23
(119) поздно. перепилил уже на выгрузку итогов и запрос к справочнику.
.
Резюме - спецов вагон, а никто ничего не знает...
121 Ёпрст
 
19.12.13
13:24
ой-ой-ой
122 Ёпрст
 
19.12.13
13:25
никто не пишет чорные запросы давно просто.
123 Diter
 
19.12.13
13:28
(120) ну здрасьте..... тут мозговой штурм был а ты так... ладно запишем в свою маленькую книжечку "бяки на форуме" ;)
124 Diter
 
19.12.13
13:29
(122) я пишу. они мне больше чем бухзапросы нравятся. правда в последнее время все больше на 1с++ но они там тоже черные
125 Злопчинский
 
19.12.13
13:41
(122) пишут, но простые ;-)
я в прямых запросах слаб, но блин когда текст вижу - хоть понимаю о чем там. когда блин в чорном запросе переменная как и регистр и справочник, количество - из регистра, КонСот - к количеству - у меян мозг наичнет ломаться... ;-)
126 Злопчинский
 
19.12.13
13:41
(123) какой на мозговой штурм. так ничего и не выпилилось
127 Ёпрст
 
19.12.13
13:43
(126) прям таки и ничего ?
Я те дал рабочий код, на выходе нужно было убрать только ненулевые останки и привет, или, проверить его с функцией Запрос.КонОст<>0
128 Ёпрст
 
19.12.13
13:44
Проверил (раз запрос на ТА, должен был корректно вернуть)
129 Ёпрст
 
19.12.13
13:44
?
130 selenat
 
19.12.13
13:52
(125) вот именно. Сам механизм запросов в 7 изначально кривой и непредсказуемый. Может ну их нафиг такие запросы? :)
131 Diter
 
19.12.13
14:18
(128) а я что говорил? но меня вчера закидали тапками. при некоторых условия (дата запроса и число группировок) условие на функцию в теле запроса отрабатывает корректно
132 Ёпрст
 
19.12.13
14:20
(131) это вопрос.. чебуру, чтоб он проверил
:))
133 NS
 
19.12.13
14:35
(131) И меня тоже. Требую сатисфакции! :)
134 Diter
 
19.12.13
14:41
(133) тебя правильно закидали. ты про "все" тупил ;)
135 Злопчинский
 
19.12.13
14:45
(132) ща проверю.
136 Diter
 
19.12.13
14:46
(135) группировка только одна, без фильтра по "Активность" с "все"
137 NS
 
19.12.13
14:47
(134) то есть "все" работает? Или все-таки нет? :)
138 Diter
 
19.12.13
14:51
(137) "все" обрезает фильтр по реквизиту но нулевые остатки попадают в общую выборку
139 Злопчинский
 
19.12.13
15:01
(132) Епрст, вот не получается у мну!!
.
    ТекстЗапроса = "
    |Номенклатура   = Справочник.Номенклатура.ТекущийЭлемент,Регистр.ОстаткиТМЦ.Номенклатура;
    |Артикул         = Справочник.Номенклатура.Артикул,Регистр.ОстаткиТМЦ.Номенклатура.Артикул;
    |Склад          = Регистр.ОстаткиТМЦ.Склад;
    |Активен        = Справочник.Номенклатура.wms_Активен,Регистр.ОстаткиТМЦ.Номенклатура.wms_Активен;
    |Количество     = Регистр.ОстаткиТМЦ.Количество;
    |Функция       КоличествоКонОст = КонОст(Количество);
    |Функция       Вася = Сумма(1);
    |Группировка   Номенклатура Без Групп ;
    |Условие (Активен= 2);
    |Условие (КакОтсеятьНеНулевыеостатки);
    |";

.
Что поставить в
    |Условие (КакОтсеятьНеНулевыеостатки);
.
чтобы в запросе остались только нулевые остатки?
140 Ёпрст
 
19.12.13
15:03
(139) ну втыкай туда

|Условие(Запрос.КонОст=0);
141 Ёпрст
 
19.12.13
15:04
точнее
|Условие(Запрос.КоличествоКонОст =0);
в твоём случае.. смотри, мот и выйдет аленький цветочек.
142 Злопчинский
 
19.12.13
15:09
(141) а не выходит!!!
.
вот твой исходный запрос, все нормально - выводятся ненулевые и нулевые остатки
.
http://content.screencast.com/users/Che66/folders/Jing/media/358e8402-539b-4b1c-8cb5-5938a9e6be4f/2013-12-19_1508.png
143 Злопчинский
 
19.12.13
15:10
последние две позиции на рсунке - это то что надо иметь в результатах запроса
144 Злопчинский
 
19.12.13
15:10
Добавляем в твой запрос условие
|Условие(Запрос.КоличествоКонОст =0);
145 Ёпрст
 
19.12.13
15:12
Это финальная табличка, которую надо поиметь ? Или ради примера ?..
146 Злопчинский
 
19.12.13
15:12
147 Ёпрст
 
19.12.13
15:12
если финальная, то не понимаю, в чем проблема не выводить секцию по условию :)
148 Злопчинский
 
19.12.13
15:12
(145) это живая таблица. В финальной, которую хочется получить - должны остаться только две строки, последние
149 Злопчинский
 
19.12.13
15:13
(147) ну, это не интересно... Хочется итогом запроса получить готовый результат
150 Diter
 
19.12.13
15:14
значит не повезло - не работает. тогда только при обходе тем более что "ступенек" у тебя все одно нет
151 Ёпрст
 
19.12.13
15:14
(148) т.е в таком виде её пользователь получит, так ?
Тогда бери первый запрос и на выходе не выводи секцию.. делов то :)
152 Злопчинский
 
19.12.13
15:28
(151) ну блин! это понятно.
вопрос-то в том, можно ли получить запросом сразу готовое, не отсеивая при выводе...
153 Duke1C
 
19.12.13
15:31
(151)+Добавить в Группировку по Номенклатуре
упорядочить по КоличествоКонОст
и прерывать Цикл при обходе группировки, когда КоличествоКонОст станет > 0
154 NS
 
19.12.13
15:33
(149) Вместо условия по складу, в функцию напиши "когда"
155 Ёпрст
 
19.12.13
16:07
Запрос..запрос.. вот ты нудный :))
Ну на:

Перем ТЗ;
Функция Вася(Номенклатурка)
   Если ТипЗначенияСтр(ТЗ)<>"ТаблицаЗначений" Тогда
     Рег = СоздатьОбъект("Регистр.ОстаткиТМЦ");
     Рег.ВыгрузитьИтоги(ТЗ);
   КонецЕсли;
   Возврат ТЗ.НайтиЗначение(Номенклатурка,,"Номенклатура")
КонецФункции
.....
ТекстЗапроса = "
    |Номенклатура   = Справочник.Номенклатура.ТекущийЭлемент;
    |Артикул         = Справочник.Номенклатура.Артикул;
    |Активен        = Справочник.Номенклатура.wms_Активен;
    |Группировка   Номенклатура Без Групп ;
    |Условие (Активен= 2);
    |Условие (Вася(Номенклатура)=0);
    |";
156 Ёпрст
 
19.12.13
16:08
склад свой еще в фильтр выгрузить итоги запихай.
157 Злопчинский
 
19.12.13
20:00
9155) ну блин ты типа хитрый, фигня это а не нормальный запрос.
158 Злопчинский
 
19.12.13
20:01
(153) это более кузявое решение, но все равно изврат
159 Ёпрст
 
20.12.13
08:23
(157) А чем не нравится ?
:))
160 Ёпрст
 
20.12.13
08:23
отработает быстро.
161 Ёпрст
 
20.12.13
08:24
можно сказать, это будет почти максимум, для чорного запроса, тем более, итоги не надо рассчитывать.
Ну , разве что поиск в ТЗ не айс.. можно заменить на поиск в ИТЗ, к примеру.
162 Ёпрст
 
20.12.13
08:25
Зато и итоги по группам можно поиметь .. и всё такое..