Получить нулевые остатки запросом

1. request4t 03.12.19 14:52 Сейчас в теме
Здраствуйте все.

Нужно получить остатки по товару и всем складам, которые есть в справочнике. Включая и нулевые. Сейчас запрос выводит только остатки > 0.

		"ВЫБРАТЬ
		|	Склады.Ссылка,
		|	ТоварыВНТТОстатки.Склад,
		|	ТоварыВНТТОстатки.Номенклатура,
		|	ТоварыВНТТОстатки.КоличествоОстаток
		|ИЗ
		|	Справочник.Склады как Склады
		|ЛЕВОЕ СОЕДИНЕНИЕ
		|	РегистрНакопления.ТоварыВНТТ.Остатки КАК ТоварыВНТТОстатки
		|ПО
		|	Склады.Ссылка = ТоварыВНТТОстатки.Склад.Ссылка
		|ГДЕ
		|	ТоварыВНТТОстатки.Номенклатура = &Номенклатура";

Показать
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
6. bmk74 233 03.12.19 15:09 Сейчас в теме
(1)Выберите сначала из регистра не остаточного всю номенклатуру и склады, потом во временную таблицу это , а после соедините с остаточным регистром..по номенклатуре и складу,
7. akim2040 41 03.12.19 15:11 Сейчас в теме
(6) не проще ли тупо весь справочник номенклатуры выбрать и к нему прикрутить остатки из регистра?
11. bmk74 233 03.12.19 15:21 Сейчас в теме
(7) Лишнюю номенклатуру то зачем ?? если по ней никогда оборота на этом складе не было ??
15. akim2040 41 03.12.19 15:40 Сейчас в теме
(11) Обратите внимание, так хочет ТС. я то понимаю что такое не надо
nomad_irk; PLAstic; +2 Ответить
10. Xershi 1474 03.12.19 15:20 Сейчас в теме
(1) так правильно данных в таблице нет.
Как уже написали получаешь данные, затем левым соединением добавляешь недоставющее. Далее чего нет обрабатываешь как есть нуль.
13. request4t 03.12.19 15:29 Сейчас в теме
(10)
я использую левое соединение
14. Xershi 1474 03.12.19 15:38 Сейчас в теме
(13) в чем тогда проблема?
16. request4t 03.12.19 15:45 Сейчас в теме
(14)
выводятся только остатки больше 0
20. Xershi 1474 03.12.19 16:58 Сейчас в теме
(16) как уже написал прочитайте сначала (10).
Вы либо не читаете, либо не понимаете что вам пишут.
2. VmvLer 03.12.19 14:56 Сейчас в теме
Объединить все

поиск в сети ничего не дал?
12. request4t 03.12.19 15:28 Сейчас в теме
(2)
конечно дал. вот, например:http://forum.infostart.ru/forum9/topic37585/message445060/#message445060
у меня вроде аналогичный запрос.

ну и левое соединение разве тут не должно сработать?
3. SaschaL 03.12.19 14:57 Сейчас в теме
Добрый день.
Добавте условие

ТоварыВНТТОстатки.КоличествоОстаток = 0

Для начала и поглядите , я бы еще допилил вот эту строку

| ЕстьNULL(ТоварыВНТТОстатки.КоличествоОстаток,0) как КоличествоОстаток


и тогда если там пустое значение то он гарантированно присвоит 0 и условие должно отработать
5. bmk74 233 03.12.19 15:08 Сейчас в теме
(3) Круто, а ничего что Остатки будут показаны только по тем номенклатурам у которых остаток больше 0 в данном регистре, если остатка нет по номенклатуре...он его и не выведет
4. SaschaL 03.12.19 14:58 Сейчас в теме
можно все в одном запросе собрать и не извращаться, через левое соединение например.
8. akim2040 41 03.12.19 15:13 Сейчас в теме
Например так

ВЫБРАТЬ
	Ном.Ссылка КАК Номенклатура,
	ТоварыНаСкладахОстатки.Склад КАК Склад,
	ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток
ИЗ
	Справочник.Номенклатура КАК Ном
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатка, ) КАК ТоварыНаСкладахОстатки
		ПО Ном.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
starjevschik; +1 Ответить
34. ketr 125 07.02.23 16:29 Сейчас в теме
(8) рабочий вариант:

ВЫБРАТЬ
	ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток,
	Ном.Ссылка
ИЗ
	Справочник.Номенклатура КАК Ном
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
		ПО Ном.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
			И (ТоварыНаСкладахОстатки.КоличествоОстаток = 0)
ГДЕ
	НЕ Ном.ЭтоГруппа
Показать
9. bmk74 233 03.12.19 15:14 Сейчас в теме
кАК ТО ТАК МОЖНО

ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    ТоварыВНТТОстатки.Склад,
        |    ТоварыВНТТОстатки.Номенклатура
        |    ПОМЕСТИТЬ ВТ_Товары
        |ИЗ
        |     РегистрНакопления.ТоварыВНТТ КАК ТоварыВНТТ
        |;
        |////////////////////////////////////////////////////////////­/////////
        |ВЫБРАТЬ 
        |    ТоварыВНТТОстатки.Склад,
        |    ТоварыВНТТОстатки.Номенклатура,
        |    ЕСТЬNULL(ТоварыВНТТОстатки.КоличествоОстаток,0) КАК Количество

        |ИЗ
        |     ВТ_Товары КАК ТоварыВНТТ
        | ЛЕВОЕ СОЕДИНЕНИЕ
        |    РегистрНакопления.ТоварыВНТТ.Остатки КАК ТоварыВНТТОстатки
         |   ПО ТоварыВНТТ.Склад = ТоварыВНТТОстатки.Склад
         | И  ТоварыВНТТ.Номенклатура= ТоварыВНТТОстатки.Номенклатура
Показать
17. request4t 03.12.19 15:56 Сейчас в теме
ладно, не парьтесь. дописал код, не используя запрос.
18. bmk74 233 03.12.19 16:16 Сейчас в теме
(17)Так блин вам два запроса сделали...чем не угодило ?
19. VmvLer 03.12.19 16:20 Сейчас в теме
ну че тут копей наломали, но до очевидного, банального и экономичного
Объединить все
все еще не дошли.
е-ма-е, задачка то избитая
21. bmk74 233 03.12.19 17:54 Сейчас в теме
(19) вы извиняюсь что тут объединять собрались ?...
22. VmvLer 04.12.19 14:01 Сейчас в теме
(21) Всё.
в постановке задачи четко сказано по всем складам!
можно костылить с левым конеш, но я просто объединяю без всяких джойнов.
23. bmk74 233 05.12.19 18:01 Сейчас в теме
(22)
о я просто объединяю без всяких джойно

Еще раз ЧТО вы объединять собрались...какие данные...??
24. VmvLer 06.12.19 09:33 Сейчас в теме
(23) согласно постановке задачи.
ну чё нести дневник, питёрка с плюсом?
или родителей в школу?
25. bmk74 233 06.12.19 18:07 Сейчас в теме
(24)
согласно постановке задачи.
ну чё нести дневник, питёрка с плюсом?
или родителей в школу?


Короче вы болтовней занимаетесь..нихрена не знаете...

Постановка задачи получить номенклатуру на складе в т.ч. и той которой там уже нет...
Теперь если мы снимем остаточный регистр, то не увидим номенклатуру у которой был приход и расход на данном складе но сейчас там нулевой остаток..т.е здесь мы получим номенклатуру которая имеется в наличии на дату остатка...

Дальше что вы с этим делать будете ??
26. VmvLer 09.12.19 09:27 Сейчас в теме
(25) вы как-то топорно пишите, прям как с бодуна.
мне преподавали теорию множеств более четко - кружочки рисовали, точечки и все такое.

где это все и зачем вы мне навязываете свою корявую картину мира с хаотичным скоплением заблуждений?
27. bmk74 233 13.12.19 10:23 Сейчас в теме
(26) Очередной балабол. которому рассказали и показали теорию множеств.. И он теперь пытается применить ее там, где ей не место..
28. ivanmeneger 13.11.20 15:16 Сейчас в теме
Вот для УНФ я так сделал - вроде как то что нужно
ВЫБРАТЬ// остатки
Остатки.Номенклатура КАК Наименование,
Цены.Цена,
Цены2.Цена КАК Цена2,
Остатки.КоличествоОстаток КАК Остаток
ПОМЕСТИТЬ ОстаткиСценами
ИЗ
РегистрНакопления.ЗапасыНаСкладах.Остатки() КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(,ВидЦен = &ВидЦены) КАК Цены
ПО
Остатки.Номенклатура = Цены.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(,ВидЦен = &ВидЦены2) КАК Цены2
ПО
Остатки.Номенклатура = Цены2.Номенклатура ;


ВЫБРАТЬ //Номенклатуру
//Ном.Наименование,
Ном.Артикул,
Цены.Цена,
Цены.Цена2,
Остаток
ИЗ
Справочник.Номенклатура КАК Ном
ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиСценами Как Цены
ПО Ном.Ссылка = Цены.Наименование
ГДЕ Ном.ЭтоГруппа = ЛОЖЬ
//Ном.Ссылка В ИЕРАРХИИ(&Номенклатура)

УПОРЯДОЧИТЬ ПО
// Ном.Ссылка.ЭтоГруппа ИЕРАРХИЯ,
Ном.Ссылка.РеквизитДопУпорядочиванияУНФ
29. FatPanzer 13.11.20 15:22 Сейчас в теме
(28) 1. В первом запросе сделай одно соединение с ценами (условие ИЛИ), а в полях запроса проверяй тип цены через ВЫБОР КОГДА...
2. Индекс добавь по номенклатуре.
31. ivanmeneger 13.11.20 22:38 Сейчас в теме
(28)Этот код работает - но есть у него недостаток - если остатков нет то ты с ними ничего сделать не можешь. Ну как то получить для дальнейшей работы с остатком нулевым. Для общего образования кодик норм.
30. ivanmeneger 13.11.20 22:35 Сейчас в теме
В общем даю полностью рабочий ответ на поставленную задачу, как это решил я.
1)Я это всё выгружаю для синхронизацией с MySQL сайта, дабы актуализировать остатки ну и цены тоже.
2)Я не специалист и не профи, так что просьба строго не судить, и терминами не запинывать.
3)Весь код честно взят из интернета и запилен под себя, в частности под УНФ. Под любую другую платформу подойдет только чутка подправить регистров названия и в целом будет норм.
Комментарий под номером (29) спасибо тебе милый человек, но я так не особо понимаю, примерчик бы конкретный и рабочий сразу чтоб, а то опять же терминами закидал, а я иди ищи как твои термины в жизнь воплощать.
Короче. Код запроса. Всё тестировалось в отдельной обработке под названием консоль запросов (кто ею не пользуется тот тратит время зря).
ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Ссылка,
    СправочникНоменклатура.Артикул КАК Артикул, 
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, "0.00") КАК Цена,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних2.Цена, "0.00") КАК Цена2,
    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, "0.00") КАК КоличествоОстаток   //представление ноля в виде строки

ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки() КАК ТоварыНаСкладахОстатки
        ПО (ТоварыНаСкладахОстатки.Номенклатура = СправочникНоменклатура.Ссылка)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(,ВидЦен = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        ПО (ЦеныНоменклатурыСрезПоследних.Номенклатура = СправочникНоменклатура.Ссылка)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(,ВидЦен = &ВидЦены2) КАК ЦеныНоменклатурыСрезПоследних2
        ПО (ЦеныНоменклатурыСрезПоследних2.Номенклатура = СправочникНоменклатура.Ссылка)
ГДЕ СправочникНоменклатура.ЭтоГруппа = ЛОЖЬ
Показать

На выходе я получаю Артикул ЦенуРозницу ЦенуОпт и Остаток - ну а дальше уже дело фантазии.
user1464234; +1 Ответить
32. FatPanzer 13.11.20 22:42 Сейчас в теме
(30)
"|ВЫБРАТЬ
|    СправочникНоменклатура.Ссылка КАК Ссылка,
|    СправочникНоменклатура.Артикул КАК Артикул, 
|    ВЫБОР
|        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены 
|            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
|        ИНАЧЕ 0
|    КОНЕЦ КАК Цена,
|    ВЫБОР
|        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены2 
|            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
|        ИНАЧЕ 0
|    КОНЕЦ КАК Цена2,
|    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток 
|
|ИЗ
|    Справочник.Номенклатура КАК СправочникНоменклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки() КАК ТоварыНаСкладахОстатки
|        ПО (ТоварыНаСкладахОстатки.Номенклатура = СправочникНоменклатура.Ссылка)
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(,ВидЦен = &ВидЦены ИЛИ ВидЦен = &ВидЦены2) КАК ЦеныНоменклатурыСрезПоследних
|        ПО (ЦеныНоменклатурыСрезПоследних.Номенклатура = СправочникНоменклатура.Ссылка)
|ГДЕ СправочникНоменклатура.ЭтоГруппа = ЛОЖЬ"
Показать
user1464234; +1 Ответить
33. ivanmeneger 14.11.20 10:26 Сейчас в теме
(32) Твой код выводит что нужно, но .... товар задвоился - то есть отдельная строка с ценой 1 и отдельная с ценой 2 получается (думаю это связано с одним левым соединением по ценам, две левых соединения дадут отдельные колонки)
По моему запросу выше 1С УНФ у меня не захотела работать, хотя в консоли всё работало отлично. Методом проб и ошибок выяснил что проблема в кавычках !!!! Не знаю почему но не захотело работать на реальной 1С.
ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, "0.00") КАК Цена,
ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних2.Цена, "0.00") КАК Цена2,
ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, "0.00") КАК КоличествоОстаток
В итоге заработало только вот так
Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
    |СправочникНоменклатура.Ссылка КАК Ссылка,
    |СправочникНоменклатура.Артикул КАК Артикул, 
    |ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена,0) КАК Цена,
    |ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних2.Цена,0) КАК Цена2,
    |ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0) КАК Остаток   
	|ИЗ
    |Справочник.Номенклатура КАК СправочникНоменклатура
	|   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки() КАК ТоварыНаСкладахОстатки
    |    ПО (ТоварыНаСкладахОстатки.Номенклатура = СправочникНоменклатура.Ссылка)
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(,ВидЦен = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
    |    ПО (ЦеныНоменклатурыСрезПоследних.Номенклатура = СправочникНоменклатура.Ссылка)
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(,ВидЦен = &ВидЦены2) КАК ЦеныНоменклатурыСрезПоследних2
    |    ПО (ЦеныНоменклатурыСрезПоследних2.Номенклатура = СправочникНоменклатура.Ссылка)
    |ГДЕ СправочникНоменклатура.ЭтоГруппа = ЛОЖЬ";
	Цена = Справочники.ВидыЦен.НайтиПоНаименованию("Продажа_Розница");
	Цена2 = Справочники.ВидыЦен.НайтиПоНаименованию("Продажа_ОПТ_1");
	Запрос.УстановитьПараметр("ВидЦены", Цена);
	Запрос.УстановитьПараметр("ВидЦены2", Цена2);
	Результат = Запрос.Выполнить();
Показать

Ну и отсутствие цены или остатка проверяем на 0 - что то типа такого
Пока Выборка.Следующий() Цикл
		     Если Выборка.Цена = 0 ИЛИ Выборка.Цена2 = 0 ИЛИ Выборка.Остаток = 0 Тогда
			 Сообщить(Выборка.Артикул);
			 КонецЕсли;

То есть сообщить мне все артикулы товара у которого нет хоть одной из цен или остатка.
В общем и в целом вопрос мой решен, спасибо FatPanzer за поддержку !
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день