Имя: Пароль:
1C
 
Привет. Запрос не выбирает нулевые значения из регистра, прошу помочь
0 Nehalem
 
11.02.11
14:54
Движения.Записать();
   Запрос.Текст="ВЫБРАТЬ
                |    ЗапасыОстатки.Наименование,
                |    ЗапасыОстатки.Склад,
                |    ЗапасыОстатки.КоличествоВУпаковкеОстаток
                |ИЗ
                |    РегистрНакопления.Запасы.Остатки(
                |            ,
                |            Склад = &Склад
                |                И Наименование В
                |                    (ВЫБРАТЬ
                |                        ДокТЧ.Наименование
                |                    ИЗ
                |                        ДокТЧ КАК ДокТЧ)) КАК ЗапасыОстатки
                |ГДЕ
                |    ЗапасыОстатки.КоличествоВУпаковкеОстаток <= 0";
   Запрос.УстановитьПараметр("Склад",Склад);
   Результат=Запрос.Выполнить();
   Выборка=Результат.Выбрать();
   Пока Выборка.Следующий()Цикл
       Если Выборка.КоличествоВУпаковке<0 Тогда
               ЕдИзмеренияУпаковки=РаботаСОбъектами.ПолучитьРеквиизтОбъекта(Выборка.Наименование, "ЕдИзмУпаковки");
               Сообщение=Новый СообщениеПользователю;
               Сообщение.Текст="Не хватает товара: "
                                   +Выборка.Наименование+", на складе: "+Выборка.Склад+" в количестве: "
                                           +Строка((Выборка.КоличествоВУпаковкеОстаток)*-1)+" "
                                           +ЕдИзмеренияУпаковки+".";
               Сообщение.Сообщить();
               Отказ=Истина;
           Иначе Если Выборка.КоличествоВУпаковке=0 Тогда
               Движение.Количество=0;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
1 chelentano
 
11.02.11
14:56
(0) так то вообще ошибку должен выдать
2 chelentano
 
11.02.11
14:56
+(1) а нулевых вообще не будет в запросе, он только ненулевые выбирает
3 Ткачев
 
11.02.11
14:57
ЕстьNULL(ЗапасыОстатки.КоличествоВУпаковкеОстаток,0)
Нее ?
4 Nehalem
 
11.02.11
14:59
(3) А почемк NULL ? Если в косоли запросов выбирает по условию = 0?
(2) так вед стоит <= 0 ...
5 Wobland
 
11.02.11
15:00
в таблице остатков записей с нулевым остатком нет, не?
6 Ткачев
 
11.02.11
15:01
хз, я так 0 получаю
7 hhhh
 
11.02.11
15:01
(4) ну нету там этих записей в остатках. Не к чему применять это условие.
8 Nehalem
 
11.02.11
15:02
(5) в консоли запросов выбирает, на условие = 0, а здесь не могу понять что не так.
Сейчас пример попробую...
9 Ткачев
 
11.02.11
15:04
(7)Может надо знать числом чего нет на складе.
10 МойКодУныл
 
11.02.11
15:05
(3) Если соединить со справочником Номенклатура, так покатит :), но это изврат. Тащить всю номенклатуру, чтобы посмотреть у какой остаток по регистру 0.
11 Ткачев
 
11.02.11
15:07
(10)Зачем то ведь надо "остаток <= 0"
12 Nehalem
 
11.02.11
15:09
(9)
ВЫБРАТЬ
   *
   ИЗ
   РегистрНакопления.Запасы.Остатки КАК ЗапасыОстатки
ГДЕ
   ЗапасыОстатки.КоличествоВУпаковкеОстаток = 0

Выбирает Фотобарабан HP LJ Q2612A У которого занчение КоличествоВУпаковкеОстаток=0
13 Ненавижу 1С
 
гуру
11.02.11
15:11
(12) значит есть другие не пустые ресурсы
14 Nehalem
 
11.02.11
15:11
+(12) Значит в регистре запись есть такая...а если так:
ВЫБРАТЬ
   *
   ИЗ
   РегистрНакопления.Запасы.Остатки КАК ЗапасыОстатки
ГДЕ
   ЗапасыОстатки.КоличествоВУпаковкеОстаток <= 0
То выбирает и плюс к фотобарабану отрицательное значение коробок антивируса касперского...

Но это в консоли делаю, а в модуле не работает, что не так...вот вопрос то в чем.
15 Ткачев
 
11.02.11
15:11
А если так ?
*
ГДЕ
   ЗапасыОстатки.КоличествоВУпаковкеОстаток = 0
ИЛИ ЗапасыОстатки.КоличествоВУпаковкеОстаток < 0
16 МишельЛагранж
 
11.02.11
15:12
Да, дела, всегда наоборот, нулевые/пустые значения отбрасывают как не несущие никакой информации, а тут надо выбирать ))
(7) да дело не совсем в наличии самих записей, хотя если применить "запись = поле записи", то верно.
В (3) правильно говорит - сам ноль в таком случае в поле не пишется (как цифра), а будет "ячейка не заполнена" (т.е. NULL в терминологии 1С).
Соответственно, проверять на ЕстьNULL.
17 Nehalem
 
11.02.11
15:13
(6) надо как Ткачев предлогает замутить. Попробую...
18 hhhh
 
11.02.11
15:14
(14) ну это разные запросы. Ты тот же запрос запусти.
19 Nehalem
 
11.02.11
15:16
(15) надо выбрать и те и те и потом по условию или сообщить пользователю или обнулить количество в регистре...
(16) хорошо пробую.
20 MNS_Ротерта
 
11.02.11
15:26
(0) А попробовать из реальной ТЗ вытащить никак? Или из оборотов что будет несколько быстрее выбираете расход со знаком минус, приход со знаком плюс. далее группируете и отфильтровываете что захотите.
В вирт табл Остатки нет нулевых значений. И это правильно априоре так как они там нафик не нужны. Регистры накопления вообще должны рано или поздно частино схлопнуться. Именно это заложено в идеологию РН и это не позволяет им бессмысленно "распухать".
21 Nehalem
 
11.02.11
15:29
(20) ну таких вещей не знал, а вот из реальной ТЗ вполне можно попробовать вытащить...
22 anig99
 
11.02.11
15:31
Детский сад.
1. Если в регистре накопления на дату по номенклатуре нет остатков НИ ПО ОДНОМУ РЕСУРСУ, то виртуальная таблица Остатки не вернет НИ ОДНОЙ ЗАПИСИ и никакие есть NULL не помогут. есть NULL работает только в случае объединения.
2. Для того, чтобы получить и нулевые остатки, нужно объединить таблицу остатков со справочником Номенклатура. Тогда можно и ЕСТЬNULL(КоличествоВУпаковкеОстаток,0)=0 писать. Т.к. именно при отсутствии остатков по ресурсам NULL и будет.
23 МойКодУныл
 
11.02.11
15:33
(22) я в (10) на это намекал )
24 Ненавижу 1С
 
гуру
11.02.11
15:33
(22) осторожно а названиями: соединить, а не объединить
JOIN а не UNION
25 MNS_Ротерта
 
11.02.11
15:34
(21) Для информации. Регистры накоплений это несколько виртуальных таблиц и одна реальная. В БД это все реальные таблицы. Т.е. в так называемой реальной таблице храняться все записи. А в виртуальных таблицах схлопнутые строки на определенную дату (месяц). Это и позволяет виртуальным таблицам работать быстрее (наложишь параметры вирт. табл будет еще быстрее). Если данных не достаточно в вирт таблицах то данные добираются из реальной таблице за недостающий период (текущий месяц).
26 Nehalem
 
11.02.11
15:40
(20) что то не работает однако, Не вытаскивает отрицательное занчение из реальной таблицы...
27 acsent
 
11.02.11
15:40
(25) ты не прав
28 MNS_Ротерта
 
11.02.11
15:43
(26) ну блин само самой само автоматом минусы и плюсы не поставяться. ориентируйтесь на ВидДвижения. Выбор когда виддвижениярасход то умнож на -1 иначе оставляй как есть.

(27) в чем же я не прав позвольте узнать?
29 Nehalem
 
11.02.11
15:44
(22) Ага. У меня есть два ресура Количество и Количество в упаковке. Когда количество в упаковке по очередному списанию подошло к 0. хотел обнулить и количество. Способ видимо я не очень правильный выбрал, но теперь пол конфе лень переделывать.  из (22) я понял что если хоть один ресурс имеет Положительное значение = запрос не выберет, так?
30 Ненавижу 1С
 
гуру
11.02.11
15:46
(28) хотя бы в том, что реальных таблиц две
если напишешь аналогичный запрос - без вирт. таблиц будет скорость таже, просто вирт таблицы это макросы, упрощающие кодинг
31 МойКодУныл
 
11.02.11
15:47
(29) А чего ж ты сразу тогда не выбираешь по условию Кол-во > 0 и Кол-во в упаковке = 0? Сразу готовая таблица для обнуления получится.
32 Ненавижу 1С
 
гуру
11.02.11
15:51
(29) зачем ресурс "Количество в упаковке"?
33 Ненавижу 1С
 
гуру
11.02.11
15:52
(29) и кстати в (13) я был прав
34 Nehalem
 
11.02.11
15:53
(31) да нет немного не то получиться. Проведение Списывает количествоВУпаковке по спецификации. количество банок тонера, нужно просто обнулять и все когда КоличествоВУпаковке=0 станет.
35 МойКодУныл
 
11.02.11
15:56
(34) это при проведении документа делается или ты обработку пишешь, которая такие остатки закрыть должна?
36 МойКодУныл
 
11.02.11
15:56
(35) Туплю, видимо при проведении. Забыл первый пост.
37 Nehalem
 
11.02.11
15:57
(32) КоличествоВУпаковке это тонер в граммах на одну заправку, если его нет пользователю сообщаю что тонера на складе нет.
А еще есть количество- это уже банок с тонером. Короче так не очень совершенно, но как есть...
Так вот когда тонера в граммах уже 0 на складе, количество в банках еще болтается. Хотел таким не хитрым способом обнулить и все и забыть.
38 Nehalem
 
11.02.11
15:58
(35) при проведении. Обработка мне кажется лишнее немного.
39 МойКодУныл
 
11.02.11
16:02
Может перед записью в регистр при проведении получать остатки, и если ОстатокКоличествоВУпаковке = СписываемоеКоличествоВУпаковке, то полностью списывать количество в банках?
Прости за сумбур, у меня уже пятница)
40 Nehalem
 
11.02.11
16:08
(39) да видимо нужно что-то такое делать, иначе ерунда выходит. Интересно как вообще с весовым товаром вопрос в типовых решается...ведь плата за банку идет, а списание по граммам...хм...
41 НЕА123
 
11.02.11
16:11
(0) не совсем понял, но может так

    |ГДЕ
                |    ЗапасыОстатки.КоличествоВУпаковкеОстаток < 0 ИЛИ
(ЗапасыОстатки.КоличествоВУпаковкеОстаток = 0  И ЗапасыОстатки.Количество <> 0"
42 НЕА123
 
11.02.11
16:12
(39)
вроде так и делается, обычно.
43 Nehalem
 
11.02.11
16:19
(42) то есть путь примерно верный, что ж уже не так грустно. (41) - попробую сделать. Посмотрим.
44 Nehalem
 
11.02.11
16:21
(41)- нет не пойдет, пользователю то как сообщить о том что граммов нет достаточных...
45 МойКодУныл
 
11.02.11
16:25
(44) Получааешь остатки пол кол-ву банок и кол-ву граммов, потом в коде сравниваешь списываемое количество граммов и их остатки. Если остатка меньше - сообщаешь пользователю и не проводишь, ИначеЕсли остаток = списываемому количеству  - списываешь еще и все количество банок, Иначе - просто проводишь.
46 МойКодУныл
 
11.02.11
16:26
(45) омг, сколько описок. Пора прекращать потсить)
47 Nehalem
 
11.02.11
16:28
(45) ок. спасибо что-то такое уже пробую. Спасибо всем за участие, удачных выходных...
48 Midaw
 
11.02.11
16:44
(27) интересно в чем же он не прав? любая виртуальная таблица это есть выборка с использованием итогов в регистрах. только я бы называл "виртуальная таблица" не совсем равно итоги. там ещё код к использованию итогов+таблицы движений.
(45) какое то извращение, может проще получить итоги на момент времени до документа? или я что то тут не понял, всё не читал )