Обработка заполнения по заказу поставщику приходной накладной в УНФ 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 395 21.08.19 18:51 Сейчас в теме +1 $m
Остатки берутся без учета даты, если документ уже проведен, то при повторном заполнении/перезаполнении эти товары удалятся из него, поэтому система берет остатки (в них не будет движений этого документа) и клеит к нему движения этого документа. Это и логично для новых документов, которые вводятся на основании, и логично если заполнение происходит программно, к примеру по кнопке "добавить из документа" - в этом случае массив заказов будет пополняться и заполнение будет проходить корректно.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. KVIKS 395 21.08.19 18:51 Сейчас в теме +1 $m
Остатки берутся без учета даты, если документ уже проведен, то при повторном заполнении/перезаполнении эти товары удалятся из него, поэтому система берет остатки (в них не будет движений этого документа) и клеит к нему движения этого документа. Это и логично для новых документов, которые вводятся на основании, и логично если заполнение происходит программно, к примеру по кнопке "добавить из документа" - в этом случае массив заказов будет пополняться и заполнение будет проходить корректно.
3. Evgenij1990 26 23.08.19 15:07 Сейчас в теме
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Программист 1С:ERP
Москва
зарплата от 100 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день