Реализация подбора товаров с характеристиками

1. srub 85 09.11.18 16:09 Сейчас в теме
Добрый день! Подскажите пожалуйста, нет ли у кого примера реализации подбора товаров с характеристиками. Никак не могу составить динамический запрос, который вытягивал бы товар с присущими ему характеристиками. Характеристики реализованы по схеме:ПланВидовХарактеристик.СвойстваНоменклатуры, подчиненный ему Справочник.ВидыХарактеристик и РегистрСведений.ЗначенияСвойствНоменклатуры с измерениями НаборСвойств(СправочникСсылка.Номенклатура), ВидСвойства(ПланВидовХарактеристикСсылка.СвойстваНоменклатуры) и ресурсом Значение(Характеристика.СвойстваНоменклатуры)
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
18. AJlKuP 12.11.18 11:26 Сейчас в теме +1 $m
(17)Т.к. у вас номенклатура с характеристиками (т.е. может быть несколько одинаковых номенклатур), сделать иерархию через динамический список стандартными средствами не выйдет. У вас 2 варианта:
1. Переделать на дерево значений и использовать ИТОГИ.
2. Вынести иерархию в отдельный список (как в типовых: слева дерево папок, справа номенклатура и остатки с ценами).
И еще один момент: когда делаете полное соединение, необходимо использовать ЕСТЬNULL для всех полей, например:
ЕСТЬNULL(ОстаткиНаСкладахОстатки.Номенклатура, ЦеныНоменклатурыСрезПоследних.Номенклатура) КАК Номенклатура
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. Boneman 298 09.11.18 16:38 Сейчас в теме
(1) если конфа типовая, почему бы не передрать с какого нибудь документа, товарного ?
9. srub 85 09.11.18 16:59 Сейчас в теме
(6)
Конфа самописная и я уже почти реализовал подбор, но не удается подвязать в запрос Справочник.Номенклатура, чтобы товары отображались в иерархии. Без иерархии сделал.
2. user633533_encantado 11 09.11.18 16:11 Сейчас в теме
Вы ведете учет остатков в разрезе характеристик ?
3. srub 85 09.11.18 16:13 Сейчас в теме
4. user633533_encantado 11 09.11.18 16:32 Сейчас в теме
(3) Ну значит у вас есть регистр накопления вида "Номенклатура, Характеристика" - 1 шт.

При подборе товара по остаткам открывайте форму выбора с таблицей с колонками "Номенклатура, Характеристика, количество" и заполняйте ее из своего регистра.

Собственно так и сделано во всех конфигурациях, в чем ваше отличие ?
7. srub 85 09.11.18 16:50 Сейчас в теме
(4)
Я изначально так и сделал, соеденив в запросе РегистрНакоплений.ОстаткиНаСкладах и РегистрСведений.ЦеныНоменклатуры, чтобы еще получить остатки и цену для товаров. Но мне хочется, чтобы номенклатура отображалась в иерархии, значит туда нужно как то подвязать Справочник.Номенклатура. И если бы не было характеристик, никаких проблем, но именно наличие характеристик у меня и вызывает затруднение.
10. user633533_encantado 11 09.11.18 17:05 Сейчас в теме
(7) Делайте заполнение с помощью СКД, там в группировке можно указать, что нужно выводить с иерархией.
11. srub 85 09.11.18 17:12 Сейчас в теме
(10)
А не могли бы Вы подробней написать как это сделать? У меня немного опыта программирования. Есть динамический запрос в форме подбора справочника Номенклатура как оттуда выйти в СКД?
12. user633533_encantado 11 09.11.18 17:28 Сейчас в теме
(11) Много и долго писать. Поищите как результат СКД вывести в дерево значений. В вашем случае это будет именно дерево, раз иерархия.
13. srub 85 09.11.18 17:53 Сейчас в теме
(12)
Тут еще одна проблема. Если товара нет на остатках, то при реализации подбора через регистр накопления ОстаткиНаСкладах мы его не увидим в форме подбора. И тут снова встает проблема, как связать Справочник.Номенклатура с регистрами остатков и цен, так чтобы подтянуть туда и характеристики? И СКД тут не поможет, потому как снова все упирается в запрос. А будет запрос связывающий все воедино, так можно и без СКД обойтись так как Справочник Номенклатура иерархический.
14. user633533_encantado 11 09.11.18 17:58 Сейчас в теме
(13) Элементарная задача через левое соединение связать таблицу номенклатуры с таблицей остатков.
15. srub 85 09.11.18 18:17 Сейчас в теме
(14)
Когда нет характеристик задача действительно элементарная. Левое соединение Справочник.Номенклатура с регистрами ОстаткиНаСкладах и ЦеныНоменклатуры где СправочникСсылкаНоменклатура = Измерение Номенклатура у регистров. Но когда присутствуют характеристики, с чем связывать измерение Характеристика у регистров? Справочник.Номенклатура не является владельцем справочника ХарактеристикиНоменклатуры и как тут быть?

Вот запрос из моего подбора но там нет справочника Номенклатура:

ВЫБРАТЬ
	ОстаткиНаСкладахОстатки.Номенклатура КАК Номенклатура,
	ОстаткиНаСкладахОстатки.Характеристика КАК Характеристика,
	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
	ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
	ОстаткиНаСкладахОстатки.Склад КАК Склад,
	ЕСТЬNULL(ОстаткиНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
ИЗ
	РегистрНакопления.ОстаткиНаСкладах.Остатки(&Дата, ) КАК ОстаткиНаСкладахОстатки
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
		ПО ОстаткиНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
			И ОстаткиНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
Показать
16. AJlKuP 10.11.18 14:35 Сейчас в теме
(15)Вам остался один шаг. Поместите данный запрос в подзапрос или во временную таблицу и соедините со справочником Номенклатура только по номенклатуре левым соединением. Если вам нужно, дерево и у вас не СКД, смотрите в сторону ИТОГИ ПО... ИЕРАРХИЯ.
А вообще рекомендую агрегировать остатки и цены полным соединением или объединением, т.к. может же быть ситуация, когда остатков нет, а цена есть, тогда пользователь ее просто не увидит.
17. srub 85 10.11.18 15:34 Сейчас в теме
(16)
Спасибо! Я так и сделал, но в динамическом запросе нет итогов.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ОстаткиНаСкладахОстатки.Характеристика КАК Характеристика,
	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
	ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
	ОстаткиНаСкладахОстатки.Склад КАК Склад,
	ЕСТЬNULL(ОстаткиНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
	ОстаткиНаСкладахОстатки.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ
ИЗ
	РегистрНакопления.ОстаткиНаСкладах.Остатки(&Дата, ) КАК ОстаткиНаСкладахОстатки
		ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
		ПО ОстаткиНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
			И ОстаткиНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СпрНоменклатура.Ссылка КАК Номенклатура,
	ВТ.Характеристика КАК Характеристика,
	ВТ.ВидЦены КАК ВидЦены,
	ВТ.Цена КАК Цена,
	ВТ.Склад КАК Склад,
	ВТ.КоличествоОстаток КАК КоличествоОстаток
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
		ПО СпрНоменклатура.Ссылка = ВТ.Номенклатура
ГДЕ
	СпрНоменклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Услуга)
Показать


И у меня по итогу так и не выходит получить дерево как хотелось бы
Прикрепленные файлы:
18. AJlKuP 12.11.18 11:26 Сейчас в теме +1 $m
(17)Т.к. у вас номенклатура с характеристиками (т.е. может быть несколько одинаковых номенклатур), сделать иерархию через динамический список стандартными средствами не выйдет. У вас 2 варианта:
1. Переделать на дерево значений и использовать ИТОГИ.
2. Вынести иерархию в отдельный список (как в типовых: слева дерево папок, справа номенклатура и остатки с ценами).
И еще один момент: когда делаете полное соединение, необходимо использовать ЕСТЬNULL для всех полей, например:
ЕСТЬNULL(ОстаткиНаСкладахОстатки.Номенклатура, ЦеныНоменклатурыСрезПоследних.Номенклатура) КАК Номенклатура
19. srub 85 12.11.18 14:14 Сейчас в теме
(18)

Спасибо, я как раз и пошел этим путем. Создал РеквизитФормы ИерархияНоменклатуры (ТаблицаЗначений) и переделал Список из ДинамическогоСписка в ТаблицуЗначений.



Это код формы подбора
&НаКлиенте
Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка)//Выбор номенклатуры кликом
	ТекСтрока = Элементы.Список.ТекущиеДанные;
	
	Структура = Новый Структура("Номенклатура, Характеристика, Цена", ТекСтрока.Номенклатура,ТекСтрока.Характеристика, ТекСтрока.Цена);
	  		
	СтандартнаяОбработка = ЛОЖЬ;
	//Поиск идентичной номенклатуры в ТаблицеЗначений	
	Строка = ОтобранныеТовары.НайтиСтроки(Новый Структура("Номенклатура, Характеристика, Цена", Структура.Номенклатура, Структура.Характеристика, Структура.Цена));	
	//Если Номенклатура уже записана то просто добавляем 1 к Количеству
	Если Строка.Количество() > 0 Тогда
	     Строка[0].Количество = Строка[0].Количество+1;
		 Строка[0].Сумма = Строка[0].Количество * Строка[0].Цена;
    Иначе//Создаем новый элемент
		 НовСтр = ОтобранныеТовары.Добавить();	
		 НовСтр.Номенклатура = ТекСтрока.Номенклатура;
		 НовСтр.Характеристика = ТекСтрока.Характеристика;
		 НовСтр.Количество = 1;
		 НовСтр.Цена = ТекСтрока.Цена;
		 НовСтр.Сумма = ТекСтрока.Цена;
	КонецЕсли; 
КонецПроцедуры


&НаКлиенте
Процедура СписокНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)//Выбор номенклатуры перетаскиванием	
	ТекСтрока = Элементы.Список.ТекущиеДанные;
	
	Структура = Новый Структура("Номенклатура, Характеристика, Цена", ТекСтрока.Номенклатура,ТекСтрока.Характеристика, ТекСтрока.Цена);
	  		
	СтандартнаяОбработка = ЛОЖЬ;
	//Поиск идентичной номенклатуры в ТаблицеЗначений	
	Строка = ОтобранныеТовары.НайтиСтроки(Новый Структура("Номенклатура, Характеристика", Структура.Номенклатура, Структура.Характеристика));	
	//Если Номенклатура уже записана то просто добавляем 1 к Количеству
	Если Строка.Количество() > 0 Тогда
	     Строка[0].Количество = Строка[0].Количество+1;
		 Строка[0].Сумма = Строка[0].Количество * Строка[0].Цена;
    Иначе//Создаем новый элемент
		 НовСтр = ОтобранныеТовары.Добавить();	
		 НовСтр.Номенклатура = ТекСтрока.Номенклатура;
		 НовСтр.Характеристика = ТекСтрока.Характеристика;
		 НовСтр.Количество = 1;
		 НовСтр.Цена = ТекСтрока.Цена;
		 НовСтр.Сумма = ТекСтрока.Цена;
	КонецЕсли; 
КонецПроцедуры


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	 ВидЦены = Параметры.ВидЦены;
	 Склад =Параметры.Склад;
	 Дата = Параметры.Дата;
КонецПроцедуры

&НаКлиенте
Процедура ПеренестиВДокумент(Команда)
	ОповеститьОВыборе(ОтобранныеТовары);
КонецПроцедуры



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


&НаКлиенте
Процедура ИерархияНоменклатурыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Родитель = Элементы.ИерархияНоменклатуры.ТекущаяСтрока;
	ЗаполнитьСписокНаСервере(Родитель);
КонецПроцедуры

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ТекСтрока = Элементы.Список.ТекущиеДанные;
	
	Структура = Новый Структура("Номенклатура, Характеристика, Цена", ТекСтрока.Номенклатура,ТекСтрока.Характеристика, ТекСтрока.Цена);
	  		
	СтандартнаяОбработка = ЛОЖЬ;
	//Поиск идентичной номенклатуры в ТаблицеЗначений	
	Строка = ОтобранныеТовары.НайтиСтроки(Новый Структура("Номенклатура, Характеристика, Цена", Структура.Номенклатура, Структура.Характеристика, Структура.Цена));	
	//Если Номенклатура уже записана то просто добавляем 1 к Количеству
	Если Строка.Количество() > 0 Тогда
	     Строка[0].Количество = Строка[0].Количество+1;
		 Строка[0].Сумма = Строка[0].Количество * Строка[0].Цена;
    Иначе//Создаем новый элемент
		 НовСтр = ОтобранныеТовары.Добавить();	
		 НовСтр.Номенклатура = ТекСтрока.Номенклатура;
		 НовСтр.Характеристика = ТекСтрока.Характеристика;
		 НовСтр.Количество = 1;
		 НовСтр.Цена = ТекСтрока.Цена;
		 НовСтр.Сумма = ТекСтрока.Цена;
	КонецЕсли; 
КонецПроцедуры

(
Показать
Прикрепленные файлы:
5. user970630 09.11.18 16:37 Сейчас в теме
А вы сами хотите сделать? Не подойдет что-то из этого?

https://infostart.ru/public/656128/
https://infostart.ru/public/601863/
8. srub 85 09.11.18 16:55 Сейчас в теме
(5)
Спасибо. Я хочу попробовать реализовать подбор самостоятельно , ну или почти самостоятельно))
Оставьте свое сообщение

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