Запрос: получить элементы множества групп иерархического справочника

1. triviumfan 93 19.10.20 19:13 Сейчас в теме
Всем привет.
Дана таблица (настроек... для выгрузки прайса на сайт) с полями:
номенклатура (а точнее группа!), тип цен, подразделение.
Эти три измерения нужны для получения цен.
ВЫБРАТЬ
Цены.Номенклатура, 
Цены.Цена
Из
РегистрСведений.Цены.СрезПоследних(, 
(Номенклатура, ТипЦен, Подразделение) В 
(ВЫБРАТЬ
...
ИЗ
ТаблицаНастроек
)
)  КАК Цены
Показать

Но как мне дополнить таблицу номенклатурой, чтобы получить элементы групп?
Перечитал статьи Ильдаровича, но так и не сообразил как применить сие к данной задаче:)

ЗЫ: Хотел соединить таблицу настроек с таблицей номенклатуры "по иерархии", но получившийся коррелирующий подзапрос не проходит синтаксис из-за оператора В ИЕРАРХИИ.
Нид хелп!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. triviumfan 93 19.10.20 19:17 Сейчас в теме
Если не получится красиво-элегантно, то буду динамически запрос формировать в цикле по строке настроек, но может кто подскажет как сделать все по-феншую.
3. nomad_irk 76 19.10.20 19:32 Сейчас в теме
(2)Не нужны тебе статьи Ильдаровича.
Выгребаешь всю номенклатуру из группы во временную таблицу и накладываешь отбор по этой таблице.
4. rpashkovsky 23 19.10.20 22:45 Сейчас в теме
А с какой целью планировался использоваться коррелирующий запрос, если не секрет? Здесь ведь вроде все просто как двери.
6. triviumfan 93 19.10.20 23:23 Сейчас в теме
(4) чтобы получить элементы номенклатуры из групп и сразу же цены в одном запросе. Ага, проще некуда)
19. nomad_irk 76 20.10.20 08:30 Сейчас в теме
(6)
Выбрать 
	СпрНоменклатура.Ссылка КАК Номенклатура, 
	Настройки.ТипЦен, 
	Настройки.Подразделение
ПОМЕСТИТЬ ВТ_НоменклатураНастройки
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
	ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаНастроек КАК Настройки
	ПО Истина
ГДЕ
	СпрНоменклатура.Ссылка В ИЕРАРХИИ(Выбрать Т.Номенклатура ИЗ ТаблицаНастроек КАК Т) 
	И НЕ СпрНоменклатура.ЭтоГруппа
;
Выбрать
	Цены.Номенклатура,
	Цены.Цена
ИЗ
	РегистрСведений.Цены.СрезПоследних(, (Номенклатура, ТипЦен, Подразделение) В (Выбрать Т.Номенклатура. Т.ТипЦен, Т.Подразделение ИЗ ВТ_НоменклатураНастройки КАК Т)) КАК Цены
Показать


Заявление на перечисление мне на карточку 50% процентов своей ЗП отнесешь в бухгалтерию.
20. FatPanzer 20.10.20 08:34 Сейчас в теме
(19) А еще бывают левые соединения... Не рассказывай это автору с восьмилетним стажем.
25. triviumfan 93 20.10.20 09:09 Сейчас в теме
(20) Мальчик, иди куда шёл.
24. triviumfan 93 20.10.20 09:08 Сейчас в теме
(19) Результат неверен как и твоё полное соединение.
Прикрепленные файлы:
26. nomad_irk 76 20.10.20 09:10 Сейчас в теме
(24) и в чем он не верен? какое полное соединение?
27. triviumfan 93 20.10.20 09:14 Сейчас в теме
(26) я же скриншот дал, смотри (15)
Полное, которое внешнее.
28. nomad_irk 76 20.10.20 09:17 Сейчас в теме
(27)Что на скриншоте не так? Элементы группы вместо самой группы есть? Вид цены есть? Подразделение есть? Что еще нужно?
Перестань говорить загадками. Какое полное? Какое внешнее? Ты о чем вообще?
29. FatPanzer 20.10.20 09:28 Сейчас в теме
(28) Вот так всегда... Проблемы не у тебя, но козёл все равно ты...
user1464234; nomad_irk; +2 Ответить
30. triviumfan 93 20.10.20 09:31 Сейчас в теме
(28) Я уже не знаю как тебе объяснить.
Посмотри на таблицу настроек.
Для масла - цена продажи и своё подразделение
Для аккумулятора - своё.
Прикрепленные файлы:
31. nomad_irk 76 20.10.20 09:44 Сейчас в теме
(30) А вот не фиг использовать группу иерархического справочника для настроек.
Если нужны группы номенклатуры, то делают отдельную сущность.

Если сами цены установлены по типам цен, указанным в настройках, а по другим типам цен не установлены, то мой вариант отработает корректно. Отсечение произойдет в запросе к РегиструСведений.Цены.СрезПоследних.

Другими словами:

таблица цен:

Номенклатура1|ТипЦены1|Подразделение1|Цена1_1
Номенклатура2|ТипЦены1|Подразделение1|Цена2_1
Номенклатура3|ТипЦены1|Подразделение1|Цена3_1

и в ней нет записей

Номенклатура1|ТипЦены2|Подразделение1|Цена1_2
Номенклатура2|ТипЦены2|Подразделение1|Цена2_2
Номенклатура3|ТипЦены2|Подразделение1|Цена3_3
33. FatPanzer 20.10.20 10:16 Сейчас в теме
(31) Ах там еще и иерархия!!! Ну тогда придется еще один промежуточный подзапрос для получения всех нижестоящих группы из номенклатурной иерархии... А потом уже накладывать отбор по этим номенклатурным родителям на регистр цен.
34. triviumfan 93 20.10.20 10:21 Сейчас в теме
(31)
Если сами цены установлены по типам цен, указанным в настройках, а по другим типам цен не установлены, то мой вариант отработает корректно.

C чего ты решил, что по другим типам цен они не установлены?!
В том и сложность запроса.
35. nomad_irk 76 20.10.20 10:22 Сейчас в теме
(34)Установлены одним периодом?
37. triviumfan 93 20.10.20 10:31 Сейчас в теме
(35) Не важно, важно то, что нужно правильно дополнить таблицу настроек с набором полей "ГруппаНоменклатуры, ТипЦенДляЭтойГруппы, ПодразделениеДляЭтойГруппы", чтобы получить "ГруппаНоменклатуры, НоменклатураЭтойГруппы, ТипЦенДляЭтойГруппы, ПодразделениеДляЭтойГруппы".
38. nomad_irk 76 20.10.20 10:38 Сейчас в теме
(37) Это невозможно сделать, т.к. в таблице настроек для ГруппаНоменклатуры1 может быть ТипЦены1 и Подразделение1, для ГруппаНоменклатуры2 может быть ТипЦены2 и Подразделение2, а НоменклатураГруппы будет в итоге принадлежать и ГруппаНоменклатуры1 и ГруппаНоменклатуры2.


ГруппаНоменклатуры1
|_
   ГруппаНоменклатуры2
   |_
      ЭлементНоменклатуры
36. FatPanzer 20.10.20 10:27 Сейчас в теме
(34) В том что у одной номенклатуры может быть неограниченное количество иерархических родителей. И по каждой из них может быть установлена цена. Соответственно, все они будут удовлетворять условиям запроса (в иерархии)... Для того, чтобы система поняла, цену для какого из иерархического родителей брать - ей необходима шкала приоритетов (уровень иерархии хотя бы). Без этого задача невыполнима.

Понял, мальчик?
32. FatPanzer 20.10.20 09:45 Сейчас в теме
(30) Мальчик, левое соединение еще никто не отменял...
5. rpashkovsky 23 19.10.20 22:54 Сейчас в теме
1. Выбрали настройки - поместили в ВТ
2. Выбрали срез товаров с ценами- отобрали по настройках.

Не?
7. triviumfan 93 19.10.20 23:24 Сейчас в теме
(5)
2. Выбрали срез товаров с ценами- отобрали по настройках.

как я их выберу, если у меня группы?)
9. rpashkovsky 23 19.10.20 23:49 Сейчас в теме
(7) на пальцах: выбрать
Группа из настройки
Поместить в настройкивт;
Выбрать товар из товары где товар в иерархии(выбрать настройки.настройка из настройкивт как настройка)

Тут или я не понимаю всей сложности, или Вы простоты)
Постановка задачи слегка сумбурная.
В лоб сразу задача естественно не решается. Нужно или пакетами, или вложенными запросами в 2-3 шага решить
10. triviumfan 93 20.10.20 00:04 Сейчас в теме
(9)
Выбрать товар из товары где товар в иерархии(выбрать настройки.настройка из настройкивт как настройка)

Ты получишь товары, а как ты цены будешь искать? цены уникальны в разрезе номенклатуры, типа цен и подразделения
Одной таблицы товаров недостаточно.
Сложность как раз в том, чтобы найти элементы номенклатуры для каждой строки таблицы настроек, чтобы в результате получить
Номенклатура | ТипЦен | Подразделение
=======
Дано:
Масла | Цена продажи | Магазин1

Нужно получить:
Лукойл | Цена продажи | Магазин1
Тебойл | Цена продажи | Магазин1
Роснефть | Цена продажи | Магазин1

А потом уже цену искать.
13. rpashkovsky 23 20.10.20 00:19 Сейчас в теме
(10) Cемён Семёныч...Ну нужно подумать :)
8. triviumfan 93 19.10.20 23:33 Сейчас в теме
Имеется таблица настроек:
ГруппаНоменклатуры | ТипЦен | Подразделение

Изначально я хотел:
1. Получить таблицу элементов номенклатуры:
Номенклатура | ТипЦен | Подразделение
2. Получить цены (отбором сразу по этим трем измерениям)
11. rpashkovsky 23 20.10.20 00:14 Сейчас в теме
(8) Блин
ВЫБРАТЬ
	Номенклатура.Ссылка,
	1 КАК Связь
ПОМЕСТИТЬ ТоварНастрВТ
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Код = "00000000403"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТипыЦенНоменклатуры.Ссылка,
	1 КАК Связь
ПОМЕСТИТЬ ТипыЦенНастрВТ
ИЗ
	Справочник.ТипыЦенНоменклатуры КАК ТипыЦенНоменклатуры
ГДЕ
	ТипыЦенНоменклатуры.Ссылка = &Утвержденная
;


////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТоварНастрВТ.Ссылка КАК Товар,
	ТипыЦенНастрВТ.Ссылка КАК ТипЦены
ПОМЕСТИТЬ НастройкиВТ
ИЗ
	ТоварНастрВТ КАК ТоварНастрВТ
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТипыЦенНастрВТ КАК ТипыЦенНастрВТ
		ПО ТоварНастрВТ.Связь = ТипыЦенНастрВТ.Связь
;
//До этого момента - анагол твоих "настроек"

//Далее получаем цены и что там еще нужно
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	ЦеныНоменклатурыСрезПоследних.Цена,
	ЦеныНоменклатурыСрезПоследних.ТипЦен
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
ГДЕ
	ЦеныНоменклатурыСрезПоследних.Номенклатура В ИЕРАРХИИ
			(ВЫБРАТЬ
				НастройкиВТ.Товар
			ИЗ
				НастройкиВТ КАК НастройкиВТ)
	И ЦеныНоменклатурыСрезПоследних.ТипЦен В ИЕРАРХИИ
			(ВЫБРАТЬ
				НастройкиВТ.ТипЦены
			ИЗ
				НастройкиВТ КАК НастройкиВТ)
Показать

//Запрос проверил, всё работает http://joxi.ru/5mdOOxvI8JGBRr
15. triviumfan 93 20.10.20 01:01 Сейчас в теме
(11) Результат будет неверный, отбор должен быть одновременно по нескольким полям настроек.

До получения цен у тебя было:
Товар1 ТипЦен1
Товар2 ТипЦен2

После получения цен получишь:
товар1 типцен1 цена1
товар1 типцен2 цена2
товар2 типцен1 цена3
товар2 типцен1 цена4

Ты должен получать цены так:
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, (Номенклатура, ТипЦен) В (...))

Читай условия задачи.
16. rpashkovsky 23 20.10.20 01:02 Сейчас в теме
12. rpashkovsky 23 20.10.20 00:15 Сейчас в теме
ИМХО лучше использовать "ГДЕ" в срезе, чем коррелирующий запрос.
14. rpashkovsky 23 20.10.20 00:55 Сейчас в теме
Дернул меня нечистый зайти в эту ветку, теперь не спи, думай)) Вынужден признать, что был неправ. Как варик собрать текст запроса в цикле для каждой строки настроек.
17. triviumfan 93 20.10.20 01:03 Сейчас в теме
(14)
Как варик собрать текст запроса в цикле для каждой строки настроек.

Это я завтра сделаю, если никто не подскажет более оригинальный путь как получить необходимую таблицу номенклатуры исходя из настроек.
18. rpashkovsky 23 20.10.20 01:05 Сейчас в теме
(17) Будет интересно самому узнать изящное решение
39. triviumfan 93 20.10.20 14:40 Сейчас в теме
(18) Решение готово - это динамический запрос типа:
	Для Каждого Стр Из Настройки Цикл
		
		ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ
		                              |	Номенклатура.Ссылка КАК Номенклатура,
		                              |	&Параметр2 КАК ТипЦен,
		                              |	&Параметр3 КАК ПодразделениеКомпании
		                              |ИЗ
		                              |	Справочник.Номенклатура КАК Номенклатура
		                              |ГДЕ
		                              |	Номенклатура.Производитель <> ЗНАЧЕНИЕ(Справочник.Производители.ПустаяСсылка)
		                              |	И Номенклатура._АртикулДляПоиска <> """"
		                              |	И Номенклатура.Ссылка В ИЕРАРХИИ(&Параметр1)";
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Параметр1", "ГруппаНоменклатуры" + Стр.НомерСтроки);
		Запрос.УстановитьПараметр("ГруппаНоменклатуры" + Стр.НомерСтроки, Стр.Номенклатура);
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Параметр2", "ТипЦен" + Стр.НомерСтроки);
		Запрос.УстановитьПараметр("ТипЦен" + Стр.НомерСтроки, Стр.ТипЦены);
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Параметр3", "ПодразделениеКомпании" + Стр.НомерСтроки);
		Запрос.УстановитьПараметр("ПодразделениеКомпании" + Стр.НомерСтроки, Стр.Подразделение);
		
		Если Стр.НомерСтроки < Настройки.Количество() Тогда
			
			ТекстЗапроса = ТекстЗапроса + "
			| ОБЪЕДИНИТЬ ВСЕ
			|";
			
		КонецЕсли;
		
	КонецЦикла;
// далее остатки, цены и пр.
Показать
21. ixijixi 1805 20.10.20 08:52 Сейчас в теме
Запрос = Новый Запрос("
"ВЫБРАТЬ
|	Т.Номенклатура КАК Номенклатура,
|	Т.Цена КАК Цена
|ИЗ
|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК Т";
Запрос.УстановитьПараметр("Номенклатура", ТаблицаНастроек.ВыгрузитьКолонку("Номенклатура"));
22. triviumfan 93 20.10.20 08:56 Сейчас в теме
(21) тоже самое, про что я говорил в (15).
Результат будет неверен.
23. ixijixi 1805 20.10.20 09:06 Сейчас в теме
(22) А так
ВЫБРАТЬ
	С.Ссылка КАК Номенклатура,
	Т.Цена КАК Цена
ИЗ
	Справочник.Номенклатура КАК С
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Т
		ПО (Т.Номенклатура = С.Ссылка)
			И (Т.ТипЦен В
				(ВЫБРАТЬ
					Т.ТипЦен
				ИЗ
					ТаблицаНастроек КАК Т))
ГДЕ
	С.Ссылка В ИЕРАРХИИ(&Номенклатура)
Показать
Оставьте свое сообщение

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