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