Как правильно лучше сделать алгоритм замены материала

1. Raideres 8 15.08.21 20:42 Сейчас в теме
Получаю состав материалов продукции, потом хочу добавить все аналоги в эту табличную часть и только потом получить по каждой строке остатки.
нужно это для того чтобы потом я мог пройти по всем строкам не аналога и посмотреть хватает ли его если нет то взять из аналога

ТаблицаСостава = ПроизводствоСервер.СоставСпецификаций(Продукция.Выгрузить(), Истина, , , Ложь);
	
   
	//добавим колонку аналог и установим признак
	//установим для всех колонок материала признак что это не аналог
	ТаблицаСостава.Колонки.Добавить("Аналог", Новый ОписаниеТипов("Булево"));
    ТаблицаСостава.ЗаполнитьЗначения(Ложь,"Аналог");

	Для Каждого СтрокаМатериалов Из ТаблицаСостава Цикл	
	ТаблицаАналогов = ПолучитьАналогиНоменклатуры(НоваяСтрокаМатериалов);
		
	КонецЦикла;
	
ТаблицаСостава = ПолучитьОстаткиНоменклатуры(ТаблицаСостава);
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. RustamZz 16.08.21 10:21 Сейчас в теме
(1) Аналоги нужны обычно для номенклатуры по которой не хватает остатка для выпуска всей партии. Я бы сначала получил дефицит и только по нему получал аналоги, но если задача другая или спецификации состоят из небольшого количество строк то можно и так оставить.
2. alxarz 31 15.08.21 22:09 Сейчас в теме
(1) ну если работает, то и хорошо
3. Raideres 8 16.08.21 08:28 Сейчас в теме
(2)да вот как раз чтото и смущает что мб нет смысла добавлять аналоги в туже тч.
4. alalsl 11 16.08.21 10:11 Сейчас в теме
(3)Если всё будет программно делаться тогда нет смысла добавлять аналоги в ТЧ. Почему не получать в начале остатки по позициям, а потом фигачить аналоги. Или проверка в одной процедуре происходит?
6. Raideres 8 16.08.21 10:23 Сейчас в теме
(5)
Вот смотрите что я хочу еще раз объясню.
1. Я получил состав по всей продукции по ключу связи. (ТаблицаСостава)
2. Я хочу получить все аналоги номенклатуры по данной (ТаблицаАналоги)
3. Я Хочу получить остатки по номенклатуре и поместить их в отдельную (ТаблицаОстаткиМатериалаИАналогов)
4. Потом уже распределение ..

Просто что то правильно все в кучу собрать не получается

1.
Вот так получил состав материалов
ТаблицаСостава = ПроизводствоСервер.СоставСпецификаций(Продукция.Выгрузить(), Истина, , , Ложь);

2.Вот так получаю аналоги для каждой Строки
Функция ПолучитьАМ_АналогиМатериалов(СтрокаМатериалов)

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

КонецФункции // ПолучитьАМ_АналогиМатериалов(НоваяСтрокаМатериалов) 
Показать



3. вот так получил остатки

Процедура ПолучитьОстаткиНоменклатуры()

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

КонецПроцедуры // ПолучитьОстаткиНоменклатуры(мМассивНоменклатуры)()
Показать
Прикрепленные файлы:
7. Raideres 8 16.08.21 10:40 Сейчас в теме
Смущает даже то что я нашел типовой код поиска остатков и как он вот так выглядет
Функция ТекстЗапросаОстаткиИРезервыРасходнаяНакладная()
	
	ТекстЗапроса = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ТаблицаНоменклатура.Номенклатура КАК НоменклатураЗапасов,
	|	ТаблицаНоменклатура.Характеристика КАК Характеристика,
	|	ТаблицаНоменклатура.Партия КАК Партия,
	|	ТаблицаНоменклатура.Заказ КАК Заказ,
	|	ТаблицаНоменклатура.ЯчейкаДоступна КАК ЯчейкаДоступна,
	|	ТаблицаНоменклатура.Ячейка КАК Ячейка,
	|	ТаблицаНоменклатура.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница
	|ПОМЕСТИТЬ ВтНоменклатура
	|ИЗ
	|	&ТаблицаНоменклатура КАК ТаблицаНоменклатура
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ВтНоменклатура.НоменклатураЗапасов КАК НоменклатураЗапасов,
	|	ВтНоменклатура.Характеристика КАК Характеристика,
	|	ВтНоменклатура.Заказ КАК Заказ,
	|	ВтНоменклатура.Партия КАК Партия
	|ПОМЕСТИТЬ ВтНоменклатураБезСклада
	|ИЗ
	|	ВтНоменклатура КАК ВтНоменклатура
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СУММА(ЗапасыОстаткиРезервы.КоличествоОстаток) КАК РезервНаСкладах,
	|	СУММА(ЗапасыОстаткиОбщие.КоличествоОстаток) КАК ОстатокОбщий,
	|	ВтНоменклатураБезСклада.НоменклатураЗапасов КАК НоменклатураЗапасов,
	|	ВтНоменклатураБезСклада.Характеристика КАК Характеристика,
	|	ВтНоменклатураБезСклада.Партия КАК Партия,
	|	СУММА(ЗапасыОстаткиРезервы.КоличествоОстаток) КАК РезервНаСкладахИтог,
	|	ВтНоменклатураБезСклада.Заказ КАК Заказ,
	|	СУММА(ЗапасыНаСкладахОстатки.КоличествоОстаток) КАК ОстатокОбщийЯчеистоеХранение
	|ПОМЕСТИТЬ Остатки
	|ИЗ
	|	ВтНоменклатураБезСклада КАК ВтНоменклатураБезСклада
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки(
	|				,
	|				ЗаказПокупателя В (&МассивЗаказов)
	|					И Номенклатура В (&Номенклатура)) КАК ЗапасыОстаткиРезервы
	|		ПО ВтНоменклатураБезСклада.НоменклатураЗапасов = ЗапасыОстаткиРезервы.Номенклатура
	|			И ВтНоменклатураБезСклада.Характеристика = ЗапасыОстаткиРезервы.Характеристика
	|			И ВтНоменклатураБезСклада.Партия = ЗапасыОстаткиРезервы.Партия
	|			И ВтНоменклатураБезСклада.Заказ = ЗапасыОстаткиРезервы.ЗаказПокупателя
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки(
	|				,
	|				Организация В (&ОрганизацииПередачи)
	|					И ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
	|					И ТИПЗНАЧЕНИЯ(СтруктурнаяЕдиница) = ТИП(Справочник.СтруктурныеЕдиницы)
	|					И Номенклатура В (&Номенклатура)
	|					И ВЫБОР
	|						КОГДА НЕ ТИПЗНАЧЕНИЯ(&Ссылка) = ТИП(Документ.СборкаЗапасов)
	|								И НЕ ТИПЗНАЧЕНИЯ(&Ссылка) = ТИП(Документ.ЗаказНаПроизводство)
	|							ТОГДА СтруктурнаяЕдиница.ТипСтруктурнойЕдиницы = ЗНАЧЕНИЕ(Перечисление.ТипыСтруктурныхЕдиниц.Склад)
	|						ИНАЧЕ ИСТИНА
	|					КОНЕЦ) КАК ЗапасыОстаткиОбщие
	|		ПО ВтНоменклатураБезСклада.НоменклатураЗапасов = ЗапасыОстаткиОбщие.Номенклатура
	|			И ВтНоменклатураБезСклада.Характеристика = ЗапасыОстаткиОбщие.Характеристика
	|			И ВтНоменклатураБезСклада.Партия = ЗапасыОстаткиОбщие.Партия
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(
	|				,
	|				Организация В (&ОрганизацииПередачи)
	|					И ТИПЗНАЧЕНИЯ(СтруктурнаяЕдиница) = ТИП(Справочник.СтруктурныеЕдиницы)
	|					И Номенклатура В (&Номенклатура)
	|					И СтруктурнаяЕдиница.ОрдерныйСклад = ЛОЖЬ
	|					И ВЫБОР
	|						КОГДА НЕ ТИПЗНАЧЕНИЯ(&Ссылка) = ТИП(Документ.СборкаЗапасов)
	|								И НЕ ТИПЗНАЧЕНИЯ(&Ссылка) = ТИП(Документ.ЗаказНаПроизводство)
	|							ТОГДА СтруктурнаяЕдиница.ТипСтруктурнойЕдиницы = ЗНАЧЕНИЕ(Перечисление.ТипыСтруктурныхЕдиниц.Склад)
	|						ИНАЧЕ ИСТИНА
	|					КОНЕЦ) КАК ЗапасыНаСкладахОстатки
	|		ПО ВтНоменклатураБезСклада.НоменклатураЗапасов = ЗапасыНаСкладахОстатки.Номенклатура
	|			И ВтНоменклатураБезСклада.Характеристика = ЗапасыНаСкладахОстатки.Характеристика
	|			И ВтНоменклатураБезСклада.Партия = ЗапасыНаСкладахОстатки.Партия
	|
	|СГРУППИРОВАТЬ ПО
	|	ВтНоменклатураБезСклада.Партия,
	|	ВтНоменклатураБезСклада.Характеристика,
	|	ВтНоменклатураБезСклада.НоменклатураЗапасов,
	|	ВтНоменклатураБезСклада.Заказ
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВтНоменклатура.НоменклатураЗапасов КАК НоменклатураЗапасов,
	|	ВтНоменклатура.Характеристика КАК Характеристика,
	|	ВтНоменклатура.Партия КАК Партия,
	|	ВтНоменклатура.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
	|	СУММА(ЗапасыОстатки.КоличествоОстаток) КАК ОстатокТекСклад,
	|	СУММА(ЗапасыОстаткиРезервТекСклад.КоличествоОстаток) КАК РезервТекСклад,
	|	ВтНоменклатура.Заказ КАК Заказ,
	|	ЗапасыНаСкладахОстатки.Ячейка КАК Ячейка,
	|	ВЫБОР
	|		КОГДА ВтНоменклатура.ЯчейкаДоступна
	|			ТОГДА ЗапасыНаСкладахОстатки.КоличествоОстаток
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК ОстатокТекЯчейка
	|ПОМЕСТИТЬ ОстаткиВРазрезеСкладов
	|ИЗ
	|	ВтНоменклатура КАК ВтНоменклатура
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки(
	|				,
	|				Организация В (&ОрганизацииПередачи)
	|					И ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
	|					И Номенклатура В (&Номенклатура)) КАК ЗапасыОстатки
	|		ПО ВтНоменклатура.НоменклатураЗапасов = ЗапасыОстатки.Номенклатура
	|			И ВтНоменклатура.Характеристика = ЗапасыОстатки.Характеристика
	|			И ВтНоменклатура.Партия = ЗапасыОстатки.Партия
	|			И ВтНоменклатура.СтруктурнаяЕдиница = ЗапасыОстатки.СтруктурнаяЕдиница
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки(
	|				,
	|				ЗаказПокупателя В (&МассивЗаказов)
	|					И Номенклатура В (&Номенклатура)) КАК ЗапасыОстаткиРезервТекСклад
	|		ПО ВтНоменклатура.НоменклатураЗапасов = ЗапасыОстаткиРезервТекСклад.Номенклатура
	|			И ВтНоменклатура.Характеристика = ЗапасыОстаткиРезервТекСклад.Характеристика
	|			И ВтНоменклатура.Партия = ЗапасыОстаткиРезервТекСклад.Партия
	|			И ВтНоменклатура.СтруктурнаяЕдиница = ЗапасыОстаткиРезервТекСклад.СтруктурнаяЕдиница
	|			И ВтНоменклатура.Заказ = ЗапасыОстаткиРезервТекСклад.ЗаказПокупателя
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(
	|				,
	|				Организация В (&ОрганизацииПередачи)
	|					И Номенклатура В (&Номенклатура)) КАК ЗапасыНаСкладахОстатки
	|		ПО ВтНоменклатура.НоменклатураЗапасов = ЗапасыНаСкладахОстатки.Номенклатура
	|			И ВтНоменклатура.Характеристика = ЗапасыНаСкладахОстатки.Характеристика
	|			И ВтНоменклатура.Партия = ЗапасыНаСкладахОстатки.Партия
	|			И ВтНоменклатура.Ячейка = ЗапасыНаСкладахОстатки.Ячейка
	|			И ВтНоменклатура.СтруктурнаяЕдиница = ЗапасыНаСкладахОстатки.СтруктурнаяЕдиница
	|
	|СГРУППИРОВАТЬ ПО
	|	ВтНоменклатура.НоменклатураЗапасов,
	|	ВтНоменклатура.СтруктурнаяЕдиница,
	|	ВтНоменклатура.Характеристика,
	|	ВтНоменклатура.Партия,
	|	ВтНоменклатура.Заказ,
	|	ЗапасыНаСкладахОстатки.Ячейка,
	|	ВЫБОР
	|		КОГДА ВтНоменклатура.ЯчейкаДоступна
	|			ТОГДА ЗапасыНаСкладахОстатки.КоличествоОстаток
	|		ИНАЧЕ 0
	|	КОНЕЦ
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ВтНоменклатура.НоменклатураЗапасов КАК НоменклатураЗапасов,
	|	СУММА(ВЫБОР
	|			КОГДА Запасы.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	|				ТОГДА Запасы.Количество * -1
	|			ИНАЧЕ Запасы.Количество
	|		КОНЕЦ) КАК ЗарезервированоЗаказом,
	|	ВтНоменклатура.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
	|	ВтНоменклатура.Характеристика КАК Характеристика,
	|	ВтНоменклатура.Партия КАК Партия,
	|	ВтНоменклатура.Заказ КАК Заказ
	|ПОМЕСТИТЬ РезервСделанныйЗаказом
	|ИЗ
	|	ВтНоменклатура КАК ВтНоменклатура
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы КАК Запасы
	|		ПО ВтНоменклатура.НоменклатураЗапасов = Запасы.Номенклатура
	|			И ВтНоменклатура.Характеристика = Запасы.Характеристика
	|			И ВтНоменклатура.Партия = Запасы.Партия
	|			И ВтНоменклатура.СтруктурнаяЕдиница = Запасы.СтруктурнаяЕдиница
	|			И ВтНоменклатура.Заказ = Запасы.ЗаказПокупателя
	|ГДЕ
	|	Запасы.ЗаказПокупателя В(&МассивЗаказов)
	|	И Запасы.Номенклатура В(&Номенклатура)
	|
	|СГРУППИРОВАТЬ ПО
	|	Запасы.СтруктурнаяЕдиница,
	|	ВтНоменклатура.НоменклатураЗапасов,
	|	ВтНоменклатура.СтруктурнаяЕдиница,
	|	ВтНоменклатура.Характеристика,
	|	ВтНоменклатура.Партия,
	|	ВтНоменклатура.Заказ
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	СУММА(ВЫБОР
	|			КОГДА Запасы.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	|				ТОГДА Запасы.Количество * -1
	|			ИНАЧЕ Запасы.Количество
	|		КОНЕЦ) КАК ЗарезервированоЗаказом,
	|	ВтНоменклатураБезСклада.НоменклатураЗапасов КАК НоменклатураЗапасов,
	|	ВтНоменклатураБезСклада.Характеристика КАК Характеристика,
	|	ВтНоменклатураБезСклада.Партия КАК Партия,
	|	ВтНоменклатураБезСклада.Заказ КАК Заказ
	|ПОМЕСТИТЬ РезервСделанныйЗаказомПоВсемСкладам
	|ИЗ
	|	ВтНоменклатураБезСклада КАК ВтНоменклатураБезСклада
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы КАК Запасы
	|		ПО ВтНоменклатураБезСклада.НоменклатураЗапасов = Запасы.Номенклатура
	|			И ВтНоменклатураБезСклада.Характеристика = Запасы.Характеристика
	|			И ВтНоменклатураБезСклада.Партия = Запасы.Партия
	|			И ВтНоменклатураБезСклада.Заказ = Запасы.ЗаказПокупателя
	|ГДЕ
	|	Запасы.ЗаказПокупателя В(&МассивЗаказов)
	|	И Запасы.Номенклатура В(&Номенклатура)
	|
	|СГРУППИРОВАТЬ ПО
	|	ВтНоменклатураБезСклада.НоменклатураЗапасов,
	|	ВтНоменклатураБезСклада.Характеристика,
	|	ВтНоменклатураБезСклада.Партия,
	|	ВтНоменклатураБезСклада.Заказ
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВтНоменклатураБезСклада.НоменклатураЗапасов КАК НоменклатураЗапасов,
	|	ВтНоменклатураБезСклада.Характеристика КАК Характеристика,
	|	ВтНоменклатураБезСклада.Партия КАК Партия,
	|	СУММА(ВЫБОР
	|			КОГДА Запасы.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	|				ТОГДА Запасы.Количество
	|			ИНАЧЕ Запасы.Количество * -1
	|		КОНЕЦ) КАК СписаноРезерваНакладной,
	|	ВтНоменклатураБезСклада.Заказ КАК Заказ
	|ПОМЕСТИТЬ РасходРезерваПоНакладной
	|ИЗ
	|	ВтНоменклатураБезСклада КАК ВтНоменклатураБезСклада
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы КАК Запасы
	|		ПО ВтНоменклатураБезСклада.НоменклатураЗапасов = Запасы.Номенклатура
	|			И ВтНоменклатураБезСклада.Характеристика = Запасы.Характеристика
	|			И ВтНоменклатураБезСклада.Партия = Запасы.Партия
	|			И ВтНоменклатураБезСклада.Заказ = Запасы.ЗаказПокупателя
	|ГДЕ
	|	Запасы.Регистратор = &Ссылка
	|	И Запасы.ЗаказПокупателя В(&МассивЗаказов)
	|	И Запасы.Номенклатура В(&Номенклатура)
	|
	|СГРУППИРОВАТЬ ПО
	|	ВтНоменклатураБезСклада.НоменклатураЗапасов,
	|	ВтНоменклатураБезСклада.Характеристика,
	|	ВтНоменклатураБезСклада.Партия,
	|	ВтНоменклатураБезСклада.Заказ
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СУММА(ВЫБОР
	|			КОГДА Запасы.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	|				ТОГДА Запасы.Количество
	|			ИНАЧЕ Запасы.Количество * -1
	|		КОНЕЦ) КАК СписаноРезерваНакладной,
	|	ВтНоменклатура.НоменклатураЗапасов КАК НоменклатураЗапасов,
	|	ВтНоменклатура.Характеристика КАК Характеристика,
	|	ВтНоменклатура.Партия КАК Партия,
	|	ВтНоменклатура.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
	|	ВтНоменклатура.Заказ КАК Заказ,
	|	ВтНоменклатура.Ячейка КАК Ячейка
	|ПОМЕСТИТЬ РасходРезерваПоНакладнойПоСкладам
	|ИЗ
	|	ВтНоменклатура КАК ВтНоменклатура
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы КАК Запасы
	|		ПО ВтНоменклатура.Характеристика = Запасы.Характеристика
	|			И ВтНоменклатура.Партия = Запасы.Партия
	|			И ВтНоменклатура.СтруктурнаяЕдиница = Запасы.СтруктурнаяЕдиница
	|			И ВтНоменклатура.Заказ = Запасы.ЗаказПокупателя
	|			И ВтНоменклатура.НоменклатураЗапасов = Запасы.Номенклатура
	|ГДЕ
	|	Запасы.Регистратор = &Ссылка
	|	И Запасы.ЗаказПокупателя В(&МассивЗаказов)
	|	И Запасы.Номенклатура В(&Номенклатура)
	|
	|СГРУППИРОВАТЬ ПО
	|	ВтНоменклатура.НоменклатураЗапасов,
	|	ВтНоменклатура.Партия,
	|	ВтНоменклатура.СтруктурнаяЕдиница,
	|	ВтНоменклатура.Характеристика,
	|	ВтНоменклатура.Заказ,
	|	ВтНоменклатура.Ячейка
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СУММА(Запасы.Количество) КАК СписаноНакладной,
	|	Запасы.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
	|	Запасы.Номенклатура КАК Номенклатура,
	|	Запасы.Характеристика КАК Характеристика,
	|	Запасы.Партия КАК Партия
	|ПОМЕСТИТЬ РасходБезРезерваПоНакладнойПоСкладам
	|ИЗ
	|	РегистрНакопления.Запасы КАК Запасы
	|ГДЕ
	|	Запасы.Регистратор = &Ссылка
	|	И Запасы.ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
	|	И Запасы.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	|	И Запасы.Номенклатура В(&Номенклатура)
	|
	|СГРУППИРОВАТЬ ПО
	|	Запасы.Номенклатура,
	|	Запасы.Характеристика,
	|	Запасы.СтруктурнаяЕдиница,
	|	Запасы.Партия
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СУММА(Запасы.Количество) КАК СписаноНакладной,
	|	Запасы.Номенклатура КАК Номенклатура,
	|	Запасы.Характеристика КАК Характеристика,
	|	Запасы.Партия КАК Партия
	|ПОМЕСТИТЬ РасходБезРезерваПоНакладнойВсего
	|ИЗ
	|	РегистрНакопления.Запасы КАК Запасы
	|ГДЕ
	|	Запасы.Регистратор = &Ссылка
	|	И Запасы.ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
	|	И Запасы.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	|	И Запасы.Номенклатура В(&Номенклатура)
	|
	|СГРУППИРОВАТЬ ПО
	|	Запасы.Номенклатура,
	|	Запасы.Характеристика,
	|	Запасы.Партия
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СУММА(ЗапасыНаСкладах.Количество) КАК СписаноНакладной,
	|	ЗапасыНаСкладах.Номенклатура КАК Номенклатура,
	|	ЗапасыНаСкладах.Характеристика КАК Характеристика,
	|	ЗапасыНаСкладах.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
	|	ЗапасыНаСкладах.Ячейка КАК Ячейка,
	|	ЗапасыНаСкладах.Партия КАК Партия
	|ПОМЕСТИТЬ РасходБезРезерваПоЯчейкам
	|ИЗ
	|	РегистрНакопления.ЗапасыНаСкладах КАК ЗапасыНаСкладах
	|ГДЕ
	|	ЗапасыНаСкладах.Регистратор = &Ссылка
	|	И ЗапасыНаСкладах.Номенклатура В(&Номенклатура)
	|	И ЗапасыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	|
	|СГРУППИРОВАТЬ ПО
	|	ЗапасыНаСкладах.Номенклатура,
	|	ЗапасыНаСкладах.Характеристика,
	|	ЗапасыНаСкладах.СтруктурнаяЕдиница,
	|	ЗапасыНаСкладах.Ячейка,
	|	ЗапасыНаСкладах.Партия
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СУММА(ЗапасыНаСкладах.Количество) КАК СписаноНакладной,
	|	ЗапасыНаСкладах.Номенклатура КАК Номенклатура,
	|	ЗапасыНаСкладах.Характеристика КАК Характеристика,
	|	ЗапасыНаСкладах.Партия КАК Партия
	|ПОМЕСТИТЬ РасходБезРезерваПоЯчейкамВсего
	|ИЗ
	|	РегистрНакопления.ЗапасыНаСкладах КАК ЗапасыНаСкладах
	|ГДЕ
	|	ЗапасыНаСкладах.Регистратор = &Ссылка
	|	И ЗапасыНаСкладах.Номенклатура В(&Номенклатура)
	|	И ЗапасыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	|
	|СГРУППИРОВАТЬ ПО
	|	ЗапасыНаСкладах.Номенклатура,
	|	ЗапасыНаСкладах.Характеристика,
	|	ЗапасыНаСкладах.Партия
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ЗапасыОстатки.Номенклатура КАК Номенклатура,
	|	ЗапасыОстатки.Характеристика КАК Характеристика,
	|	ЗапасыОстатки.Партия КАК Партия,
	|	СУММА(ЗапасыОстатки.КоличествоОстаток) КАК ОбщийРезерв
	|ПОМЕСТИТЬ ОбщийРезервПоНоменклатуре
	|ИЗ
	|	РегистрНакопления.Запасы.Остатки(
	|			,
	|			Организация В (&ОрганизацииПередачи)
	|				И НЕ ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
	|				И ТИПЗНАЧЕНИЯ(СтруктурнаяЕдиница) = ТИП(Справочник.СтруктурныеЕдиницы)
	|				И Номенклатура В (&Номенклатура)
	|				И ВЫБОР
	|					КОГДА НЕ ТИПЗНАЧЕНИЯ(&Ссылка) = ТИП(Документ.СборкаЗапасов)
	|							И НЕ ТИПЗНАЧЕНИЯ(&Ссылка) = ТИП(Документ.ЗаказНаПроизводство)
	|						ТОГДА СтруктурнаяЕдиница.ТипСтруктурнойЕдиницы = ЗНАЧЕНИЕ(Перечисление.ТипыСтруктурныхЕдиниц.Склад)
	|					ИНАЧЕ ИСТИНА
	|				КОНЕЦ) КАК ЗапасыОстатки
	|
	|СГРУППИРОВАТЬ ПО
	|	ЗапасыОстатки.Номенклатура,
	|	ЗапасыОстатки.Характеристика,
	|	ЗапасыОстатки.Партия
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ВтНоменклатура.Характеристика КАК Характеристика,
	|	ВтНоменклатура.НоменклатураЗапасов КАК Номенклатура,
	|	ВтНоменклатура.Партия КАК Партия,
	|	ВтНоменклатура.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
	|	ЕСТЬNULL(Остатки.ОстатокОбщий, 0) + ЕСТЬNULL(РасходБезРезерваПоНакладнойВсего.СписаноНакладной, 0) КАК ОстатокОбщий,
	|	ЕСТЬNULL(Остатки.РезервНаСкладахИтог, 0) КАК РезервНаСкладахИтог,
	|	ЕСТЬNULL(ОстаткиВРазрезеСкладов.РезервТекСклад, 0) КАК РезервТекСкладИтог,
	|	ЕСТЬNULL(ОстаткиВРазрезеСкладов.РезервТекСклад, 0) - ЕСТЬNULL(РезервСделанныйЗаказом.ЗарезервированоЗаказом, 0) КАК РезервТекСклад,
	|	ЕСТЬNULL(Остатки.РезервНаСкладах, 0) - ЕСТЬNULL(РезервСделанныйЗаказомПоВсемСкладам.ЗарезервированоЗаказом, 0) КАК РезервНаСкладах,
	|	ЕСТЬNULL(ОстаткиВРазрезеСкладов.РезервТекСклад, 0) КАК РезервТекСкладОбщий,
	|	ЕСТЬNULL(РезервСделанныйЗаказомПоВсемСкладам.ЗарезервированоЗаказом, 0) КАК ЗарезервированоЗаказомВсеСклады,
	|	ЕСТЬNULL(РасходРезерваПоНакладной.СписаноРезерваНакладной, 0) КАК СписаноРезерваНакладной,
	|	ЕСТЬNULL(РасходРезерваПоНакладнойПоСкладам.СписаноРезерваНакладной, 0) КАК СписаноРезерваНакладнойТекСклад,
	|	ВтНоменклатура.Заказ КАК Заказ,
	|	ЕСТЬNULL(ОстаткиВРазрезеСкладов.ОстатокТекСклад, 0) + ЕСТЬNULL(РасходБезРезерваПоНакладнойПоСкладам.СписаноНакладной, 0) КАК ОстатокТекСклад,
	|	ВтНоменклатура.Ячейка КАК Ячейка,
	|	ЕСТЬNULL(Остатки.ОстатокОбщий, 0) КАК ОстатокОбщийОрдерныеСклады,
	|	ЕСТЬNULL(Остатки.ОстатокОбщийЯчеистоеХранение, 0) КАК ОстатокОбщийЯчеистыеСклады,
	|	ЕСТЬNULL(ОстаткиВРазрезеСкладов.ОстатокТекСклад, 0) КАК ТекущийОстатокПоСкладу,
	|	0 КАК КоличествоСтрок,
	|	0 КАК КоличествоПроходов,
	|	РасходБезРезерваПоНакладнойПоСкладам.СписаноНакладной КАК РасходОрдерныеСклады,
	|	РасходБезРезерваПоЯчейкам.СписаноНакладной КАК РасходЯчеистыеСклады,
	|	ВЫБОР
	|		КОГДА ВтНоменклатура.ЯчейкаДоступна
	|			ТОГДА ЕСТЬNULL(ОстаткиВРазрезеСкладов.ОстатокТекЯчейка, 0) + ЕСТЬNULL(РасходБезРезерваПоЯчейкам.СписаноНакладной, 0)
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК ОстатокВЯчейке
	|ИЗ
	|	ВтНоменклатура КАК ВтНоменклатура
	|		ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиВРазрезеСкладов КАК ОстаткиВРазрезеСкладов
	|		ПО ВтНоменклатура.НоменклатураЗапасов = ОстаткиВРазрезеСкладов.НоменклатураЗапасов
	|			И ВтНоменклатура.Характеристика = ОстаткиВРазрезеСкладов.Характеристика
	|			И ВтНоменклатура.Партия = ОстаткиВРазрезеСкладов.Партия
	|			И ВтНоменклатура.СтруктурнаяЕдиница = ОстаткиВРазрезеСкладов.СтруктурнаяЕдиница
	|			И ВтНоменклатура.Заказ = ОстаткиВРазрезеСкладов.Заказ
	|			И ВтНоменклатура.Ячейка = ОстаткиВРазрезеСкладов.Ячейка
	|		ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
	|		ПО ВтНоменклатура.НоменклатураЗапасов = Остатки.НоменклатураЗапасов
	|			И ВтНоменклатура.Характеристика = Остатки.Характеристика
	|			И ВтНоменклатура.Партия = Остатки.Партия
	|			И ВтНоменклатура.Заказ = Остатки.Заказ
	|		ЛЕВОЕ СОЕДИНЕНИЕ РезервСделанныйЗаказом КАК РезервСделанныйЗаказом
	|		ПО ВтНоменклатура.НоменклатураЗапасов = РезервСделанныйЗаказом.НоменклатураЗапасов
	|			И ВтНоменклатура.Характеристика = РезервСделанныйЗаказом.Характеристика
	|			И ВтНоменклатура.Партия = РезервСделанныйЗаказом.Партия
	|			И ВтНоменклатура.СтруктурнаяЕдиница = РезервСделанныйЗаказом.СтруктурнаяЕдиница
	|			И ВтНоменклатура.Заказ = РезервСделанныйЗаказом.Заказ
	|		ЛЕВОЕ СОЕДИНЕНИЕ РезервСделанныйЗаказомПоВсемСкладам КАК РезервСделанныйЗаказомПоВсемСкладам
	|		ПО ВтНоменклатура.НоменклатураЗапасов = РезервСделанныйЗаказомПоВсемСкладам.НоменклатураЗапасов
	|			И ВтНоменклатура.Характеристика = РезервСделанныйЗаказомПоВсемСкладам.Характеристика
	|			И ВтНоменклатура.Партия = РезервСделанныйЗаказомПоВсемСкладам.Партия
	|			И ВтНоменклатура.Заказ = РезервСделанныйЗаказомПоВсемСкладам.Заказ
	|		ЛЕВОЕ СОЕДИНЕНИЕ РасходРезерваПоНакладной КАК РасходРезерваПоНакладной
	|		ПО ВтНоменклатура.НоменклатураЗапасов = РасходРезерваПоНакладной.НоменклатураЗапасов
	|			И ВтНоменклатура.Характеристика = РасходРезерваПоНакладной.Характеристика
	|			И ВтНоменклатура.Партия = РасходРезерваПоНакладной.Партия
	|			И ВтНоменклатура.Заказ = РасходРезерваПоНакладной.Заказ
	|		ЛЕВОЕ СОЕДИНЕНИЕ РасходРезерваПоНакладнойПоСкладам КАК РасходРезерваПоНакладнойПоСкладам
	|		ПО ВтНоменклатура.НоменклатураЗапасов = РасходРезерваПоНакладнойПоСкладам.НоменклатураЗапасов
	|			И ВтНоменклатура.Характеристика = РасходРезерваПоНакладнойПоСкладам.Характеристика
	|			И ВтНоменклатура.Партия = РасходРезерваПоНакладнойПоСкладам.Партия
	|			И ВтНоменклатура.СтруктурнаяЕдиница = РасходРезерваПоНакладнойПоСкладам.СтруктурнаяЕдиница
	|			И ВтНоменклатура.Заказ = РасходРезерваПоНакладнойПоСкладам.Заказ
	|			И ВтНоменклатура.Ячейка = РасходРезерваПоНакладнойПоСкладам.Ячейка
	|		ЛЕВОЕ СОЕДИНЕНИЕ РасходБезРезерваПоНакладнойПоСкладам КАК РасходБезРезерваПоНакладнойПоСкладам
	|		ПО ВтНоменклатура.НоменклатураЗапасов = РасходБезРезерваПоНакладнойПоСкладам.Номенклатура
	|			И ВтНоменклатура.Характеристика = РасходБезРезерваПоНакладнойПоСкладам.Характеристика
	|			И ВтНоменклатура.Партия = РасходБезРезерваПоНакладнойПоСкладам.Партия
	|			И ВтНоменклатура.СтруктурнаяЕдиница = РасходБезРезерваПоНакладнойПоСкладам.СтруктурнаяЕдиница
	|		ЛЕВОЕ СОЕДИНЕНИЕ ОбщийРезервПоНоменклатуре КАК ОбщийРезервПоНоменклатуре
	|		ПО ВтНоменклатура.НоменклатураЗапасов = ОбщийРезервПоНоменклатуре.Номенклатура
	|			И ВтНоменклатура.Характеристика = ОбщийРезервПоНоменклатуре.Характеристика
	|			И ВтНоменклатура.Партия = ОбщийРезервПоНоменклатуре.Партия
	|		ЛЕВОЕ СОЕДИНЕНИЕ РасходБезРезерваПоЯчейкам КАК РасходБезРезерваПоЯчейкам
	|		ПО ВтНоменклатура.НоменклатураЗапасов = РасходБезРезерваПоЯчейкам.Номенклатура
	|			И ВтНоменклатура.Характеристика = РасходБезРезерваПоЯчейкам.Характеристика
	|			И ВтНоменклатура.Партия = РасходБезРезерваПоЯчейкам.Партия
	|			И ВтНоменклатура.Ячейка = РасходБезРезерваПоЯчейкам.Ячейка
	|			И ВтНоменклатура.СтруктурнаяЕдиница = РасходБезРезерваПоЯчейкам.СтруктурнаяЕдиница
	|		ЛЕВОЕ СОЕДИНЕНИЕ РасходБезРезерваПоЯчейкамВсего КАК РасходБезРезерваПоЯчейкамВсего
	|		ПО ВтНоменклатура.НоменклатураЗапасов = РасходБезРезерваПоЯчейкамВсего.Номенклатура
	|			И ВтНоменклатура.Характеристика = РасходБезРезерваПоЯчейкамВсего.Характеристика
	|			И ВтНоменклатура.Партия = РасходБезРезерваПоЯчейкамВсего.Партия
	|		ЛЕВОЕ СОЕДИНЕНИЕ РасходБезРезерваПоНакладнойВсего КАК РасходБезРезерваПоНакладнойВсего
	|		ПО ВтНоменклатура.НоменклатураЗапасов = РасходБезРезерваПоНакладнойВсего.Номенклатура
	|			И ВтНоменклатура.Партия = РасходБезРезерваПоНакладнойВсего.Партия
	|			И ВтНоменклатура.Характеристика = РасходБезРезерваПоНакладнойВсего.Характеристика";
	
	Возврат ТекстЗапроса;
	
КонецФункции
Показать




// Заполняет колонки табличной части документа Расходная накладная, Производство, Заказ-Наряд (в стадии выполнения)
// значениями по остаткам
//
Процедура ЗаполнитьЗначенияОстатковНоменклатурыВТабличнойЧасти(Объект, СтруктураДанные = Неопределено,  НоменклатураОтбора = Неопределено, ИмяТЧ = "Запасы", ТипДокумента = Неопределено) Экспорт
	
	ИмяКолонкиЗаказ = ?(ТипДокумента = "Производство", "ЗаказПокупателя", "Заказ");
	
	Если ТипДокумента = "ЗаказНаряд" Тогда
		ИмяСклада = "СтруктурнаяЕдиницаРезерв";
		КолонкиДляВыгрузки = "Номенклатура, Характеристика, Партия, ЕдиницаИзмерения, Ячейка, ЯчейкаДоступна,"+ИмяСклада;
	Иначе
		ИмяСклада = "СтруктурнаяЕдиница";
		КолонкиДляВыгрузки = "Номенклатура, Характеристика, Партия, ЕдиницаИзмерения, Ячейка, ЯчейкаДоступна,"+ИмяСклада+", "+ ИмяКолонкиЗаказ;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	
	Если СтруктураДанные = Неопределено Тогда
		
		ТаблицаНоменклатуры = Объект[ИмяТЧ].Выгрузить(,КолонкиДляВыгрузки);
		
		МассивНоменклатуры = Объект[ИмяТЧ].Выгрузить(,"Номенклатура");
		МассивХарактеристик = Объект[ИмяТЧ].Выгрузить(,"Характеристика");
		
		СтрокиДляВыгрузки = Объект[ИмяТЧ];
	Иначе
		Номенклатура = СтруктураДанные.Номенклатура;
		Характеристика = ?(СтруктураДанные.ИспользоватьХарактеристики И ЗначениеЗаполнено(СтруктураДанные.Характеристика)
		, СтруктураДанные.Характеристика, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
		Партия = ?(СтруктураДанные.ИспользоватьПартии, СтруктураДанные.Партия, Справочники.ПартииНоменклатуры.ПустаяСсылка());
		
		Если ЗначениеЗаполнено(НоменклатураОтбора) Тогда
			ПараметрыОтбора = Новый Структура(" Номенклатура", НоменклатураОтбора);
		Иначе
			ПараметрыОтбора = Новый Структура("Номенклатура, Характеристика, Партия", Номенклатура, Характеристика, Партия);
		КонецЕсли;
		
		СтрокиДляВыгрузки = Объект[ИмяТЧ].НайтиСтроки(ПараметрыОтбора);
		ТаблицаНоменклатуры = Объект[ИмяТЧ].Выгрузить(СтрокиДляВыгрузки, КолонкиДляВыгрузки);
		
		МассивНоменклатуры = Новый Массив;
		МассивНоменклатуры.Добавить(Номенклатура);
		МассивХарактеристик = Новый Массив;
		МассивХарактеристик.Добавить(Характеристика);
	КонецЕсли;
	
	Организация = Константы.УчетПоКомпании.Компания(Объект.Организация);
	
	СтрокиОбходаЗапасов = СтрокиДляВыгрузки;
	
	МассивЗаказов = Новый Массив;
	
	Если ТипДокумента = "ЗаказНаряд" Тогда
		
		МассивЗаказов.Добавить(Объект.Ссылка);
		
		КолонкаСклад = ТаблицаНоменклатуры.Колонки.Найти("СтруктурнаяЕдиницаРезерв");
		КолонкаСклад.Имя = "СтруктурнаяЕдиница";
		
		МассивТипов = Новый Массив;
		МассивТипов.Добавить(Тип("ДокументСсылка.ЗаказПокупателя"));
		ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
		
		ТаблицаНоменклатуры.Колонки.Добавить("Заказ",ОписаниеТипов);
		
		Для Каждого СтрокаТаблицы Из ТаблицаНоменклатуры Цикл
			СтрокаТаблицы.Заказ = Объект.Ссылка;
			Если Не ЗначениеЗаполнено(СтрокаТаблицы.СтруктурнаяЕдиница) Тогда
				СтрокаТаблицы.СтруктурнаяЕдиница = Объект.СтруктурнаяЕдиницаПродажи;
			КонецЕсли;
		КонецЦикла;
	Иначе
		
		Если ТипДокумента = "Производство" Тогда
			КолонкаЗаказ = ТаблицаНоменклатуры.Колонки.Найти("ЗаказПокупателя");
			КолонкаЗаказ.Имя = "Заказ";
		КонецЕсли;
		
		Для Каждого СтрокаТабличнойЧасти Из Объект[ИмяТЧ] Цикл
			Если ЗначениеЗаполнено(СтрокаТабличнойЧасти[ИмяКолонкиЗаказ]) Тогда
				МассивЗаказов.Добавить(СтрокаТабличнойЧасти[ИмяКолонкиЗаказ]);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Запрос.УстановитьПараметр("ТаблицаНоменклатура", ТаблицаНоменклатуры);
	Запрос.УстановитьПараметр("Номенклатура", МассивНоменклатуры);
	Запрос.УстановитьПараметр("Характеристика", МассивХарактеристик);
	Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
	Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
	Если ПолучитьФункциональнуюОпцию("ПередачаТоваровМеждуОрганизациями") Тогда
		Запрос.УстановитьПараметр("ОрганизацииПередачи",
			РегистрыСведений.НастройкаПередачиТоваровМеждуОрганизациями.ПолучитьСписокОрганизацийДляОстатков(Организация));	
	Иначе
		Запрос.УстановитьПараметр("ОрганизацииПередачи", ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Организация));
	КонецЕсли;
	
	Запрос.Текст = ?(ТипДокумента = "ЗаказНаряд", ТекстЗапросаОстаткиИРезервыЗаказНаряд(), ТекстЗапросаОстаткиИРезервыРасходнаяНакладная());
		
	ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
	
	ПараметрыОтбора = Новый Структура("Номенклатура, Характеристика, Партия, СтруктурнаяЕдиница, Заказ, Ячейка");
	ПараметрыОтбораБезСкладаБезЗаказа = Новый Структура("Номенклатура, Характеристика, Партия");
	ПараметрыОтбораСкладИЯчейка = Новый Структура("Номенклатура, Характеристика, Партия, Ячейка, " + ИмяСклада);
	ПараметрыОтбораСклад = Новый Структура("Номенклатура, Характеристика, Партия, СтруктурнаяЕдиница");
	ПараметрыОтбораСкладПоТЧДокумента = Новый Структура("Номенклатура, Характеристика, Партия, " + ИмяСклада);
	
	Если ТипДокумента = "ЗаказНаряд" Тогда
		ПараметрыОтбораСкладЗаказБезЯчейки = Новый Структура("Номенклатура, Характеристика, Партия, " + ИмяСклада);
		ПараметрыОтбораБезСклада = Новый Структура("Номенклатура, Характеристика, Партия");
	Иначе
		ПараметрыОтбораСкладЗаказБезЯчейки = Новый Структура("Номенклатура, Характеристика, Партия," + ИмяКолонкиЗаказ+" ," + ИмяСклада);
		ПараметрыОтбораБезСклада = Новый Структура("Номенклатура, Характеристика, Партия," + ИмяКолонкиЗаказ);
	КонецЕсли;
	
	ОбщиеОстаткиПоНоменклатуреПоСкладам = ТаблицаОстатков.Скопировать(,"Номенклатура, Характеристика, Партия, СтруктурнаяЕдиница, ОстатокТекСклад, КоличествоПроходов, КоличествоСтрок");
	ОбщиеОстаткиПоНоменклатуреПоСкладам.Свернуть("Номенклатура, Характеристика, Партия, СтруктурнаяЕдиница, ОстатокТекСклад, КоличествоПроходов, КоличествоСтрок");
	
	НомерСтроки = 0;
	
	Для Каждого СтрокаТабличнойЧасти Из СтрокиОбходаЗапасов Цикл
		НомерСтроки = НомерСтроки + 1;
		
		Если Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.ЕдиницаИзмерения) 
			Или ТипЗнч(СтрокаТабличнойЧасти.ЕдиницаИзмерения) = Тип("СправочникСсылка.КлассификаторЕдиницИзмерения") Тогда
			КоэффициентЕдиницыИзмерения = 1;
		Иначе
			КоэффициентЕдиницыИзмерения = СтрокаТабличнойЧасти.ЕдиницаИзмерения.Коэффициент;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) 
			Или ТипЗнч(СтрокаТабличнойЧасти.Номенклатура) = Тип("Строка") Тогда Продолжить КонецЕсли;
			
		Заказ = ?(ТипДокумента = "ЗаказНаряд", Объект.Ссылка, СтрокаТабличнойЧасти[ИмяКолонкиЗаказ]);
			
		ПараметрыОтбораСклад.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
		ПараметрыОтбораСклад.Характеристика = СтрокаТабличнойЧасти.Характеристика;
		ПараметрыОтбораСклад.Партия = СтрокаТабличнойЧасти.Партия;
		ПараметрыОтбораСклад.СтруктурнаяЕдиница = СтрокаТабличнойЧасти[ИмяСклада];
		
		ПараметрыОтбораСкладПоТЧДокумента.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
		ПараметрыОтбораСкладПоТЧДокумента.Характеристика = СтрокаТабличнойЧасти.Характеристика;
		ПараметрыОтбораСкладПоТЧДокумента.Партия = СтрокаТабличнойЧасти.Партия;
		ПараметрыОтбораСкладПоТЧДокумента[ИмяСклада] = СтрокаТабличнойЧасти[ИмяСклада];
		
		ПараметрыОтбораБезСкладаБезЗаказа.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
		ПараметрыОтбораБезСкладаБезЗаказа.Характеристика = СтрокаТабличнойЧасти.Характеристика;
		ПараметрыОтбораБезСкладаБезЗаказа.Партия = СтрокаТабличнойЧасти.Партия;
		
		КоличествоСКоэффициентом = СтрокаТабличнойЧасти.Количество*КоэффициентЕдиницыИзмерения;
		
		ПараметрыОтбора.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
		ПараметрыОтбора.Характеристика = СтрокаТабличнойЧасти.Характеристика;
		ПараметрыОтбора.Партия = СтрокаТабличнойЧасти.Партия;
		ПараметрыОтбора.СтруктурнаяЕдиница = СтрокаТабличнойЧасти[ИмяСклада];
		ПараметрыОтбора.Заказ = Заказ;
		ПараметрыОтбора.Ячейка = СтрокаТабличнойЧасти.Ячейка;
		
		ПараметрыОтбораСкладИЯчейка.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
		ПараметрыОтбораСкладИЯчейка.Характеристика = СтрокаТабличнойЧасти.Характеристика;
		ПараметрыОтбораСкладИЯчейка.Партия = СтрокаТабличнойЧасти.Партия;
		ПараметрыОтбораСкладИЯчейка[ИмяСклада] = СтрокаТабличнойЧасти[ИмяСклада];
		ПараметрыОтбораСкладИЯчейка.Ячейка = СтрокаТабличнойЧасти.Ячейка;
		
		ПараметрыОтбораБезСклада.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
		ПараметрыОтбораБезСклада.Характеристика = СтрокаТабличнойЧасти.Характеристика;
		ПараметрыОтбораБезСклада.Партия = СтрокаТабличнойЧасти.Партия;
		
		ПараметрыОтбораСкладЗаказБезЯчейки.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
		ПараметрыОтбораСкладЗаказБезЯчейки.Характеристика = СтрокаТабличнойЧасти.Характеристика;
		ПараметрыОтбораСкладЗаказБезЯчейки.Партия = СтрокаТабличнойЧасти.Партия;
		ПараметрыОтбораСкладЗаказБезЯчейки[ИмяСклада] = СтрокаТабличнойЧасти[ИмяСклада];
		
		Если Не ТипДокумента = "ЗаказНаряд" Тогда
			ПараметрыОтбораБезСклада[ИмяКолонкиЗаказ] = Заказ;
			ПараметрыОтбораСкладЗаказБезЯчейки[ИмяКолонкиЗаказ] = Заказ;
		КонецЕсли;
		
		НайденныеСтрокиОстатки = ТаблицаОстатков.НайтиСтроки(ПараметрыОтбора);
	
		ЭтоПоследняяСтрокаПоНоменклатуреПоЯчейке = Ложь;
		
		Если НайденныеСтрокиОстатки.Количество() Тогда
			СтрокаОстатка = НайденныеСтрокиОстатки[0];
			Если СтрокаОстатка.КоличествоПроходов = 0 Тогда
				СтрокиПоНоменклатуре = Объект[ИмяТЧ].НайтиСтроки(ПараметрыОтбораСкладИЯчейка);
				СтрокаОстатка.КоличествоСтрок = СтрокиПоНоменклатуре.Количество();
			КонецЕсли;
			СтрокаОстатка.КоличествоПроходов = СтрокаОстатка.КоличествоПроходов+1;
			ЭтоПоследняяСтрокаПоНоменклатуреПоЯчейке = ?(СтрокаОстатка.КоличествоПроходов = СтрокаОстатка.КоличествоСтрок, Истина, Ложь);
		Иначе
			СтрокаОстатка = Неопределено
		КонецЕсли;
		
		СтрокаТабличнойЧасти.ПредставлениеДублей = "";
		
		СуммаПоСтрокам = ПолучитьСуммуПоТабличнойЧасти(Объект, ПараметрыОтбораБезСкладаБезЗаказа, "Количество",,,ИмяТЧ);
		СуммаПоСтрокамСТекКоэффициентом = СуммаПоСтрокам / КоэффициентЕдиницыИзмерения;
		
		Если КоэффициентЕдиницыИзмерения = 1 И СуммаПоСтрокам = СтрокаТабличнойЧасти.Количество Тогда
			СтрокаТабличнойЧасти.ПредставлениеДублей = Формат(СтрокаТабличнойЧасти.Количество, "ЧДЦ=3")
		ИначеЕсли КоэффициентЕдиницыИзмерения = 1 И Не СуммаПоСтрокам = СтрокаТабличнойЧасти.Количество Тогда
			СтрокаТабличнойЧасти.ПредставлениеДублей = Формат(СтрокаТабличнойЧасти.Количество, "ЧДЦ=3")+ " / " + Формат(СуммаПоСтрокам, "ЧДЦ=3");
		ИначеЕсли Не КоэффициентЕдиницыИзмерения = 1 И СуммаПоСтрокам = КоличествоСКоэффициентом Тогда
			СтрокаТабличнойЧасти.ПредставлениеДублей = Формат(СтрокаТабличнойЧасти.Количество, "ЧДЦ=3")
		ИначеЕсли Не КоэффициентЕдиницыИзмерения = 1 И Не СуммаПоСтрокам = КоличествоСКоэффициентом Тогда
			СтрокаТабличнойЧасти.ПредставлениеДублей = Формат(СтрокаТабличнойЧасти.Количество, "ЧДЦ=3")+ " / " + Формат(СуммаПоСтрокамСТекКоэффициентом, "ЧДЦ=3");
		КонецЕсли;
		
		СтрокаТабличнойЧасти.МожноОтгрузить = 0;
		СтрокаТабличнойЧасти.ВРезерве = 0;
		СтрокаТабличнойЧасти.НеХватает = 0;
		СтрокаТабличнойЧасти.ОстатокВЯчейке = 0;
		СтрокаТабличнойЧасти.ОстатокСвободно = 0;
		СтрокаТабличнойЧасти.ОстатокОбщий = 0;
		
		Если СтрокаОстатка = Неопределено Тогда Продолжить КонецЕсли;
		
		СтрокиОстаткиНоменклатураСкладБезЯчейки = ОбщиеОстаткиПоНоменклатуреПоСкладам.НайтиСтроки(ПараметрыОтбораСклад);
		
		ЭтоПоследняяСтрокаПоНоменклатуре = Ложь;
		
		Если СтрокиОстаткиНоменклатураСкладБезЯчейки.Количество() Тогда
			СтрокаОстаткаВЦелом = СтрокиОстаткиНоменклатураСкладБезЯчейки[0];
			
			Если СтрокаОстаткаВЦелом.КоличествоПроходов = 0 Тогда
				СтрокиПоНоменклатуре = Объект[ИмяТЧ].НайтиСтроки(ПараметрыОтбораСкладПоТЧДокумента);
				СтрокаОстаткаВЦелом.КоличествоСтрок = СтрокиПоНоменклатуре.Количество();
			КонецЕсли;
			
			СтрокаОстаткаВЦелом.КоличествоПроходов = СтрокаОстаткаВЦелом.КоличествоПроходов+1;
			ЭтоПоследняяСтрокаПоНоменклатуре = ?(СтрокаОстаткаВЦелом.КоличествоПроходов = СтрокаОстаткаВЦелом.КоличествоСтрок, Истина, Ложь);
			
		Иначе
			СтрокаОстаткаВЦелом = Неопределено
		КонецЕсли;

		Если СтрокаОстаткаВЦелом = Неопределено Тогда Продолжить КонецЕсли;
		
		ОстатокСвободно = Окр(СтрокаОстаткаВЦелом.ОстатокТекСклад/КоэффициентЕдиницыИзмерения,3);
		ОстатокВЯчейке = Окр(СтрокаОстатка.ОстатокВЯчейке/КоэффициентЕдиницыИзмерения,3);
		
		Если Не ЭтоПоследняяСтрокаПоНоменклатуреПоЯчейке Тогда
			Если СтрокаТабличнойЧасти.ЯчейкаДоступна Тогда
				ОстатокВЯчейке = ?(СтрокаТабличнойЧасти.Количество < ОстатокВЯчейке, СтрокаТабличнойЧасти.Количество, ОстатокВЯчейке);
				СтрокаТабличнойЧасти.ОстатокВЯчейке = ?(СтрокаТабличнойЧасти.ЯчейкаДоступна, ОстатокВЯчейке, 0);
				СтрокаОстатка.ОстатокВЯчейке = СтрокаОстатка.ОстатокВЯчейке - (СтрокаТабличнойЧасти.ОстатокВЯчейке*КоэффициентЕдиницыИзмерения);
			Иначе
				СтрокаОстатка.ОстатокВЯчейке = 0;
				СтрокаТабличнойЧасти.ОстатокВЯчейке = 0;
			КонецЕсли;
		Иначе
			СтрокаТабличнойЧасти.ОстатокВЯчейке = ?(СтрокаТабличнойЧасти.ЯчейкаДоступна, ОстатокВЯчейке, 0);
		КонецЕсли;
		
		Резерв = ?(ТипДокумента = "ЗаказНаряд", СтрокаТабличнойЧасти.РезервОтгрузка, СтрокаТабличнойЧасти.Резерв);
		
		Если Не ЭтоПоследняяСтрокаПоНоменклатуре Тогда
			
			Если СтрокаТабличнойЧасти.ЯчейкаДоступна Тогда
				ОстатокСвободно = ?(СтрокаТабличнойЧасти.ОстатокВЯчейке < ОстатокСвободно, СтрокаТабличнойЧасти.ОстатокВЯчейке - Резерв, ОстатокСвободно);
				СтрокаТабличнойЧасти.ОстатокСвободно = ?(СтрокаТабличнойЧасти.Количество < ОстатокСвободно, СтрокаТабличнойЧасти.Количество, ОстатокСвободно);
			Иначе
				ОстатокСвободно = ?(СтрокаТабличнойЧасти.Количество < ОстатокСвободно, СтрокаТабличнойЧасти.Количество - Резерв, ОстатокСвободно);
				СтрокаТабличнойЧасти.ОстатокСвободно = ОстатокСвободно;
			КонецЕсли;
			
			СтрокаОстаткаВЦелом.ОстатокТекСклад = СтрокаОстаткаВЦелом.ОстатокТекСклад - ((СтрокаТабличнойЧасти.ОстатокСвободно*КоэффициентЕдиницыИзмерения)-(Резерв*КоэффициентЕдиницыИзмерения));
			
		Иначе
			СтрокаТабличнойЧасти.ОстатокСвободно = ОстатокСвободно;
		КонецЕсли;
		
		ИтогПоЗначениюВРезервВБазовыхЕдиницахПоВсемСкладам = ПолучитьСуммуПоТабличнойЧасти(Объект, ПараметрыОтбораБезСклада, "Резервировать",,,ИмяТЧ, ТипДокумента, "Отгрузка");
		ИтогПоЗначениюВРезервПоВсемСкладам = Окр(ИтогПоЗначениюВРезервВБазовыхЕдиницахПоВсемСкладам/Коэффицие­нтЕдиницыИзмерения,3);
		
		ИтогПоЗначениюВРезервВБазовыхЕдиницахТекСклад= ПолучитьСуммуПоТабличнойЧасти(Объект, ПараметрыОтбораСкладЗаказБезЯчейки, "Резервировать",,,ИмяТЧ, ТипДокумента, "Отгрузка");
		ИтогПоЗначениюВРезервТекСклад = Окр(ИтогПоЗначениюВРезервВБазовыхЕдиницахТекСклад/КоэффициентЕди­ницыИзмерения,3);
		
		Если ЗначениеЗаполнено(Заказ) Тогда
			РезервНаСкладахСКоэффициентом = Окр(СтрокаОстатка.РезервНаСкладахИтог/КоэффициентЕдиницыИзмерения,3);
			РезервТекСкладСКоэффициентом = Окр(СтрокаОстатка.РезервТекСкладИтог/КоэффициентЕдиницыИзмерения,3);
		Иначе
			РезервНаСкладахСКоэффициентом = 0;
			РезервТекСкладСКоэффициентом = 0;
		КонецЕсли;
			
		СтрокаТабличнойЧасти.ВРезерве = РезервНаСкладахСКоэффициентом + СтрокаОстатка.СписаноРезерваНакладной - ИтогПоЗначениюВРезервПоВсемСкладам;
		СтрокаТабличнойЧасти.ВРезервеТекСклад = РезервТекСкладСКоэффициентом + СтрокаОстатка.СписаноРезерваНакладнойТекСклад - ИтогПоЗначениюВРезервТекСклад;
		
		ОстатокОбщийСКоэффициентом = Окр(СтрокаОстатка.ОстатокОбщий/КоэффициентЕдиницыИзмерения,3);
		СтрокаТабличнойЧасти.ОстатокОбщий = ОстатокОбщийСКоэффициентом;
		
		МожноОтгрузить = СтрокаТабличнойЧасти.ОстатокСвободно+ Резерв;
		
		СтрокаТабличнойЧасти.МожноОтгрузить = ?(СтрокаТабличнойЧасти.Количество < МожноОтгрузить, СтрокаТабличнойЧасти.Количество, МожноОтгрузить);
		
		СтрокаТабличнойЧасти.НеХватает = СтрокаТабличнойЧасти.Количество - СтрокаТабличнойЧасти.МожноОтгрузить;
		
	КонецЦикла;
	
КонецПроцедуры
Показать
8. Raideres 8 16.08.21 11:14 Сейчас в теме
считаю что вся проблема в этих остатках.
первое склад может быть как в табличной части так и в шапке
второе заказ тоже может быть как в табличной части так и в шапке
третье получается нужно получить не только свободный остаток но и резерв.
четвертое нужно исключить движение текущего документа
Оставьте свое сообщение

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