Обработка заполнения по заказу поставщику приходной накладной в УНФ 1.6

1. Evgenij1990 26 21.08.19 11:50 Сейчас в теме
Всем привет! В УНФ есть процедура по заполнению документа "Приходная накладная" на основании "Заказа поставщику". Не могу понять почему нельзя было напрямую обратиться к остаткам регистра и заполнить ТЧ по ним? Есть ли в этом какой то смысл? Поясните, пожалуйста.

Процедура ЗаполнитьПоЗаказуПоставщику(ДанныеЗаполнения) Экспорт
	
	// Основание и настройка документа.
	МассивЗаказов = Новый Массив;
	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("МассивЗаказовПоставщикам") Тогда
		МассивЗаказов = ДанныеЗаполнения.МассивЗаказовПоставщикам;
		ПоложениеЗаказаПоставщику = Перечисления.ПоложениеРеквизитаНаФорме.ВТабличнойЧасти;
	Иначе
		МассивЗаказов.Добавить(ДанныеЗаполнения.Ссылка);
		ПоложениеЗаказаПоставщику = УправлениеНебольшойФирмойПовтИсп.ПолучитьЗначениеНастройки("ПоложениеЗаказаПоставщикуВДокументахПоступления");
		Если НЕ ЗначениеЗаполнено(ПоложениеЗаказаПоставщику) Тогда
			ПоложениеЗаказаПоставщику = Перечисления.ПоложениеРеквизитаНаФорме.ВШапке;
		КонецЕсли;
		Если ПоложениеЗаказаПоставщику = Перечисления.ПоложениеРеквизитаНаФорме.ВШапке Тогда
			Заказ = ДанныеЗаполнения;
		КонецЕсли;
	КонецЕсли;
	ПоложениеСклада = УправлениеНебольшойФирмойПовтИсп.ПолучитьЗначениеНастройки("ПоложениеСкладаВДокументахПоступления");
	
	// Заполнение шапки.
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ЗаказПоставщику.Ссылка КАК ОснованиеСсылка,
	|	ЗаказПоставщику.Проведен КАК ОснованиеПроведен,
	|	ЗаказПоставщику.СостояниеЗаказа КАК СостояниеЗаказа,
	|	ЗаказПоставщику.ЗаказПокупателя КАК ЗаказПокупателя,
	|	ЗаказПоставщику.СтруктурнаяЕдиница КАК СтруктурнаяЕдиницаРасход,
	|	ЗаказПоставщику.СтруктурнаяЕдиницаРезерв КАК СтруктурнаяЕдиница,
	|	ЗаказПоставщику.Организация КАК Организация,
	|	ЗаказПоставщику.Контрагент КАК Контрагент,
	|	ЗаказПоставщику.Договор КАК Договор,
	|	ЗаказПоставщику.ВалютаДокумента КАК ВалютаДокумента,
	|	ЗаказПоставщику.СуммаВключаетНДС КАК СуммаВключаетНДС,
	|	ЗаказПоставщику.НДСВключатьВСтоимость КАК НДСВключатьВСтоимость,
	|	ЗаказПоставщику.НалогообложениеНДС КАК НалогообложениеНДС,
	|	ВЫБОР
	|		КОГДА ЗаказПоставщику.ВидЦенКонтрагента = ЗНАЧЕНИЕ(Справочник.ВидыЦенКонтрагентов.ПустаяСсылка)
	|			ТОГДА ЗаказПоставщику.Договор.ВидЦенКонтрагента
	|		ИНАЧЕ ЗаказПоставщику.ВидЦенКонтрагента
	|	КОНЕЦ КАК ВидЦенКонтрагента,
	|	ВЫБОР
	|		КОГДА ЗаказПоставщику.ВалютаДокумента = НациональнаяВалюта.Значение
	|			ТОГДА ЗаказПоставщику.Курс
	|		ИНАЧЕ КурсыВалютСрезПоследних.Курс
	|	КОНЕЦ КАК Курс,
	|	ВЫБОР
	|		КОГДА ЗаказПоставщику.ВалютаДокумента = НациональнаяВалюта.Значение
	|			ТОГДА ЗаказПоставщику.Кратность
	|		ИНАЧЕ КурсыВалютСрезПоследних.Кратность
	|	КОНЕЦ КАК Кратность
	|ИЗ
	|	Документ.ЗаказПоставщику КАК ЗаказПоставщику
	|		{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДокумента, ) КАК КурсыВалютСрезПоследних
	|		ПО ЗаказПоставщику.Договор.ВалютаРасчетов = КурсыВалютСрезПоследних.Валюта},
	|	Константа.НациональнаяВалюта КАК НациональнаяВалюта
	|ГДЕ
	|	ЗаказПоставщику.Ссылка В(&МассивЗаказов)";
	
	Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
	Запрос.УстановитьПараметр("ДатаДокумента", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДата()));
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		ЗначенияПроверяемыхРеквизитов = Новый Структура("СостояниеЗаказа, Проведен", Выборка.СостояниеЗаказа, Выборка.ОснованиеПроведен);
		Документы.ЗаказПоставщику.ПроверитьВозможностьВводаНаОснованииЗаказаПоставщику(Выборка.ОснованиеСсылка, ЗначенияПроверяемыхРеквизитов);
	КонецЦикла;
	
	ЗаполнитьЗначенияСвойств(ЭтотОбъект, Выборка);
	
	Если МассивЗаказов.Количество() = 1 Тогда
		ЭтотОбъект.ДокументОснование = МассивЗаказов[0];
	КонецЕсли;
	
	// Заполнение документа.
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ЗаказыОстатки.ЗаказПоставщику КАК ЗаказПоставщику,
	|	ЗаказыОстатки.Номенклатура КАК Номенклатура,
	|	ЗаказыОстатки.Характеристика КАК Характеристика,
	|	СУММА(ЗаказыОстатки.КоличествоОстаток) КАК КоличествоОстаток
	|ИЗ
	|	(ВЫБРАТЬ
	|		ЗаказыОстатки.ЗаказПоставщику КАК ЗаказПоставщику,
	|		ЗаказыОстатки.Номенклатура КАК Номенклатура,
	|		ЗаказыОстатки.Характеристика КАК Характеристика,
	|		ЗаказыОстатки.КоличествоОстаток КАК КоличествоОстаток
	|	ИЗ
	|		РегистрНакопления.ЗаказыПоставщикам.Остатки(
	|				,
	|				ЗаказПоставщику В (&МассивЗаказов)
	|					И (Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Запас)
	|						ИЛИ Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
	|						ИЛИ Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.ПодарочныйСертификат))) КАК ЗаказыОстатки
	|	
	|	ОБЪЕДИНИТЬ ВСЕ
	|	
	|	ВЫБРАТЬ
	|		ДвиженияДокументаЗаказыПоставщикам.ЗаказПоставщику,
	|		ДвиженияДокументаЗаказыПоставщикам.Номенклатура,
	|		ДвиженияДокументаЗаказыПоставщикам.Характеристика,
	|		ВЫБОР
	|			КОГДА ДвиженияДокументаЗаказыПоставщикам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	|				ТОГДА ЕСТЬNULL(ДвиженияДокументаЗаказыПоставщикам.Количество, 0)
	|			ИНАЧЕ -ЕСТЬNULL(ДвиженияДокументаЗаказыПоставщикам.Количество, 0)
	|		КОНЕЦ
	|	ИЗ
	|		РегистрНакопления.ЗаказыПоставщикам КАК ДвиженияДокументаЗаказыПоставщикам
	|	ГДЕ
	|		ДвиженияДокументаЗаказыПоставщикам.Регистратор = &Ссылка) КАК ЗаказыОстатки
	|
	|СГРУППИРОВАТЬ ПО
	|	ЗаказыОстатки.ЗаказПоставщику,
	|	ЗаказыОстатки.Номенклатура,
	|	ЗаказыОстатки.Характеристика
	|
	|ИМЕЮЩИЕ
	|	СУММА(ЗаказыОстатки.КоличествоОстаток) > 0
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВЫБОР
	|		КОГДА ФункциональнаяОпцияРезервированиеЗапасов.Значение
	|			ТОГДА ЗаказПоставщикуЗапасы.ЗаказПокупателя
	|		ИНАЧЕ ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
	|	КОНЕЦ КАК ЗаказПокупателя,
	|	ЗаказПоставщикуЗапасы.Ссылка.СтруктурнаяЕдиница КАК СтруктурнаяЕдиницаРасход,
	|	ЗаказПоставщикуЗапасы.Номенклатура КАК Номенклатура,
	|	ЗаказПоставщикуЗапасы.Номенклатура.СтранаПроисхождения КАК СтранаПроисхождения,
	|	ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	|	ЗаказПоставщикуЗапасы.Номенклатура.СчетУчетаЗатрат.ТипСчета КАК ТипСчета,
	|	ЗаказПоставщикуЗапасы.Номенклатура.Склад КАК СтруктурнаяЕдиница,
	|	ЗаказПоставщикуЗапасы.Номенклатура.Ячейка КАК Ячейка,
	|	ЗаказПоставщикуЗапасы.Характеристика КАК Характеристика,
	|	ВЫБОР
	|		КОГДА ТИПЗНАЧЕНИЯ(ЗаказПоставщикуЗапасы.ЕдиницаИзмерения) = ТИП(Справочник.КлассификаторЕдиницИзмерения)
	|			ТОГДА 1
	|		ИНАЧЕ ЗаказПоставщикуЗапасы.ЕдиницаИзмерения.Коэффициент
	|	КОНЕЦ КАК Коэффициент,
	|	СУММА(ЗаказПоставщикуЗапасы.Количество) КАК Количество,
	|	ЗаказПоставщикуЗапасы.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	|	ЗаказПоставщикуЗапасы.Цена КАК Цена,
	|	СУММА(ЗаказПоставщикуЗапасы.Сумма) КАК Сумма,
	|	ЗаказПоставщикуЗапасы.СтавкаНДС КАК СтавкаНДС,
	|	СУММА(ЗаказПоставщикуЗапасы.СуммаНДС) КАК СуммаНДС,
	|	СУММА(ЗаказПоставщикуЗапасы.Всего) КАК Всего,
	|	ПОДСТРОКА(ЗаказПоставщикуЗапасы.Содержание, 1, 1024) КАК Содержание,
	|	ЗаказПоставщикуЗапасы.Ссылка КАК ЗаказОснование,
	|	ЗаказПоставщикуЗапасы.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки,
	|	СУММА(ЗаказПоставщикуЗапасы.СуммаСкидкиНаценки) КАК СуммаСкидкиНаценки,
	|	МИНИМУМ(ЗаказПоставщикуЗапасы.НомерСтроки) КАК НомерСтроки
	|ИЗ
	|	Документ.ЗаказПоставщику.Запасы КАК ЗаказПоставщикуЗапасы,
	|	Константа.ФункциональнаяОпцияРезервированиеЗапасов КАК ФункциональнаяОпцияРезервированиеЗапасов
	|ГДЕ
	|	ЗаказПоставщикуЗапасы.Ссылка В(&МассивЗаказов)
	|	И (ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
	|			ИЛИ ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Запас)
	|			ИЛИ ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.ПодарочныйСертификат))
	|
	|СГРУППИРОВАТЬ ПО
	|	ЗаказПоставщикуЗапасы.Ссылка,
	|	ЗаказПоставщикуЗапасы.Характеристика,
	|	ЗаказПоставщикуЗапасы.Номенклатура,
	|	ЗаказПоставщикуЗапасы.ЕдиницаИзмерения,
	|	ЗаказПоставщикуЗапасы.СтавкаНДС,
	|	ЗаказПоставщикуЗапасы.Цена,
	|	ЗаказПоставщикуЗапасы.ПроцентСкидкиНаценки,
	|	ВЫБОР
	|		КОГДА ФункциональнаяОпцияРезервированиеЗапасов.Значение
	|			ТОГДА ЗаказПоставщикуЗапасы.ЗаказПокупателя
	|		ИНАЧЕ ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
	|	КОНЕЦ,
	|	ЗаказПоставщикуЗапасы.Ссылка.СтруктурнаяЕдиница,
	|	ЗаказПоставщикуЗапасы.Номенклатура.СтранаПроисхождения,
	|	ЗаказПоставщикуЗапасы.Номенклатура.ТипНоменклатуры,
	|	ЗаказПоставщикуЗапасы.Номенклатура.СчетУчетаЗатрат.ТипСчета,
	|	ЗаказПоставщикуЗапасы.Номенклатура.Склад,
	|	ЗаказПоставщикуЗапасы.Номенклатура.Ячейка,
	|	ПОДСТРОКА(ЗаказПоставщикуЗапасы.Содержание, 1, 1024),
	|	ВЫБОР
	|		КОГДА ТИПЗНАЧЕНИЯ(ЗаказПоставщикуЗапасы.ЕдиницаИзмерения) = ТИП(Справочник.КлассификаторЕдиницИзмерения)
	|			ТОГДА 1
	|		ИНАЧЕ ЗаказПоставщикуЗапасы.ЕдиницаИзмерения.Коэффициент
	|	КОНЕЦ
	|
	|УПОРЯДОЧИТЬ ПО
	|	НомерСтроки";
	
	Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
	Запрос.УстановитьПараметр("ДатаДокумента", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДата()));
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	
	МассивРезультатов = Запрос.ВыполнитьПакет();
	ТаблицаОстатков = МассивРезультатов[0].Выгрузить();
	ТаблицаОстатков.Индексы.Добавить("ЗаказПоставщику,Номенклатура,Характеристика");
	
	Запасы.Очистить();
	Расходы.Очистить();
	Если ТаблицаОстатков.Количество() > 0 Тогда
		
		Выборка = МассивРезультатов[1].Выбрать();
		Пока Выборка.Следующий() Цикл
			
			СтруктураДляПоиска = Новый Структура;
			СтруктураДляПоиска.Вставить("ЗаказПоставщику", Выборка.ЗаказОснование);
			СтруктураДляПоиска.Вставить("Номенклатура", Выборка.Номенклатура);
			СтруктураДляПоиска.Вставить("Характеристика", Выборка.Характеристика);
			
			МассивСтрокОстатков = ТаблицаОстатков.НайтиСтроки(СтруктураДляПоиска);
			Если МассивСтрокОстатков.Количество() = 0 Тогда
				Продолжить;
			КонецЕсли;
			
			Если Выборка.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда
				НоваяСтрока = Расходы.Добавить();
				НоваяСтрока.ЗаказПоставщику = Выборка.ЗаказОснование;
				НоваяСтрока.СтруктурнаяЕдиница = Выборка.СтруктурнаяЕдиницаРасход;
				Если ЗначениеЗаполнено(Выборка.ЗаказПокупателя)
					И (Выборка.ТипСчета = Перечисления.ТипыСчетов.Расходы
					ИЛИ Выборка.ТипСчета = Перечисления.ТипыСчетов.КосвенныеЗатраты
					ИЛИ Выборка.ТипСчета = Перечисления.ТипыСчетов.НезавершенноеПроизводство) Тогда
					НоваяСтрока.Заказ = Выборка.ЗаказПокупателя;
				КонецЕсли;
				ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка,,"СтруктурнаяЕдиница");
			Иначе
				НоваяСтрока = Запасы.Добавить();
				НоваяСтрока.Заказ = Выборка.ЗаказОснование;
				ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
				Если ПоложениеСклада<>Перечисления.ПоложениеРеквизитаНаФорме.ВТабличнойЧасти Тогда
					НоваяСтрока.СтруктурнаяЕдиница = СтруктурнаяЕдиница;
				КонецЕсли; 
			КонецЕсли;
			
			КоличествоКСписанию = Выборка.Количество * Выборка.Коэффициент;
			МассивСтрокОстатков[0].КоличествоОстаток = МассивСтрокОстатков[0].КоличествоОстаток - КоличествоКСписанию;
			Если МассивСтрокОстатков[0].КоличествоОстаток < 0 Тогда
				
				КоличествоКСписанию = (КоличествоКСписанию + МассивСтрокОстатков[0].КоличествоОстаток) / Выборка.Коэффициент;
				
				СтруктураДанных = УправлениеНебольшойФирмойСервер.ПолучитьСуммуСтрокиТабличнойЧасти(
					Новый Структура("Количество, Цена, Сумма, СтавкаНДС, СуммаНДС, СуммаВключаетНДС, Всего",
						КоличествоКСписанию, Выборка.Цена, 0, Выборка.СтавкаНДС, 0, СуммаВключаетНДС, 0));
				
				ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураДанных);
				
			КонецЕсли;
			
			Если МассивСтрокОстатков[0].КоличествоОстаток <= 0 Тогда
				ТаблицаОстатков.Удалить(МассивСтрокОстатков[0]);
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры // ЗаполнитьПоЗаказПоставщику()
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
2. KVIKS 400 21.08.19 18:51 Сейчас в теме +1 $m
Остатки берутся без учета даты, если документ уже проведен, то при повторном заполнении/перезаполнении эти товары удалятся из него, поэтому система берет остатки (в них не будет движений этого документа) и клеит к нему движения этого документа. Это и логично для новых документов, которые вводятся на основании, и логично если заполнение происходит программно, к примеру по кнопке "добавить из документа" - в этом случае массив заказов будет пополняться и заполнение будет проходить корректно.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. KVIKS 400 21.08.19 18:51 Сейчас в теме +1 $m
Остатки берутся без учета даты, если документ уже проведен, то при повторном заполнении/перезаполнении эти товары удалятся из него, поэтому система берет остатки (в них не будет движений этого документа) и клеит к нему движения этого документа. Это и логично для новых документов, которые вводятся на основании, и логично если заполнение происходит программно, к примеру по кнопке "добавить из документа" - в этом случае массив заказов будет пополняться и заполнение будет проходить корректно.
3. Evgenij1990 26 23.08.19 15:07 Сейчас в теме
Оставьте свое сообщение

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