Дело в уровнях ?

1. Intercititude 12.02.19 15:10 Сейчас в теме
Есть документы "Внутренние заказы".
В них указывается номенклатура,у которой имеется своя Спецификация, которая в свою очередь содержит комплектующие.
На основании "Внутренних заказов" заполняется ТЧ "Потребности" - "Заполнить потребности".

Вопрос! Почему при нажатии кнопки "Заполнить потребности",табличная часть заполняется Комплектующими Спецификации? Хотя ДОЛЖНА заполняться только номенклатурой и её спецификации!

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


В Этой строке начинаются изменения!:
МассивОшибок = РазузлованиеНоменклатуры.РазузловатьНоменклатуру(ИсхПараметры, Результат, Параметры);

		Если мИспользоватьРазузлование Тогда
			
			Для каждого Строка из НовыеПотребности Цикл
				
				Если Строка.ВидВоспроизводства = Перечисления.ВидыВоспроизводстваНоменклатуры.Производство Тогда
					
					ИсхПараметры = Новый Структура;
					ИсхПараметры.Вставить("Номенклатура", Строка.Номенклатура);
					ИсхПараметры.Вставить("ХарактеристикаНоменклатуры", Строка.ХарактеристикаНоменклатуры);
					ИсхПараметры.Вставить("Количество", Строка.Количество);
					ИсхПараметры.Вставить("Спецификация", Строка.Спецификация);
							
					Результат = Новый Структура;
					Результат.Вставить("ИсходныеКомплектующие");
							
					МассивВидовВоспроизводства = Новый Массив;
					МассивВидовВоспроизводства.Добавить(Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка);
					МассивВидовВоспроизводства.Добавить(Перечисления.ВидыВоспроизводстваНоменклатуры.Переработка);
					
					Параметры = Новый Структура;
					Параметры.Вставить("ДатаСпецификации", Строка.ДатаПотребности);
					Параметры.Вставить("Отбор", Новый Структура("ВидВоспроизводства", МассивВидовВоспроизводства));
					
					МассивОшибок = РазузлованиеНоменклатуры.РазузловатьНоменклатуру(ИсхПараметры, Результат, Параметры);
					
					Если МассивОшибок.Количество() > 0 Тогда
						
						Для каждого Ошибка из МассивОшибок Цикл
							
							Сообщить("Ошибка: " + Ошибка.Причина, Ошибка.СтатусОшибки);
							Сообщить(" Спецификация: " + Ошибка.Спецификация);
							Сообщить(" Номер строки: " + Ошибка.НомерСтроки);
							Сообщить(" Описание ошибки: " + Ошибка.ОписаниеОшибки);
						
						КонецЦикла;
						
					КонецЕсли;
							
					Если Результат <> Неопределено Тогда
						
						Для каждого СтрокаРазузлования из Результат.ИсходныеКомплектующие Цикл
							
							УправлениеПланированием.ДополнитьТаблицу(ТекущиеПотребности, НовыеПотребности,, НовыеПотребности.Индекс(Строка));
							ИндексСтроки = ТекущиеПотребности.Количество() - 1;
							ТекущиеПотребности[ИндексСтроки].Номенклатура = СтрокаРазузлования.Номенклатура;
							ТекущиеПотребности[ИндексСтроки].ХарактеристикаНоменклатуры = СтрокаРазузлования.ХарактеристикаНоменклатуры;
							ТекущиеПотребности[ИндексСтроки].ЕдиницаИзмерения = СтрокаРазузлования.Номенклатура.ЕдиницаХраненияОстатков;
Показать


Точкой останова дошёл до этого момента и полагаю, что дело в уровнях :
Функция РазузловатьНоменклатуру(Источник, Результат = Неопределено, Параметры = Неопределено) Экспорт
	
	ИнициализацияПараметров(Параметры);
	ИнициализацияРезультатаРазузлования(Результат, Параметры);
	
	МассивОшибок = Новый Массив;
	Уровень = 0;
	
	Если Источник.Свойство("Номенклатура") И ТипЗнч(Источник.Номенклатура) = Тип("СправочникСсылка.Номенклатура") И НЕ Источник.Номенклатура.Пустая() Тогда
		
		// Исходная строка добавляется в результат разузлования
		НоваяСтрока = Результат.ПолноеРазузлование.Добавить();
		
		НоваяСтрока.Уровень = Уровень;
		НоваяСтрока.Разузлован = Ложь;
		НоваяСтрока.НоменклатурнаяГруппа = Источник.Номенклатура.НоменклатурнаяГруппа;
		НоваяСтрока.Номенклатура = Источник.Номенклатура;
		НоваяСтрока.ХарактеристикаНоменклатуры = ?(Источник.Свойство("ХарактеристикаНоменклатуры"), Источник.ХарактеристикаНоменклатуры, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
		НоваяСтрока.ЕдиницаИзмерения = ?(Источник.Свойство("ЕдиницаИзмерения"), Источник.ЕдиницаИзмерения, НоваяСтрока.Номенклатура.ЕдиницаХраненияОстатков);
		НоваяСтрока.Коэффициент = ?(Источник.Свойство("Коэффициент"), Источник.Коэффициент, НоваяСтрока.ЕдиницаИзмерения.Коэффициент);
		НоваяСтрока.Количество = ?(Источник.Свойство("Количество"), Источник.Количество, 1);
		УстановитьВидВоспроизводства(НоваяСтрока);
		НоваяСтрока.Спецификация = ПолучитьСпецификацию(Источник, Параметры);
		УстановитьПараметрыВыходногоИзделия(НоваяСтрока);
		
		Если НЕ ДобавитьСпецификациюВПоследовательность(НоваяСтрока.Спецификация, НоваяСтрока.Последовательность) Тогда
			
			НоваяСтрока.Разузлован = Истина;
			ДобавитьВОшибки(СтатусСообщения.ОченьВажное, НСтр("ru='Обнаружено зацикливание в структуре изделия.'"), НСтр("ru='Зацикливание'"), НоваяСтрока.Спецификация, Неопределено, НоваяСтрока.Последовательность, МассивОшибок);
			
		КонецЕсли;
		
		Параметры.Вставить("Спецификация", НоваяСтрока.Спецификация);
		Параметры.Вставить("КоличествоВыпусков", ПолучитьКоличествоВыпусков(НоваяСтрока.Спецификация, НоваяСтрока.Номенклатура, НоваяСтрока.ХарактеристикаНоменклатуры, НоваяСтрока.Коэффициент, НоваяСтрока.Количество));
		Параметры.Вставить("ДоляСтоимости", ПолучитьДолюСтоимости(НоваяСтрока.Спецификация, НоваяСтрока.Номенклатура, НоваяСтрока.ХарактеристикаНоменклатуры, НоваяСтрока.Коэффициент));
		
		Результат.КоличествоВыпусков = Параметры.КоличествоВыпусков;
		
	ИначеЕсли Источник.Свойство("Спецификация") И ТипЗнч(Источник.Спецификация) = Тип("СправочникСсылка.СпецификацииНоменклатуры") И НЕ Источник.Спецификация.Пустая() Тогда
		
		ВыходноеИзделие = ПолучитьВыходныеИзделия(Источник.Спецификация);
		
		Если ВыходноеИзделие.Количество() = 0 Тогда
			
			НоваяСтрока = Результат.ПолноеРазузлование.Добавить();
					
			НоваяСтрока.Уровень = Уровень;
			НоваяСтрока.Разузлован = Ложь;
			НоваяСтрока.СопутствующееИзделие = Ложь;
			НоваяСтрока.Коэффициент = 1;
			НоваяСтрока.Количество = ?(Источник.Свойство("Количество"), Источник.Количество, 1);
			НоваяСтрока.Спецификация = Источник.Спецификация;
				
			Если НЕ ДобавитьСпецификациюВПоследовательность(НоваяСтрока.Спецификация, НоваяСтрока.Последовательность) Тогда
					
				НоваяСтрока.Разузлован = Истина;
				ДобавитьВОшибки(СтатусСообщения.ОченьВажное, НСтр("ru='Обнаружено зацикливание в структуре изделия.'"), НСтр("ru='Зацикливание'"), НоваяСтрока.Спецификация, Неопределено, НоваяСтрока.Последовательность, МассивОшибок);
					
			КонецЕсли;
			
		Иначе
			
			Пока ВыходноеИзделие.Следующий() Цикл
							
				НоваяСтрока = Результат.ПолноеРазузлование.Добавить();
					
				НоваяСтрока.Уровень = Уровень;
				НоваяСтрока.Разузлован = Ложь;
				НоваяСтрока.СопутствующееИзделие = ВыходноеИзделие.СопутствующееИзделие;
				НоваяСтрока.НомерОперацииМаршрута = ВыходноеИзделие.НомерОперацииМаршрута;
				НоваяСтрока.НоменклатурнаяГруппа = ВыходноеИзделие.НоменклатурнаяГруппа;
				НоваяСтрока.Номенклатура = ВыходноеИзделие.Номенклатура;
				НоваяСтрока.ХарактеристикаНоменклатуры = ВыходноеИзделие.ХарактеристикаНоменклатуры;
				НоваяСтрока.ЕдиницаИзмерения = ВыходноеИзделие.ЕдиницаИзмерения;
				НоваяСтрока.Коэффициент = ВыходноеИзделие.Коэффициент;
				НоваяСтрока.Количество = ?(Источник.Свойство("Количество"), ВыходноеИзделие.Количество * Источник.Количество, ВыходноеИзделие.Количество);
				НоваяСтрока.Спецификация = Источник.Спецификация;
				ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыходноеИзделие, "МинимальнаяПартия, Кратность, ДоляСтоимости, ТочкаМаршрута, Подразделение, РабочийЦентр");
				
				Если НЕ ДобавитьСпецификациюВПоследовательность(НоваяСтрока.Спецификация, НоваяСтрока.Последовательность) Тогда
					
					НоваяСтрока.Разузлован = Истина;
					ДобавитьВОшибки(СтатусСообщения.ОченьВажное, НСтр("ru='Обнаружено зацикливание в структуре изделия.'"), НСтр("ru='Зацикливание'"), НоваяСтрока.Спецификация, Неопределено, НоваяСтрока.Последовательность, МассивОшибок);
					
				КонецЕсли;
							
			КонецЦикла;
			
		КонецЕсли;
		
		Параметры.Вставить("Спецификация", Источник.Спецификация);
		Параметры.Вставить("КоличествоВыпусков", УправлениеПланированием.ПолучитьДробь(Источник.Количество, Источник.Количество));
		Параметры.Вставить("ДоляСтоимости", УправлениеПланированием.ПолучитьДробь(Источник.Количество, Источник.Количество));
		
		Результат.КоличествоВыпусков = Параметры.КоличествоВыпусков;
		
	Иначе
		
		ДобавитьВОшибки(СтатусСообщения.ОченьВажное, НСтр("ru='Не указана номенклатура или спецификация для разузлования.'"), НСтр("ru='Разузлование'"), Неопределено, Неопределено, Неопределено, МассивОшибок);
		
	КонецЕсли;
	
	Пока Истина Цикл
		
		Если Параметры.КоличествоУровнейРазузлования < 0 Тогда // Разузлование не требуется
			
			Прервать;
			
		КонецЕсли;
		
		// Получение позиций, требующих разузлования
		СтрокиТекущегоУровня = Результат.ПолноеРазузлование.НайтиСтроки(Новый Структура("Разузлован, Уровень", Ложь, Уровень));
		
		Если СтрокиТекущегоУровня.Количество() = 0 Тогда // Нет данных для разузлования
			
			Прервать;
			
		ИначеЕсли Параметры.КоличествоУровнейРазузлования > 0 И Уровень = Параметры.КоличествоУровнейРазузлования Тогда // Достигнут требуемый уровень разузлования
			
			Для каждого СтрокаТекущегоУровня из СтрокиТекущегоУровня Цикл
				
				СтрокаТекущегоУровня.Разузлован = Истина;
				
			КонецЦикла;
			
			Прервать;
			
		КонецЕсли;
			
		Уровень = Уровень + 1;
			
		Для каждого СтрокаТекущегоУровня из СтрокиТекущегоУровня Цикл
			
			СтрокаТекущегоУровня.Разузлован = Истина;
			
			Если СтрокаТекущегоУровня.Спецификация <> Неопределено И НЕ СтрокаТекущегоУровня.Спецификация.Пустая() Тогда
					
				НеразмещенноеКоличество = РазместитьВСопутствующихИзделиях(СтрокаТекущегоУровня, Параметры, Результат);
				
				ДобавитьВВыходныеИзделия(Результат, СтрокаТекущегоУровня, Параметры);
				
				Если СтрокаТекущегоУровня.СопутствующееИзделие ИЛИ НеразмещенноеКоличество = 0 Тогда
					
					Продолжить;
					
				Иначе
					
					ДобавитьВСопутствующиеИзделия(СтрокаТекущегоУровня, Результат);
					
				КонецЕсли;
				
				КоличествоВыпусков = ПолучитьКоличествоВыпусков(СтрокаТекущегоУровня.Спецификация, СтрокаТекущегоУровня.Номенклатура, СтрокаТекущегоУровня.ХарактеристикаНоменклатуры, СтрокаТекущегоУровня.Коэффициент, НеразмещенноеКоличество);
				ДоляСтоимости = ПолучитьДолюСтоимости(СтрокаТекущегоУровня.Спецификация, СтрокаТекущегоУровня.Номенклатура, СтрокаТекущегоУровня.ХарактеристикаНоменклатуры, НеразмещенноеКоличество);
					
				КоэффициентОсновногоСырья = 0;
				
				ИсходноеКомплектующее = ПолучитьИсходныеКомплектующие(СтрокаТекущегоУровня.Спецификация, Источник);
				
				Пока ИсходноеКомплектующее.Следующий() Цикл
					
					Если Результат.Свойство("СопутствующиеИзделия") Тогда
						
						Результат.ПолноеРазузлование.Колонки.Количество.Имя = "КоличествоОкругленное";
						Результат.ПолноеРазузлование.Колонки.КоличествоТочное.Имя = "Количество";
						
					КонецЕсли;
						
					ДобавитьВПолноеРазулование(ИсходноеКомплектующее, СтрокаТекущегоУровня, КоличествоВыпусков, КоэффициентОсновногоСырья, Параметры, Уровень, Результат, МассивОшибок);
					
					Если Результат.Свойство("СопутствующиеИзделия") Тогда
						
						Результат.ПолноеРазузлование.Колонки.Количество.Имя = "КоличествоТочное";
						Результат.ПолноеРазузлование.Колонки.КоличествоОкругленное.Имя = "Количество";
						
					КонецЕсли;
						
				КонецЦикла;
				
				ВозвратныйОтход = ПолучитьВозвратныеОтходы(СтрокаТекущегоУровня.Спецификация, Источник);
				
				Пока ВозвратныйОтход.Следующий() Цикл
						
					ДобавитьВВозвратныеОтходы(ВозвратныйОтход, СтрокаТекущегоУровня, КоличествоВыпусков, КоэффициентОсновногоСырья, ДоляСтоимости, Параметры, Уровень, Результат, МассивОшибок);
						
				КонецЦикла;
				
			КонецЕсли;
			
		КонецЦикла;
		
		Результат.МаксимальныйУровень = Макс(Результат.МаксимальныйУровень, Уровень);
		
	КонецЦикла;
	
	ВыполнитьОтбор(Результат, Параметры);
	
	Возврат МассивОшибок;
	
КонецФункции // РазузловатьНоменклатуру()
Показать
Прикрепленные файлы:
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Akuji 22 12.02.19 15:19 Сейчас в теме
раз не нужны комплектующие...

мИспользоватьРазузлование = Ложь
по идее должна быть
+
3. Intercititude 12.02.19 15:32 Сейчас в теме +0.86 $m
(2)Уже так пробовал. Это не верно, так как нужны спецификации тоже. Да и не с проста там есть мИспользоватьРазузлование.
Не нужны именно только комплектующие, которые содержатся в спецификации!
+
4. acanta 12.02.19 15:39 Сейчас в теме
Вы пишете о том, что вам не нужно. В общем случае вам в этом документе не нужен весь справочник номенклатура.
Вы можете сформулировать что именно вы хотите видеть и на какой закладке и самое главное - на каком основании?
Т.е. данные именно этой закладки будут использованы в дальнейшем для чего в вашем понимании (напечатано и положено на стол менеджеру для заказа, кладовщику на сборку или для того чтобы в программе прошел расход)?
"Зачем? Чтобы что?"(с)
+
5. Intercititude 12.02.19 16:00 Сейчас в теме
(4)Вся номенклатура и её спецификации из "Внутренних заказов" нужны в итоговой тч "Потребности" и только ( а туда лезет ещё и комплектующие этих самых спецификации,что не надо) !

В свою очередь документ "Внутренние заказы" делает движения по регистру накопления( приход(кол-во) ).
А на основании всего этого документа "Формирование Потребностей" рассчитываются данные в регистре сведений( кол-во), которые потом необходимы для разных нужд.
Прикрепленные файлы:
+
Внимание! Тема сдана в архив

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