Проверка спецификации на доступность материалов

1. XelOla 19 16.12.19 11:40 Сейчас в теме
Здравствуйте!
Предложите пожалуйста, алгоритм проверки наличия материалов для выпуска Колва продукции, у которой есть несколько спецификаций, которые могут различаться материалом.
т.е. для выпуска Продукция 20 шт,
в спецификации1 может потребоваться Материал1 0,5*20 и Материал2 3*20;
в спецификации2 может потребоваться Материал1 0,4*20 и Материал3 8*20;
в спецификации3 может потребоваться Материал2 3*20 и Материал4 1*20.
Ну к примеру так. те подобрать просто по наличию, отдавая предпочтение Основной.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. XelOla 19 16.12.19 11:51 Сейчас в теме
Все таки надо, проверять и на стоимость по спецификации.

т.е. выбрать оптимальный вариант стоимости и учитывать, чтобы было наличие.
не придумаю алгоритм.
3. Lenten 25 16.12.19 12:54 Сейчас в теме
1) сделайте табличку с материалами по всем спецификациям (товару - спецификация - материал)
2) далее проверьте наличие всех материалов. Если материала нет- убирайте целиком эту спецификацию)
3) Далее получите себестоимость всех оставшихся материалов и суммируйте ее по спецификации.
4) отсортируйте по себестоимости спецификации и выберете самую дешевую
4. XelOla 19 16.12.19 15:23 Сейчас в теме
(3)
да вот не могу сложить в голове, как проверить наличие например?
5. Lenten 25 16.12.19 15:31 Сейчас в теме
(4) что-то типа того



ВЫБРАТЬ
	Таблица.Товар КАК Товар,
	Таблица.спецификации КАК спецификации,
	Таблица.материал КАК материал,
	Таблица.КоличествоМатериала КАК КоличествоМатериала
ПОМЕСТИТЬ Вт_основная
ИЗ
	&Таблица КАК Таблица
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Вт_1.Товар КАК Товар,
	Вт_1.спецификации КАК спецификации,
	Вт_1.материал КАК материал,
	Вт_1.КоличествоМатериала КАК КоличествоМатериала,
	ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК ВНаличииОстаток
ИЗ
	Вт_основная КАК Вт_1
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки
		ПО (Вт_1.материал = ТоварыНаСкладахОстатки.Номенклатура)
Показать
6. XelOla 19 18.12.19 16:43 Сейчас в теме
(5) как вам такое решение
ВыбраннаяСпецификация = Справочники.Спецификации.ПустаяСсылка();
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	СпецификацииСостав.Ссылка КАК Ссылка,
	|	ВЫБОР
	|		КОГДА СпецификацииПоУмолчанию.Спецификация ЕСТЬ NULL
	|			ТОГДА ""Нет""
	|		ИНАЧЕ ""Да""
	|	КОНЕЦ КАК ПоУмолчанию
	|ИЗ
	|	Справочник.Спецификации.Состав КАК СпецификацииСостав
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СпецификацииПоУмолчанию КАК СпецификацииПоУмолчанию
	|		ПО СпецификацииСостав.Ссылка = СпецификацииПоУмолчанию.Спецификация
	|ГДЕ
	|	СпецификацииСостав.Ссылка.Владелец = &Номенклатура
	|
	|СГРУППИРОВАТЬ ПО
	|	СпецификацииСостав.Ссылка,
	|	ВЫБОР
	|		КОГДА СпецификацииПоУмолчанию.Спецификация ЕСТЬ NULL
	|			ТОГДА ""Нет""
	|		ИНАЧЕ ""Да""
	|	КОНЕЦ
	|
	|УПОРЯДОЧИТЬ ПО
	|	Ссылка";
	Запрос.УстановитьПараметр("Номенклатура",ПараметрыВыбораСпецификации.Номенклатура); 
	РезультатЗапроса = Запрос.Выполнить().Выгрузить();
	ТЗСпец = Новый ТаблицаЗначений;
	ТЗСпец.Колонки.Добавить("Спецификация");
	ТЗСпец.Колонки.Добавить("Материал");
	ТЗСпец.Колонки.Добавить("КолВоПродукции");
	ТЗСпец.Колонки.Добавить("КолвоМатериалаТребуется");
	ТЗСпец.Колонки.Добавить("КолвоМатериалаЕсть");
	ТЗСпец.Колонки.Добавить("СтоимостьПартии");
	ТЗСпец.Колонки.Добавить("Основная");
	Для Каждого Спец Из РезультатЗапроса Цикл
		СпецификацияДляОбсчета = Спец.Ссылка;
		Если Спец.ПоУмолчанию = "Да" Тогда
			ВыбраннаяСпецификация = СпецификацияДляОбсчета;
		КонецЕсли;	
		Запрос = Новый Запрос;
		Запрос.Текст =  "ВЫБРАТЬ
		                |	СпецификацииСостав.Номенклатура КАК Номенклатура,
		                |	СпецификацииСостав.Количество КАК Количество,
		                |	СпецификацииСостав.КоличествоПродукции КАК КоличествоПродукции,
		                |	ЗапасыОстатки.СуммаОстаток КАК СуммаОстаток,
		                |	ЗапасыОстатки.КоличествоОстаток КАК КоличествоОстаток
		                |ИЗ
		                |	Справочник.Спецификации.Состав КАК СпецификацииСостав
		                |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки КАК ЗапасыОстатки
		                |		ПО СпецификацииСостав.Ссылка = ЗапасыОстатки.Номенклатура
		                |ГДЕ
		                |	СпецификацииСостав.Ссылка = &Ссылка
		                |	И ЗапасыОстатки.Организация = &Организация
		                |	И ЗапасыОстатки.СтруктурнаяЕдиница = &СтруктурнаяЕдиница";
		Запрос.УстановитьПараметр("Ссылка",СпецификацияДляОбсчета); 
		Запрос.УстановитьПараметр("Организация",ПараметрыВыбораСпецификации.Организация); 
		Запрос.УстановитьПараметр("СтруктурнаяЕдиница",ПараметрыВыбораСпецификации.Склад); 
		РезультатСпецификации = Запрос.Выполнить();
		Выборка = РезультатСпецификации.Выбрать();
		Пока Выборка.Следующий() Цикл
			
			СтоимостьЕдиницыМатериала = Выборка.СуммаОстаток / Выборка.КоличествоОстаток;
			КолвоМатериалаНаЕдиницуПродукта = Выборка.Количество / Выборка.КоличествоПродукции;
			КолвоМатериалаНаКоличествоПродукта = ПараметрыВыбораСпецификации.Количество * КолвоМатериалаНаЕдиницуПродукта;
			СтоимостьМатериалаНаКоличествоПродукта = СтоимостьЕдиницыМатериала*КолвоМатериалаНаКоличествоПродукта;
			СтоимостьМатериалаНаЕдиницуПродукта  = СтоимостьЕдиницыМатериала*КолвоМатериалаНаЕдиницуПродукта;
			Стр = ТЗСпец.Добавить();
			Стр.Спецификация = СпецификацияДляОбсчета;
			Стр.Основная = Спец.ПоУмолчанию;
			Стр.Материал = Выборка.Номенклатура;
			//Стр.КолВоПродукции = Выборка.Номенклатура;
			Стр.КолвоМатериалаТребуется = КолвоМатериалаНаКоличествоПродукта;
			Стр.КолвоМатериалаЕсть = Выборка.КоличествоОстаток;
			Стр.СтоимостьПартии = СтоимостьЕдиницыМатериала*КолвоМатериалаНаКоличествоПродукта;
		КонецЦикла;	
	КонецЦикла;
	Если ТЗСпец.Количество() > 0 Тогда
		ТЗВычКолво = ТЗСпец.СкопироватьКолонки("Спецификация, Основная, КолвоМатериалаТребуется,КолвоМатериалаЕсть");
		ТЗВычКолво.Свернуть("Спецификация, Основная", "КолвоМатериалаТребуется,КолвоМатериалаЕсть,СтоимостьПартии");
		ТЗВычКолво.Сортировать("Основная Возр, СтоимостьПартии Возр");
		Для Каждого Стр Из ТЗВычКолво Цикл
			Если ТЗВычКолво.КолвоМатериалаЕсть>= ТЗВычКолво.КолвоМатериалаТребуется Тогда
				ВыбраннаяСпецификация = ТЗВычКолво.Спецификация;
				Прервать;
			КонецЕсли;	
			Сообщить("" + Стр.Спецификация  + " основная:" +  Стр.Основная  + " требуется: " +  Стр.КолвоМатериалаТребуется  + " есть: " +  Стр.КолвоМатериалаЕсть  + " стоимость партии: " +  Стр.СтоимостьПартии); 
		КонецЦикла;
	КонецЕсли;	
	
	Возврат ВыбраннаяСпецификация;
Показать
7. Lenten 25 18.12.19 17:06 Сейчас в теме
1) традиционно. Запросы в цикле не лучшее решение при больших объемах данных. Если будет сильно лагать - надо все это в 1 запросе писать
2) проверьте ситуацию, когда вам надо будет собирать товары из материалов, которые сами являются сборными
пример

собираем кухню
1 кухня - стол и 4 стула, при этом 1 стул тоже собирается из 1 доски и 4 ножек.

в такой ситуации вам надо использовать рекурсию

3) глазами тяжело проверять код без отладчика, но у вас в конце с либо возвращается спецификация, либо сообщаются данные. вы этого хотели?
4) проверьте единицы измерения. Если у вас в спецификации и на остатках в разных единицах номенклатура - будет ошибка
5)
ТЗВычКолво = ТЗСпец.СкопироватьКолонки("Спецификация, Основная, КолвоМатериалаТребуется,КолвоМатериалаЕсть");
        ТЗВычКолво.Свернуть("Спецификация, Основная", "КолвоМатериалаТребуется,КолвоМатериалаЕсть,СтоимостьПартии");
        ТЗВычКолво.Сортировать("Основная Возр, СтоимостьПартии Возр");


вы копируете колонки, а потом сортируете по тем, которые не копировали.
8. XelOla 19 19.12.19 11:15 Сейчас в теме
(7)
пункт 2 надеюсь что сборных не будет
пункт 4 надеюсь, что одна единица измерения
Уточню.
пункт 5 СкопироватьКолонки - копирует без значений, только заголовки колонок, выкинула.
Сообщить("" + - это не работает, по другому
Оставьте свое сообщение

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