Запрос УТ 11.4

1. Самоделкин 2 10.12.20 21:20 Сейчас в теме
Здравствуйте! Есть запрос:
	"ВЫБРАТЬ 
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура.Наименование КАК НоменклатураНаименование,
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,	
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура.Родитель КАК НоменклатураРодитель,
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура.Код КАК НоменклатураКод,
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаИзмерения КАК НоменклатураЕдиницаИзмерения,
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул КАК НоменклатураАртикул,
	|	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
	|	ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
	|	СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличииОстаток,
	|	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены
	|ИЗ
	|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
	|		ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
	|
	|СГРУППИРОВАТЬ ПО
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура,	
	|	ЦеныНоменклатурыСрезПоследних.Цена,
	|	ЦеныНоменклатурыСрезПоследних.Валюта,
	|	СвободныеОстаткиОстатки.ВНаличииОстаток,
	|	ЦеныНоменклатурыСрезПоследних.ВидЦены
	|
	|УПОРЯДОЧИТЬ ПО
	|	Номенклатура";
	
		
	ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
	
	Таблица = Запрос.Выполнить().Выгрузить();
	Таблица.Свернуть("Номенклатура,ВНаличииОстаток,ВидЦены,Цена","");
	
	Для Каждого Строка Из Таблица Цикл
		Номенклатура = Строка.Номенклатура;
		Артикул      = Строка.Номенклатура.Артикул;
		Код          = Строка.Номенклатура.Код;
		Родитель     = Строка.Номенклатура.Родитель;
		Единица      = Строка.Номенклатура.ЕдиницаИзмерения;
		Остаток      = Строка.ВНаличииОстаток;
		ВидЦены      = Строка.ВидЦены;

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

Все бы хорошо, но Сообщить выводит все ВидыЦен.
Как это можно исправить?
По теме из базы знаний
Найденные решения
18. DanDy 55 11.12.20 09:47 Сейчас в теме
(15) В СписокЦен нужно добавлять виды цен, а у вас строки. Это во первых.
Во вторых не
(15)
|ГДЕ РегистрСведений.ЦеныНоменклатуры.ВидЦены В (&СписокЦен)

а
ЦеныНоменклатурыСрезПоследних.ВидЦены В (&СписокЦен)

а вообще лучше данное условие поместить в параметры виртуальной таблицы

(15)
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних


заменить на

ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены В (&СписокЦен)) КАК ЦеныНоменклатурыСрезПоследних
Самоделкин; +1 Ответить
20. unknow_user 11.12.20 11:20 Сейчас в теме
(17) Тогда всё верно. Тлько

СписокЦен.Добавить("Заказ");
СписокЦен.Добавить("Розница"); 


замените на

СписокЦен.Добавить(Справочники.ВидыЦен.НайтиПоНаименованию("Заказ", Истина));
СписокЦен.Добавить(Справочники.ВидыЦен.НайтиПоНаименованию("Розница", Истина));


если цены предопределенные, тогда

СписокЦен.Добавить(Справочники.ВидыЦен.Заказ);
СписокЦен.Добавить(Справочники.ВидыЦен.Розница);



И всё пойдет
Самоделкин; +1 Ответить
27. Самоделкин 2 12.12.20 12:30 Сейчас в теме
Вдруг кому понадобится.
Таблица = Запрос.Выполнить().Выгрузить();
Таблица.Свернуть("Номенклатура,ВНаличииОстаток,ВидЦены,Цена","");

не сворачивается, очевидно свернуть не дает ВидЦены, убрать из свертки ВидЦены нельзя, используется далее.
Решение здесь похоже одно:
1. Запрос с одной ценой выгружаем в одну таблицу, запрос с другой ценой в другую.
2. Соединяем обе таблицы и общую таблицу сворачиваем так:
Таблица.Свернуть("Номенклатура,ВНаличииОстаток","Цена,Цена1");
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FatPanzer 10.12.20 21:24 Сейчас в теме
(1) Что значит "исправить"? Удалите всю строку с "Сообщить" и будет вам счастье - не будет он выводить "все ВидыЦен".

Ну или попробуйте сделать так, чтобы в результат запроса попадали только нужные виды цен, например.
3. Самоделкин 2 10.12.20 21:31 Сейчас в теме
(2) Возможно не корректно поставил вопрос. Мне надо загрузить в БД, соответственно, если грубо говоря написать БД.Код = Код и т.д., то у меня получается столько номенклатуры сколько ВидовЦен в базе.
4. FatPanzer 10.12.20 21:34 Сейчас в теме
(3) Естественно, вы именно так запрос и написали. Именно поэтому я вам и говорю - добавьте в запрос условие, чтобы попадали только необходимые виды цен. Тогда и номенклатуры будет столько, сколько у вас в запросе получится видов цен.
5. Самоделкин 2 10.12.20 22:23 Сейчас в теме
(4) Не правильно объяснил. Добавлю в запрос условие по двум ценам, я ведь все-равно получу:

Товар1 остаток 20 цена1 100 цена2 150
Товар1 остаток 20 цена1 100 цена2 150
Товар2 остаток 10 цена1 50 цена2 100
Товар2 остаток 10 цена1 50 цена2 100

а мне надо получить:

Товар1 остаток 20 цена1 100 цена2 150
Товар2 остаток 10 цена1 50 цена2 100
6. FatPanzer 10.12.20 22:35 Сейчас в теме
(5)
Все бы хорошо, но Сообщить выводит все ВидыЦен.
А вроде другая проблема описана, да?
1. Левое соединение. Слева - таблица остатков, справа - две таблицы цен со связью по конкретному виду цен.
2. Объединение. Два подзапроса в каждом условие на отдельный вид цен. Потом группировка (при условии правильных отборов в виртуальных таблицах).
2. Ветвление. Запрос почти как сейчас есть, с условием по двум ценам и два поля цены (Выбор Когда Тогда Иначе 0). Потом группировка (при условии правильных отборов в виртуальных таблицах).

Выбирайте.
7. Самоделкин 2 10.12.20 22:39 Сейчас в теме
(6) Я плоховато разбираюсь в 8.3, можете запрос написать?
8. FatPanzer 10.12.20 22:51 Сейчас в теме
(7) Нет, не могу. Я и сам лох в 8.3. Посмотри на мой стаж.
А запросы учат писать на курсах или в учебниках. Там же учат и основным приемам написания запросов.
Я подсказал о существующих ошибках и о том, какими приемами можно добиться искомого результата.

Заниматься обучением или делать за других их работу - не моя стезя.
Впрочем, тут почти все такие.
Но есть и другие.
9. muskul 11.12.20 03:59 Сейчас в теме
Я вот не понимаю, кто все эти люди, которые добрались до 1с но при этом не понимаю как сделать условие в запросе?
сисадмин которого попросили, а ему это зачем? новичек, да как он тогда устроился и кто его пустил вообще.
ученик/стажер, ну так в любой книжке об этом на второй странице написано. непонимаю
FatPanzer; +1 Ответить
11. unknow_user 11.12.20 06:53 Сейчас в теме
(9) Я не понимаю, как это можно не понимать. Тут всё очевидно люди, которые пытаются разобраться
12. Самоделкин 2 11.12.20 07:38 Сейчас в теме
(9) 8.3 увидел месяц назад до этого работали на 7.7, согласен в 7.7 тоже есть запросы, но они там (по мне) проще, а чаще всего я обходился без них.
16. FatPanzer 11.12.20 09:15 Сейчас в теме
(12) "До этого ездил на тракторе. Позавчера увидел самолет. Согласен, немного сложнее. Вот пришел к вам проконсультироваться."
Ну да, действительно - зачем тратить время на переучивание, когда под боком есть форум пилотов?
10. unknow_user 11.12.20 06:52 Сейчас в теме
(7) В запрос добавьте
|ГДЕ РегистрСведений.ЦеныНоменклатуры.ВидЦены В (&СписокЦен)

СписокЦен = Новый СписокЗначений;
СписокЦен.Добавить(Цена1);
СписокЦен.Добавить(Цена2);
......
Запрос.УстановитьПараметр("СписокЦен", СписокЦен)
Самоделкин; +1 Ответить
13. Самоделкин 2 11.12.20 07:43 Сейчас в теме
(10) Спасибо, пошел пробовать!
А остальное в запросе правильно?
14. unknow_user 11.12.20 08:36 Сейчас в теме
(13) Синтаксис верный, в остальном зависит от задачи.
Самоделкин; +1 Ответить
15. Самоделкин 2 11.12.20 09:12 Сейчас в теме
(14) не получилось

Поле не найдено "РегистрСведений.ЦеныНоменклатуры.ВидЦены"
ГДЕ <<?>>РегистрСведений.ЦеныНоменклатуры.ВидЦены В (&СписокЦен)

Вроде бы все правильно сделал:
СписокЦен = Новый СписокЗначений;
СписокЦен.Добавить("Заказ");
СписокЦен.Добавить("Розница");

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура.Наименование КАК НоменклатураНаименование,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Номенклатура.Родитель КАК НоменклатураРодитель,
| ЦеныНоменклатурыСрезПоследних.Номенклатура.Код КАК НоменклатураКод,
| ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаИзмерения КАК НоменклатураЕдиницаИзмерения,
| ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул КАК НоменклатураАртикул,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
| СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличииОстаток,
| ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
| ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
|
|ГДЕ РегистрСведений.ЦеныНоменклатуры.ВидЦены В (&СписокЦен)
|
|СГРУППИРОВАТЬ ПО
| ЦеныНоменклатурыСрезПоследних.Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена,
| ЦеныНоменклатурыСрезПоследних.Валюта,
| СвободныеОстаткиОстатки.ВНаличииОстаток,
| ЦеныНоменклатурыСрезПоследних.ВидЦены
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура";

Запрос.УстановитьПараметр("СписокЦен", СписокЦен);

Показать
18. DanDy 55 11.12.20 09:47 Сейчас в теме
(15) В СписокЦен нужно добавлять виды цен, а у вас строки. Это во первых.
Во вторых не
(15)
|ГДЕ РегистрСведений.ЦеныНоменклатуры.ВидЦены В (&СписокЦен)

а
ЦеныНоменклатурыСрезПоследних.ВидЦены В (&СписокЦен)

а вообще лучше данное условие поместить в параметры виртуальной таблицы

(15)
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних


заменить на

ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены В (&СписокЦен)) КАК ЦеныНоменклатурыСрезПоследних
Самоделкин; +1 Ответить
17. Самоделкин 2 11.12.20 09:25 Сейчас в теме
(14) Задача простая: получить товар, остаток и две цены.
19. unknow_user 11.12.20 11:16 Сейчас в теме
(15) Конечно же ГДЕ РегистрСведений.ЦеныНоменклатуры.ВидЦены В (&СписокЦен)
Смотрю уже DanDy поправил. И верно параметры виртуальной таблицы будет удачнее
20. unknow_user 11.12.20 11:20 Сейчас в теме
(17) Тогда всё верно. Тлько

СписокЦен.Добавить("Заказ");
СписокЦен.Добавить("Розница"); 


замените на

СписокЦен.Добавить(Справочники.ВидыЦен.НайтиПоНаименованию("Заказ", Истина));
СписокЦен.Добавить(Справочники.ВидыЦен.НайтиПоНаименованию("Розница", Истина));


если цены предопределенные, тогда

СписокЦен.Добавить(Справочники.ВидыЦен.Заказ);
СписокЦен.Добавить(Справочники.ВидыЦен.Розница);



И всё пойдет
Самоделкин; +1 Ответить
21. Самоделкин 2 11.12.20 12:22 Сейчас в теме
(20) Спасибо!
После ответа DanDy переделал так

  Заказ = Справочники.ВидыЦен.НайтиПоНаименованию("Заказ");
	Розница = Справочники.ВидыЦен.НайтиПоНаименованию("Розница");
	
	СписокЦен = Новый СписокЗначений;
	СписокЦен.Добавить(Заказ);
	СписокЦен.Добавить(Розница);


Ваш вариант, конечно, правильнее и красивей.

До создания темы на форуме пробовал делать типа этого:
|ГДЕ
|	ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = ""Заказ""    ИЛИ
|       ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = ""Розница""


Так же как и сейчас выводило две цены.

Но обоими вариантами выводит:
Товар1 Остаток 2 Цена1 100 Цена2 150
Товар1 Остаток 2 Цена1 100 Цена2 150
Товар2 Остаток 5 Цена1 10 Цена2 50
Товар2 Остаток 5 Цена1 10 Цена2 50

А мне бы получить:
Товар1 Остаток 2 Цена1 100 Цена2 150
Товар2 Остаток 5 Цена1 10 Цена2 50
22. unknow_user 11.12.20 13:06 Сейчас в теме
(21) В коде вот это осталось?

Таблица.Свернуть("Номенклатура,ВНаличииОстаток,ВидЦены,Цена","");

Тогда должно быть так

Товар1 Остаток 2 Цена1 100 Цена2 150
Товар2 Остаток 5 Цена1 10 Цена2 50

Иначе Товар1 и Товар2 не по одной позиции в справочнике номеклатура

И лучше вот так;

Таблица.Свернуть("Номенклатура,ВНаличииОстаток,ВидЦены,Цена","");
23. Самоделкин 2 11.12.20 13:21 Сейчас в теме
(22) Ну, да есть!
	
	Таблица = Запрос.Выполнить().Выгрузить();
	Таблица.Свернуть("Номенклатура,ВНаличииОстаток,ВидЦены,Цена","");
	

думал свернет.
К тому же выводит так:

Код 00-00000153 Номенклатура 1118 Амортизатор крышки багажника GAMMA GMSAD1118 Артикул 1118-8231010-01 Родитель 1118 Седан Единица м Остаток 16 ЦенаЗаказ 110 ЦенаРозница
Код 00-00000153 Номенклатура 1118 Амортизатор крышки багажника GAMMA GMSAD1118 Артикул 1118-8231010-01 Родитель 1118 Седан Единица м Остаток 16 ЦенаЗаказ 110 ЦенаРозница 130
Код 00-00000154 Номенклатура 1118 Амортизатор крышки багажника фирм. упак.LADA Артикул 1118-8231010 Родитель 1118 Седан Единица м Остаток 28 ЦенаЗаказ 1 100 ЦенаРозница 130
Код 00-00000154 Номенклатура 1118 Амортизатор крышки багажника фирм. упак.LADA Артикул 1118-8231010 Родитель 1118 Седан Единица м Остаток 28 ЦенаЗаказ 1 100 ЦенаРозница 1 300

Обратите внимание на ЦенаРозница.
24. Самоделкин 2 11.12.20 15:27 Сейчас в теме
(22) Был, конечно, еще вариант.
Сделать два запроса с разными видами цен, выгрузить их одну Таблицу и потом свернуть.
25. FatPanzer 11.12.20 15:43 Сейчас в теме
(24) Это пункты 2 и 3 в сообщении (6)
26. Самоделкин 2 11.12.20 16:08 Сейчас в теме
(25) Да, сейчас второй раз прочитал (6), согласен предлагалось.
27. Самоделкин 2 12.12.20 12:30 Сейчас в теме
Вдруг кому понадобится.
Таблица = Запрос.Выполнить().Выгрузить();
Таблица.Свернуть("Номенклатура,ВНаличииОстаток,ВидЦены,Цена","");

не сворачивается, очевидно свернуть не дает ВидЦены, убрать из свертки ВидЦены нельзя, используется далее.
Решение здесь похоже одно:
1. Запрос с одной ценой выгружаем в одну таблицу, запрос с другой ценой в другую.
2. Соединяем обе таблицы и общую таблицу сворачиваем так:
Таблица.Свернуть("Номенклатура,ВНаличииОстаток","Цена,Цена1");
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот