Заказ поставщику / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Рассчитывает сумму неотмененных строк заказа
//
// Параметры:
//	ТолькоЗалогЗаТару - Булево - Истина, если необходимо учитывать только строки залога за тару.
//
// Возвращаемое значение:
//	Число - Сумма заказанных строк.
//
Функция ПолучитьСуммуЗаказанныхСтрок(ТолькоЗалогЗаТару = Ложь) Экспорт
	
	Запрос = Новый Запрос("
	|ВЫБРАТЬ
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.СуммаСНДС КАК СуммаСНДС,
	|	Товары.Отменено КАК Отменено
	|ПОМЕСТИТЬ
	|	Товары
	|ИЗ
	|	&Товары КАК Товары
	|;
	|ВЫБРАТЬ
	|	ЕСТЬNULL(СУММА(Товары.СуммаСНДС),0) КАК СуммаСНДС
	|ИЗ
	|	Товары КАК Товары
	|ГДЕ
	|	НЕ Товары.Отменено
	|	И ((Товары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
	|			ИЛИ (НЕ &ВернутьМногооборотнуюТару) ИЛИ &ТребуетсяЗалогЗаТару)
	|			И НЕ &ТолькоЗалогЗаТару)
	|		ИЛИ (Товары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
	|			И &ВернутьМногооборотнуюТару
	|			И &ТребуетсяЗалогЗаТару
	|			И &ТолькоЗалогЗаТару)
	|");
	
	Запрос.УстановитьПараметр("Товары", Товары.Выгрузить(,"Номенклатура,СуммаСНДС,Отменено"));
	Запрос.УстановитьПараметр("ВернутьМногооборотнуюТару", ВернутьМногооборотнуюТару);
	Запрос.УстановитьПараметр("ТребуетсяЗалогЗаТару", ТребуетсяЗалогЗаТару);
	Запрос.УстановитьПараметр("ТолькоЗалогЗаТару", ТолькоЗалогЗаТару);
	
	Выгрузка = Запрос.Выполнить().Выгрузить();
	СуммаЗаказанныхСтрок = Выгрузка[0].СуммаСНДС;
	Возврат СуммаЗаказанныхСтрок;
	
КонецФункции

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

// Рассчитывает количество заказанных строк заказа
//
// Возвращаемое значение:
//	Число - Количество заказанных строк.
//
Функция ПолучитьКоличествоЗаказанныхСтрок() Экспорт
	
	НайденныеСтроки = Товары.НайтиСтроки(Новый Структура("Отменено", Ложь));
	Возврат НайденныеСтроки.Количество();
	
КонецФункции

// Заполняет условия продаж в заказе поставщику
//
// Параметры:
//	УсловияЗакупок - Структура - Структура для заполнения.
//
Процедура ЗаполнитьУсловияЗакупок(Знач УсловияЗакупок) Экспорт
	
	Если УсловияЗакупок = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Валюта = УсловияЗакупок.Валюта;
	
	Если ЗначениеЗаполнено(УсловияЗакупок.ФормаОплаты) Тогда
		ФормаОплаты = УсловияЗакупок.ФормаОплаты;
	КонецЕсли;
	
	Если ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоНакладным
		Или ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоДоговорамНакладным Тогда
		НаправлениеДеятельности = Справочники.НаправленияДеятельности.ПустаяСсылка();
	Иначе
		НаправлениеДеятельности = УсловияЗакупок.НаправлениеДеятельности;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(УсловияЗакупок.Организация) И УсловияЗакупок.Организация<>Организация Тогда
		Организация = УсловияЗакупок.Организация;
		
		СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияБанковскогоСчетаОрганизацииПоУмолчанию();
		СтруктураПараметров.Организация    			= Организация;
		СтруктураПараметров.ФормаОплаты 			= ФормаОплаты;
		СтруктураПараметров.НаправлениеДеятельности	= НаправлениеДеятельности;
		БанковскийСчет = ЗначениеНастроекПовтИсп.ПолучитьБанковскийСчетОрганизацииПоУмолчанию(СтруктураПараметров);
		
		СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияКассыОрганизацииПоУмолчанию();
		СтруктураПараметров.Организация    			= Организация;
		СтруктураПараметров.ФормаОплаты 			= ФормаОплаты;
		СтруктураПараметров.НаправлениеДеятельности	= НаправлениеДеятельности;

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

// Заполняет условия закупок по торговому соглашению с поставщиком
//
// Параметры:
//	ПересчитатьЦены - Булево - Истина, если необходимо пересчитать цены в табличной части документа.
//
Процедура ЗаполнитьУсловияЗакупокПоУмолчанию(ПересчитатьЦены = Истина) Экспорт
	
	Если ЗначениеЗаполнено(Партнер) Тогда
		
		ОтборУсловийЗакупок = Новый Структура("УчитыватьГруппыСкладов, ВыбранноеСоглашение", Истина, Соглашение);
		Если ЗначениеЗаполнено(ХозяйственнаяОперация) Тогда
			ХозяйственныеОперации = ЗакупкиСервер.ОсновнаяХозяйственнаяОперацияРаздельнойЗакупки(ХозяйственнаяОперация);
			ОтборУсловийЗакупок.Вставить("ХозяйственныеОперации", ХозяйственныеОперации);
		КонецЕсли;
		
		УсловияЗакупокПоУмолчанию	= ЗакупкиСервер.ПолучитьУсловияЗакупокПоУмолчанию(Партнер, ОтборУсловийЗакупок);
		
		Если УсловияЗакупокПоУмолчанию <> Неопределено Тогда
			
			Если Соглашение <> УсловияЗакупокПоУмолчанию.Соглашение
				И ЗначениеЗаполнено(УсловияЗакупокПоУмолчанию.Соглашение) Тогда
		
				Соглашение = УсловияЗакупокПоУмолчанию.Соглашение;
				ЗаполнитьУсловияЗакупок(УсловияЗакупокПоУмолчанию);
			
				ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
				УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
				
				ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
				УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
				
				Если ПересчитатьЦены
					И ЗначениеЗаполнено(Соглашение) Тогда
					
					ЗаполнитьЦеныПоСоглашению();
					
				КонецЕсли;
			Иначе
				Соглашение = УсловияЗакупокПоУмолчанию.Соглашение;
				ЗаполнитьУсловияЗакупок(УсловияЗакупокПоУмолчанию);
			КонецЕсли;
		Иначе
			
			ПартнерыИКонтрагенты.ЗаполнитьКонтрагентаПартнераПоУмолчанию(Партнер, Контрагент);
			Соглашение = Неопределено;
			
			ХозяйственнаяОперацияДоговора = ?(ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщикаРеглУчет
													Или ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаЧерезПодотчетноеЛицо,
												Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика,
												ХозяйственнаяОперация);
			ХозяйственнаяОперацияДоговора = ЗакупкиСервер.ХозяйственныеОперацииПоОсновной(ХозяйственнаяОперацияДоговора);
			
			ДопПараметры = ЗакупкиСервер.ДополнительныеПараметрыОтбораДоговоров();
			ДопПараметры.ВалютаВзаиморасчетов = Валюта;
			Договор = ЗакупкиСервер.ПолучитьДоговорПоУмолчанию(ЭтотОбъект, ХозяйственнаяОперацияДоговора, ДопПараметры);
			
			ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
			УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
			
			ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
			УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
			
			ЗакупкиВызовСервера.ЗаполнитьБанковскиеСчетаПоДоговору(Договор, БанковскийСчет);
			
		КонецЕсли;
	КонецЕсли;
	
	ПартнерыИКонтрагенты.ЗаполнитьКонтактноеЛицоПартнераПоУмолчанию(Партнер, КонтактноеЛицо);
	
КонецПроцедуры

// Заполняет условия продаж по соглашению в заказе поставщику
//
// Параметры:
//	ПересчитатьЦены - Булево - Истина, если необходимо пересчитать цены в табличной части документа.
//
Процедура ЗаполнитьУсловияЗакупокПоСоглашению(ПересчитатьЦены = Истина) Экспорт
	
	УсловияЗакупок = ЗакупкиСервер.ПолучитьУсловияЗакупок(Соглашение, Истина);
	ЗаполнитьУсловияЗакупок(УсловияЗакупок);
	
	ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
	УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
	
	ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
	УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
	
	Если ПересчитатьЦены Тогда
		СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);
		ПересчитатьСуммуСУчетомРучнойСкидки	= Новый Структура("Очищать", Ложь);
		
		СтруктураДействий = Новый Структура;
		СтруктураДействий.Вставить("ПересчитатьСумму", "КоличествоУпаковок");
		СтруктураДействий.Вставить("ПересчитатьСуммуСНДС",СтруктураПересчетаСуммы);
		СтруктураДействий.Вставить("ПересчитатьСуммуНДС",СтруктураПересчетаСуммы);
		СтруктураДействий.Вставить("ПересчитатьСуммуРучнойСкидки", "КоличествоУпаковок");
		СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", ПересчитатьСуммуСУчетомРучнойСкидки);
		
		ПараметрыЗаполнения = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыЗаполненияЗаполнитьЦены();
		ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС, ВидЦеныПоставщика");
		ПараметрыЗаполнения.Вставить("Дата",       Дата);
		ПараметрыЗаполнения.Вставить("Организация", Организация);
		ПараметрыЗаполнения.Вставить("Валюта",     Валюта);
		ПараметрыЗаполнения.Вставить("Соглашение", Соглашение);
		ПараметрыЗаполнения.Вставить("НалогообложениеНДС", НалогообложениеНДС);
		
		ЦеныПартнеровЗаполнениеСервер.ЗаполнитьЦены(
			Товары,
			Неопределено, // Массив строк
			ПараметрыЗаполнения,
			СтруктураДействий);
	КонецЕсли;
	
КонецПроцедуры

// Устанавливает статус для объекта документа
//
// Параметры:
//	НовыйСтатус - Строка - Имя статуса, который будет установлен у заказов
//	ДополнительныеПараметры - Структура - Структура дополнительных параметров установки статуса.
//
// Возвращаемое значение:
//	Булево - Истина, в случае успешной установки нового статуса.
//
Функция УстановитьСтатус(НовыйСтатус, ДополнительныеПараметры) Экспорт
	
	ЗначениеНовогоСтатуса = Перечисления.СтатусыЗаказовПоставщикам[НовыйСтатус];
	
	Если Согласован И
		ЗначениеНовогоСтатуса <> Перечисления.СтатусыЗаказовПоставщикам.Согласован
		И ЗначениеНовогоСтатуса <> Перечисления.СтатусыЗаказовПоставщикам.Подтвержден
		И ЗначениеНовогоСтатуса <> Перечисления.СтатусыЗаказовПоставщикам.Закрыт Тогда
		
		Согласован = Ложь;
		
	КонецЕсли;
	
	Если Товары.Количество() > 0 Тогда
		
		// В статусе "Подтвержден" или "Закрыт" - поставим все неотмененные строки в ожидаемое поступление
		Если Статус <> Перечисления.СтатусыЗаказовПоставщикам.Закрыт 
			И Статус <> Перечисления.СтатусыЗаказовПоставщикам.Подтвержден 
			И (ЗначениеНовогоСтатуса = Перечисления.СтатусыЗаказовПоставщикам.Подтвержден 
				ИЛИ	ЗначениеНовогоСтатуса = Перечисления.СтатусыЗаказовПоставщикам.Закрыт) Тогда
			
			ЗаполнитьПустуюДатуПоступления();
			
		КонецЕсли;
		
	КонецЕсли;

	
	Если ДополнительныеПараметры <> Неопределено Тогда
		
		ЗаказыСервер.СкорректироватьСтрокиЗаказа(ЭтотОбъект, ДополнительныеПараметры);
		
	КонецЕсли;
	
	Статус = ЗначениеНовогоСтатуса;
	
	Возврат ПроверитьЗаполнение();
	
КонецФункции

// Проверяет завершение расчетов с поставщиками
//
// Возвращаемое значение:
//	Булево - Истина, в случае отсутствия долга поставщику.
//
Функция ПроверитьЗавершениеРасчетов() Экспорт
	
	КонтрольЗавершенияРасчетов = ПолучитьФункциональнуюОпцию("НеЗакрыватьЗаказыПоставщикамБезПолнойОплаты");
	
	Если Не КонтрольЗавершенияРасчетов Тогда
		Возврат Истина
	КонецЕсли;
	
	ТекстОшибки = НСтр("ru = 'Расчеты по заказу не завершены.
	|Для закрытия заказа требуется оплата %СуммаКОплате% %Валюта%.
	|Закрытие заказа возможно только с полностью оплаченными/отмененными строками'");
	
	СуммаЗаказанныхСтрок = ПолучитьСуммуЗаказанныхСтрок();
	
	Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	РасчетыСПоставщикамиОстатки.Валюта КАК Валюта,
		|	РасчетыСПоставщикамиОстатки.КОплатеПриход КАК Оплачено
		|ИЗ
		|	РегистрНакопления.РасчетыСПоставщиками.ОстаткиИОбороты(, , , , ОбъектРасчетов.Объект = &Ссылка) КАК РасчетыСПоставщикамиОстатки
		|");
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	Если Выборка.Следующий() Тогда
		Если Выборка.Оплачено < СуммаЗаказанныхСтрок Тогда
			ТекстОшибки = СтрЗаменить(ТекстОшибки, "%СуммаКОплате%",      Строка(СуммаЗаказанныхСтрок - Выборка.Оплачено));
			ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Валюта%",      Строка(Выборка.Валюта));
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
				ТекстОшибки,,,,);
			Возврат Ложь
		КонецЕсли;
	КонецЕсли;
	
	Возврат Истина
	
КонецФункции

#КонецОбласти

#Область ОбработчикиСобытий

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Автор = Пользователи.ТекущийПользователь();
	ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
	
	НеобходимаИнициализация = Истина;
	
	ПараметрыВыбораСтатейИАналитик = Документы.ЗаказПоставщику.ПараметрыВыбораСтатейИАналитик(ХозяйственнаяОперация);
	ДоходыИРасходыСервер.ОбработкаЗаполнения(ЭтотОбъект, ПараметрыВыбораСтатейИАналитик);
	
	Если ТипДанныхЗаполнения = Тип("Структура") Тогда
		
		Если ДанныеЗаполнения.Свойство("Основание") Тогда
			
			ТипОснования = ТипЗнч(ДанныеЗаполнения.Основание);
			
			Если ТипОснования = Тип("ДокументСсылка.ЗаказКлиента") Тогда
				
				ЗаполнитьДокументНаОснованииЗаказаКлиента(ДанныеЗаполнения);
				
			ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаявкаНаВозвратТоваровОтКлиента") Тогда
				
				ЗаполнитьДокументНаОснованииЗаявкиНаВозврат(ДанныеЗаполнения);
				
			ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказНаПеремещение") Тогда
				
				ЗаполнитьДокументНаОснованииЗаказаНаПеремещение(ДанныеЗаполнения);
				
			ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказНаВнутреннееПотребление") Тогда
				
				ЗаполнитьДокументНаОснованииЗаказаНаВнутреннееПотребление(ДанныеЗаполнения);
				//++ НЕ УТ
				
			ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказМатериаловВПроизводство") Тогда
				
				ЗаполнитьДокументНаОснованииЗаказаМатериаловВПроизводство(ДанныеЗаполнения);
			
			//++ Устарело_Переработка24
			ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказПереработчику") Тогда
				
				ЗаполнитьДокументНаОснованииЗаказаПереработчику(ДанныеЗаполнения);
			//-- Устарело_Переработка24
			ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказПереработчику2_5") Тогда
				
				ЗаполнитьДокументНаОснованииЗаказаПереработчику2_5(ДанныеЗаполнения);
				//-- НЕ УТ

				
			ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказНаСборку") Тогда
				
				ЗаполнитьДокументНаОснованииЗаказаНаСборку(ДанныеЗаполнения);
				
			КонецЕсли;
			
		Иначе
			
			ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
			
		КонецЕсли;
		
		
	ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.Партнеры") Тогда
		
		ЗаполнитьДокументНаОснованииПартнера(ДанныеЗаполнения);
		
	ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.СоглашенияСПоставщиками") Тогда
		
		ЗаполнитьДокументНаОснованииСоглашенияСПоставщиком(ДанныеЗаполнения);
		
	ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда
		
		ЗаполнитьДокументНаОснованииДоговора(ДанныеЗаполнения);
		
	ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.СделкиСКлиентами") Тогда
		
		ЗаполнитьДокументНаОснованииСделки(ДанныеЗаполнения);
		
	ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ИзменениеАссортимента") Тогда
		
		ИнициализироватьДокумент(ДанныеЗаполнения);
		НеобходимаИнициализация = Ложь;
		ЗаполнитьДокументНаОснованииИзмененияАссортимента(ДанныеЗаполнения);
		
	КонецЕсли;
	
	ДополнительныеСвойства.Вставить("НеобходимостьЗаполненияКассыПриФОИспользоватьНесколькоКассЛожь", Ложь);
	ДополнительныеСвойства.Вставить("НеобходимостьЗаполненияСчетаПриФОИспользоватьНесколькоСчетовЛожь", Ложь);
	
	ЗаказПоставщикуЛокализация.ОбработкаЗаполнения(ЭтотОбъект, ДанныеЗаполнения, СтандартнаяОбработка);
	
	ЗначениеСклада = Склад;
	ЗаполнениеОбъектовПоСтатистике.ЗаполнитьРеквизитыОбъекта(ЭтотОбъект, ДанныеЗаполнения);
	// При создании из ОбщаяФома.СозданиеНаОснованииУточнениеЗаказываемогоКоличества может осознанно быть пустым,
	// если в документ переносят данные по нескольким складам. Заполнение по статистике может заполнить это пустое значение,
	// нужно его очистить
	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Основание") Тогда
		Склад = ЗначениеСклада;
	КонецЕсли;
	
	ОтветственныеЛицаСервер.УстановитьМенеджера(ЭтотОбъект);
	ЗаполнениеОбъектовПоСтатистике.ЗаполнитьПодчиненныеРеквизитыОбъекта(ЭтотОбъект, "Менеджер",, Истина);
	
	Если НеобходимаИнициализация Тогда
		ИнициализироватьДокумент(ДанныеЗаполнения);
	КонецЕсли;
	
	ВзаиморасчетыСервер.ОбработкаЗаполнения(ЭтотОбъект, ДанныеЗаполнения);
	
	Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаказКлиента") Или
		ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаявкаНаВозвратТоваровОтКлиента") Тогда
		
		Если ЗакупкаПодДеятельность <> НалогообложениеНДС Тогда
			
			СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);
			
			СтруктураДействий = Новый Структура;
			СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(ЭтотОбъект, Истина));
			СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
			СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
			
			ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Товары, СтруктураДействий, Неопределено);
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	МассивНепроверяемыхРеквизитов = Новый Массив;
	
	Если (ХозяйственнаяОперация <> Перечисления.ХозяйственныеОперации.ПриемНаХранениеСПравомПродажи)
		И Не ЗакупкиСервер.ЭтоХозяйственнаяОперацияРаздельнойЗакупки(ХозяйственнаяОперация)
		И (Не ЗначениеЗаполнено(Соглашение)
			Или Не ОбщегоНазначенияУТ.ЗначениеРеквизитаОбъектаТипаБулево(Соглашение, "ИспользуютсяДоговорыКонтрагентов")) Тогда
		
		МассивНепроверяемыхРеквизитов.Добавить("Договор");
		
	КонецЕсли;
	
	НоменклатураСервер.ПроверитьЗаполнениеКоличества(ЭтотОбъект, ПроверяемыеРеквизиты, Отказ);
	
	НоменклатураСервер.ПроверитьЗаполнениеХарактеристик(ЭтотОбъект,МассивНепроверяемыхРеквизитов,Отказ);
	
	// Срок действия заказа должен быть не меньше даты документа
	Если Статус = Перечисления.СтатусыЗаказовПоставщикам.НеСогласован И
		ЗначениеЗаполнено(ДатаСогласования) И ДатаСогласования < НачалоДня(Дата) Тогда
		
		ТекстОшибки = НСтр("ru = 'Дата согласования должна быть не меньше даты документа %Дата%'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата, "ДЛФ=DD"));
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			ТекстОшибки,
			ЭтотОбъект,
			"ДатаСогласования",
			,
			Отказ);
		
	КонецЕсли;
	
	ВсеСтрокиОтменены = ОбщегоНазначенияУТ.ВсеСтрокиОтменены(ЭтотОбъект, "Товары", "Отменено");
	
	Если Не ПоступлениеОднойДатой ИЛИ 
		ПоступлениеОднойДатой И 
		НЕ(Статус = Перечисления.СтатусыЗаказовПоставщикам.Подтвержден Или
			Статус = Перечисления.СтатусыЗаказовПоставщикам.Закрыт) 
		ИЛИ ПоступлениеОднойДатой И ВсеСтрокиОтменены Тогда
		
		МассивНепроверяемыхРеквизитов.Добавить("ДатаОтгрузки");
		МассивНепроверяемыхРеквизитов.Добавить("ДатаПоступления");
		
	КонецЕсли;
	
	Если ДлительностьДоставки = 0 Тогда
		МассивНепроверяемыхРеквизитов.Добавить("ДатаПоступления");
	КонецЕсли;
	
	// Желаемая дата поступления в шапке должна быть не меньше даты документа
	Если ЗначениеЗаполнено(ЖелаемаяДатаПоступления) И ЖелаемаяДатаПоступления < НачалоДня(Дата) Тогда
		
		ТекстОшибки = НСтр("ru = 'Желаемая дата поступления должна быть не меньше даты документа %Дата%'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата,"ДЛФ=DD"));
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			ТекстОшибки,
			ЭтотОбъект,
			"ЖелаемаяДатаПоступления",
			,
			Отказ);
		
	КонецЕсли;
	
	// Дата поступления в шапке должна быть не меньше даты документа
	Если ПоступлениеОднойДатой 
		И ЗначениеЗаполнено(ДатаПоступления) 
		И ДатаПоступления < НачалоДня(Дата)
		И НЕ ВсеСтрокиОтменены
		И ДлительностьДоставки <> 0 Тогда
	
		ТекстОшибки = НСтр("ru = 'Дата поступления должна быть не меньше даты документа %Дата%'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата,"ДЛФ=DD"));
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			ТекстОшибки,
			ЭтотОбъект,
			"ДатаПоступления",
			,
			Отказ);
		
	КонецЕсли;
	
	// Дата поступления в шапке должна быть не меньше даты документа
	Если ПоступлениеОднойДатой
		И ЗначениеЗаполнено(ДатаОтгрузки)
		И ДатаОтгрузки < НачалоДня(Дата)
		И НЕ ВсеСтрокиОтменены Тогда
	
		ТекстОшибки = НСтр("ru = 'Дата отгрузки должна быть не меньше даты документа %Дата%'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата,"ДЛФ=DD"));
		
		ОбщегоНазначения.СообщитьПользователю(
			ТекстОшибки,
			ЭтотОбъект,
			"ДатаОтгрузки",
			,
			Отказ);
		
	КонецЕсли;
	
	Если ПоступлениеОднойДатой
		И ДатаПоступления < ДатаОтгрузки
		И НЕ ВсеСтрокиОтменены Тогда
		
		ТекстОшибки = НСтр("ru = 'Дата поступления должна быть не меньше даты отгрузки %Дата%'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(ДатаОтгрузки, "ДЛФ=DD"));
		
		ОбщегоНазначения.СообщитьПользователю(
			ТекстОшибки,
			ЭтотОбъект,
			"ДатаПоступления",
			,
			Отказ);
		
	КонецЕсли;
	
	НакладнаяЯвляетсяРаспоряжением = ЗакупкиСервер.РаспоряжениеНаПриемкуТовараНакладная(ВариантПриемкиТоваров);
	
	ИспользуетсяНеотфактурованнаяПоставка = ПолучитьФункциональнуюОпцию("ИспользоватьНеотфактурованныеПоставки");
	ИспользуетсяНеотфактурованнаяПоставка = ИспользуетсяНеотфактурованнаяПоставка
											И ?(ЗначениеЗаполнено(Договор),
												ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Договор, "ВариантОформленияЗакупок") = Перечисления.ВариантыОформленияЗакупок.НеотфактурованныеПоставкиТоваров,
												Ложь);
	
	ОперацииНеотфактурованнойПоставки = Новый Массив;
	ОперацииНеотфактурованнойПоставки.Добавить(Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщикаФактуровкаПоставки);
	ОперацииНеотфактурованнойПоставки.Добавить(Перечисления.ХозяйственныеОперации.ЗакупкаВСтранахЕАЭСФактуровкаПоставки);
	
	Если НакладнаяЯвляетсяРаспоряжением
		И ИспользуетсяНеотфактурованнаяПоставка Тогда
		
		Если ОперацииНеотфактурованнойПоставки.Найти(ХозяйственнаяОперация) <> Неопределено Тогда
			ТекстОшибки = НСтр("ru = 'Использование варианта приемки ""по накладным"" не поддерживается для операций неотфактурованной поставки.
								|Рекомендуется использовать вариант приемки по договорам или по заказам.'");
			
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, , , Отказ);
		КонецЕсли;
		
	КонецЕсли;
	
	МассивНепроверяемыхРеквизитов.Добавить("Товары.ПричинаОтмены");
	МассивНепроверяемыхРеквизитов.Добавить("Товары.ДатаПоступления");
	МассивНепроверяемыхРеквизитов.Добавить("Товары.ДатаОтгрузки");
	
	// Вспомогательные реквизиты для проверки учета НДС
	ПоФактИспользованию			= (ЗакупкаПодДеятельность = Перечисления.ТипыНалогообложенияНДС.ПоФактическомуИспользованию);
	ИзДокумента					= Перечисления.ВариантыРаздельногоУчетаНДС.ИзДокумента;
	НаНаправленияДеятельности	= Перечисления.ВариантыРаспределенияРасходов.НаНаправленияДеятельности;
	//++ НЕ УТ
	НаПроизводственныеЗатраты	= Перечисления.ВариантыРаспределенияРасходов.НаПроизводственныеЗатраты;
	//-- НЕ УТ
	ПартионныйУчетВключен		= РасчетСебестоимостиПовтИсп.ПартионныйУчетВключен(НачалоМесяца(Дата));
	ИспользоватьДоходыРасходы	= ПолучитьФункциональнуюОпцию("ИспользоватьУчетПрочихДоходовРасходов");
	
	СоответствиеКодовСтрок = Новый Соответствие;

	ИспользоватьАгентскуюЗакупку = ПолучитьФункциональнуюОпцию("ИспользоватьОказаниеАгентскихУслугПриЗакупке");
	
	Для ТекИндекс = 0 По Товары.Количество()-1 Цикл

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

	Если Не Отказ И ОбщегоНазначенияУТ.ПроверитьЗаполнениеРеквизитовОбъекта(ЭтотОбъект, ПроверяемыеРеквизиты) Тогда
		Отказ = Истина;
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
	ДоставкаТоваров.ОтразитьСостояниеДоставки(Ссылка, Отказ);
	
	ЗакупкиСервер.ВыполнитьКонтрольЗаказаПослеПроведения(Ссылка, Отказ);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
	ДоставкаТоваров.ОтразитьСостояниеДоставки(Ссылка, Отказ, Истина);
	
КонецПроцедуры

Процедура ПриКопировании(ОбъектКопирования)
	
	Статус                  = Перечисления.СтатусыЗаказовПоставщикам.ПустаяСсылка();
	ЖелаемаяДатаПоступления = Дата(1,1,1);
	ДатаПоступления         = Дата(1,1,1);
	ДатаОтгрузки            = Дата(1,1,1);
	ДатаСогласования        = Дата(1,1,1);
	МаксимальныйКодСтроки   = 0;
	Согласован              = Ложь;
	НомерПоДаннымПоставщика = "";
	ДатаПоДаннымПоставщика  = Дата(1,1,1);
	ДокументОснование       = Неопределено;
	СостояниеЗаполненияМногооборотнойТары = Перечисления.СостоянияЗаполненияМногооборотнойТары.ПустаяСсылка();
	
	Если ЗначениеЗаполнено(Соглашение) Тогда
		СтатусСоглашения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Соглашение, "Статус");
		Если СтатусСоглашения = Перечисления.СтатусыСоглашенийСПоставщиками.Действует Тогда
			УсловияЗакупок = ЗакупкиСервер.ПолучитьУсловияЗакупок(Соглашение, Истина);
			Если ЗначениеЗаполнено(УсловияЗакупок.СрокПоставки) Тогда
				ДатаДокумента = ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса());
				ЖелаемаяДатаПоступления = ОбщегоНазначенияУТКлиентСервер.РассчитатьДатуОкончанияПериода(ДатаДокумента, Перечисления.Периодичность.День, УсловияЗакупок.СрокПоставки) + 1;
			КонецЕсли;
			ДлительностьДоставки = УсловияЗакупок.ДлительностьДоставки;
		Иначе
			Соглашение = Справочники.СоглашенияСПоставщиками.ПустаяСсылка();
		КонецЕсли;
	КонецЕсли;
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьВыплатыСамозанятым") Тогда
		ОперацияССамозанятым = Ложь;
	КонецЕсли;
	
	Для Каждого СтрокаТЧ Из Товары Цикл
		
		СтрокаТЧ.КодСтроки       = 0;
		СтрокаТЧ.ДатаПоступления = Дата(1,1,1);
		СтрокаТЧ.ДатаОтгрузки = Дата(1,1,1);
		СтрокаТЧ.Отменено = Ложь;
		СтрокаТЧ.ПричинаОтмены = Справочники.ПричиныОтменыЗаказовПоставщикам.ПустаяСсылка();
		
	КонецЦикла;
	
	ВзаиморасчетыСервер.ПриКопировании(ЭтотОбъект);
	
	ИнициализироватьДокумент();
	
	Автор = Пользователи.ТекущийПользователь();
	
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ПроверитьПараметрыЗаписиДляЗакупкиПодПринципала(НомерСтроки, Назначение, Отказ)
	
	УстановитьПривилегированныйРежим(Истина);
	
	Если Не ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика Тогда
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='Для номенклатуры в строке %1, закупаемой по агентской схеме, можно использовать только операцию ""Закупка у поставщика""'"),
				НомерСтроки);
		
		ОбщегоНазначения.СообщитьПользователю(
		ТекстОшибки ,
		ЭтотОбъект,
		ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары",НомерСтроки, "Назначение"),
		,
		Отказ);
	КонецЕсли;
		
	ВалютаДоговораНазначения  = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Назначение, "Договор.ВалютаВзаиморасчетов");
	Если ВалютаДоговораНазначения <> Валюта Тогда
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Для номенклатуры в строке %1, закупаемой по агентской схеме, валюта, указанная в договоре назначения, должна совпадать с валютой документа'"),
			НомерСтроки);
		
		ОбщегоНазначения.СообщитьПользователю(
		ТекстОшибки ,
		ЭтотОбъект,
		ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", НомерСтроки, "Назначение"),
		,
		Отказ);
	КонецЕсли;
	
	ОрганизацияДоговораНазначения  = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Назначение, "Договор.Организация");
	Если ОрганизацияДоговораНазначения <> Организация Тогда
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Для номенклатуры в строке %1, закупаемой по агентской схеме, организация, указанная в договоре назначения, должна совпадать с организацией документа'"),
			НомерСтроки);
		
		ОбщегоНазначения.СообщитьПользователю(
		ТекстОшибки ,
		ЭтотОбъект,
		ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", НомерСтроки, "Назначение"),
		,
		Отказ);
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Ложь);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ИнициализацияИЗаполнение

Процедура ЗаполнитьДокументНаОснованииПартнера(Знач Основание)
	
	Партнер = Основание;
	ЗакупкиСервер.ПроверитьВозможностьВводаНаОснованииПартнераПоставщикаКонкурента(Партнер);
	ЗаполнитьУсловияЗакупокПоУмолчанию();
	
КонецПроцедуры

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

	ЗаполнитьУсловияЗакупокПоСоглашению();

КонецПроцедуры

Процедура ЗаполнитьДокументНаОснованииСделки(СделкаСКлиентом)

	Если Документы.ЗаказКлиента.ЕстьОбособленныеЗаказыПоСделке(СделкаСКлиентом) Тогда

		ЗаполнитьДокументНаОснованииСделкиПоОбособленныемЗаказам(СделкаСКлиентом);

	Иначе

		ЗаполнитьДокументНаОснованииСделкиСводно(СделкаСКлиентом);

	КонецЕсли;

КонецПроцедуры

Процедура ЗаполнитьДокументПоОтбору(Знач ДанныеЗаполнения)

	Если ДанныеЗаполнения.Свойство("Менеджер") Тогда 
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения,,"Менеджер");	
	Иначе
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
	КонецЕсли;   
	ЗаполнениеОбъектовПоСтатистике.ЗаполнитьРеквизитыОбъекта(ЭтотОбъект, ДанныеЗаполнения);
	
	Если ДанныеЗаполнения.Свойство("Товары") Тогда
		ЭтотОбъект.Товары.Загрузить(ДанныеЗаполнения.Товары);
		ИспользоватьУчетПрочихДоходовРасходов = ПолучитьФункциональнуюОпцию("ИспользоватьУчетПрочихДоходовРасходов");
		Если ИспользоватьУчетПрочихДоходовРасходов Тогда
			Для Каждого СтрокаТовара Из Товары Цикл
				Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТовара.Номенклатура, "ТипНоменклатуры") = Перечисления.ТипыНоменклатуры.Услуга Тогда
					СтрокаТовара.СписатьНаРасходы = Истина;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

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

		ЗаполнитьЦеныПоВидамЦен(); //заполнение цен, согласно видам цен, заданным в таблице "Товары".
		ПартнерыИКонтрагенты.ЗаполнитьКонтрагентаПартнераПоУмолчанию(Партнер, Контрагент);

	ИначеЕсли ЗначениеЗаполнено(Соглашение) Тогда
		
		Если Не ЗначениеЗаполнено(Договор) Тогда
			
			ХозяйственнаяОперацияДоговора = ?(ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщикаРеглУчет
													Или ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаЧерезПодотчетноеЛицо,
												Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика,
												ХозяйственнаяОперация);
			ХозяйственнаяОперацияДоговора = ЗакупкиСервер.ХозяйственныеОперацииПоОсновной(ХозяйственнаяОперацияДоговора);
			
			ДопПараметры = ЗакупкиСервер.ДополнительныеПараметрыОтбораДоговоров();
			ДопПараметры.ВалютаВзаиморасчетов = Валюта;
			Договор = ЗакупкиСервер.ПолучитьДоговорПоУмолчанию(ЭтотОбъект, ХозяйственнаяОперацияДоговора, ДопПараметры);
			
		КонецЕсли;
	
		ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
		УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
		
		ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
		УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
		
		ЗаполнитьЦеныПоСоглашению();
		ПартнерыИКонтрагенты.ЗаполнитьКонтрагентаПартнераПоУмолчанию(Партнер, Контрагент);
		
	Иначе
		ЗаполнитьУсловияЗакупокПоУмолчанию();
	КонецЕсли;

	НоменклатураПартнеровСервер.ЗаполнитьНоменклатуруПартнераПоНоменклатуреПриИзмененииПартнера(Товары, Партнер);
	
	Если ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
		ДокументОснованиеРеквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументОснование, "ХозяйственнаяОперация, ЦенаВключаетНДС");
		Если ДокументОснованиеРеквизиты.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоставкаПодПринципала Тогда
			ЦенаВключаетНДС = ДокументОснованиеРеквизиты.ЦенаВключаетНДС;
			ЗаполнитьЦеныПоЗаказуПринципала();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьЦеныПоВидамЦен()

	КэшированныеЗначения = Неопределено;
	ПараметрыЗаполнения = Новый Структура;
	ПараметрыЗаполнения.Вставить("Дата", Дата);
	ПараметрыЗаполнения.Вставить("Валюта", Валюта);
	ПараметрыЗаполнения.Вставить("Соглашение", Соглашение);
	
	ПересчитатьСуммуСУчетомРучнойСкидки	= Новый Структура("Очищать", Ложь);
	СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьСумму", "КоличествоУпаковок");
	СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСуммуРучнойСкидки", "КоличествоУпаковок");
	СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", ПересчитатьСуммуСУчетомРучнойСкидки);

	// Заполнение цен
	Параметры = Новый Структура;
	Параметры.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС");
	Параметры.Вставить("КолонкиПоЗначению", Новый Структура);
	Параметры.Вставить("ДругиеИменаКолонок", Новый Структура);
	
	ОбщегоНазначенияУТКлиентСервер.ДополнитьСтруктуру(Параметры, ПараметрыЗаполнения, Истина);

	// Получение выгрузки по табличной части
	Таблица = ОбщегоНазначенияУТ.ВыгрузитьТаблицуЗначений(
		Товары,
		Неопределено,
		"НомерСтроки, Номенклатура, Характеристика, Упаковка, ВидЦеныПоставщика",
		Параметры.КолонкиПоЗначению,
		Параметры.ДругиеИменаКолонок);

	// Получение запроса.
	ПараметрыПолученияЦен = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыПолученияЦенНоменклатурыПартнера();
	ПараметрыПолученияЦен.Дата                         = ?(ЗначениеЗаполнено(Параметры.Дата), Параметры.Дата, ТекущаяДатаСеанса());
	ПараметрыПолученияЦен.Валюта                       = Параметры.Валюта;
	ПараметрыПолученияЦен.НалогообложениеНДС           = НалогообложениеНДС;
	ПараметрыПолученияЦен.ВозвращатьМногооборотнуюТару = ВернутьМногооборотнуюТару;
	
	РезультатЗапроса = ЦеныПартнеровЗаполнениеСервер.ЦеныНоменклатурыПартнера(Таблица, ПараметрыПолученияЦен);
	Если РезультатЗапроса.Пустой() Тогда
		Возврат;
	КонецЕсли;
	
	ОбрабатываемыеСтроки = Новый Массив();
	СтруктураЗаполнения = Новый Структура(Параметры.ПоляЗаполнения);
	Выборка = РезультатЗапроса.Выбрать();
	Пока Выборка.Следующий() Цикл
		ЗаполнитьЗначенияСвойств(СтруктураЗаполнения, Выборка);
		СтрокаТЧ = Товары[Выборка.НомерСтроки - 1];
		Если НЕ ЗначениеЗаполнено(СтрокаТЧ.ВидЦеныПоставщика) Тогда
			Продолжить;
		КонецЕсли; 
		ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтруктураЗаполнения);
		ОбрабатываемыеСтроки.Добавить(СтрокаТЧ);
	КонецЦикла;
	
	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
		ОбрабатываемыеСтроки,
		СтруктураДействий,
		Товары,
		КэшированныеЗначения);
		
КонецПроцедуры

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

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

Процедура ЗаполнитьДокументНаОснованииЗаказаНаПеремещение(Знач ДанныеЗаполнения)
	
	ЗаказНаПеремещение = ДанныеЗаполнения.Основание;
		Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	Заказ.Приоритет КАК Приоритет,
		|	Заказ.Организация КАК Организация,
		|	Заказ.Сделка КАК Сделка,
		|	Заказ.Подразделение КАК Подразделение,
		|	ВЫБОР
		|		КОГДА Заказ.НаправлениеДеятельности.УчетЗатрат
		|				ИЛИ Заказ.НаправлениеДеятельности.УчетРасчетовСПоставщиками
		|			ТОГДА Заказ.НаправлениеДеятельности
		|	КОНЕЦ КАК НаправлениеДеятельности,
		|	Заказ.ПеремещениеПодДеятельность КАК ЗакупкаПодДеятельность
		|ИЗ
		|	Документ.ЗаказНаПеремещение КАК Заказ
		|ГДЕ
		|	Заказ.Ссылка = &ЗаказНаПеремещение");
	
	Запрос.УстановитьПараметр("ЗаказНаПеремещение", ЗаказНаПеремещение);
	Реквизиты = Запрос.Выполнить().Выбрать();
	Реквизиты.Следующий();
	
	// Заполнение шапки
	Организация             = Реквизиты.Организация;
	Приоритет               = Реквизиты.Приоритет;
	Сделка                  = Реквизиты.Сделка;
	ДокументОснование       = ЗаказНаПеремещение;
	Подразделение           = Реквизиты.Подразделение;
	НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
	ЗакупкаПодДеятельность  = Реквизиты.ЗакупкаПодДеятельность;
	
	Склад = ДанныеЗаполнения.Склад;
	
	ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
	
	ПроверитьКорректностьНаправленияДеятельности();
	
КонецПроцедуры

Процедура ЗаполнитьДокументНаОснованииЗаказаНаВнутреннееПотребление(Знач ДанныеЗаполнения)
	
	ЗаказНаПотребление = ДанныеЗаполнения.Основание;
	Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	Заказ.Приоритет КАК Приоритет,
		|	Заказ.Организация КАК Организация,
		|	Заказ.Сделка КАК Сделка,
		|	Заказ.Подразделение КАК Подразделение,
		|	ВЫБОР
		|		КОГДА Заказ.НаправлениеДеятельности.УчетЗатрат
		|				ИЛИ Заказ.НаправлениеДеятельности.УчетРасчетовСПоставщиками
		|			ТОГДА Заказ.НаправлениеДеятельности
		|	КОНЕЦ КАК НаправлениеДеятельности
		|ИЗ
		|	Документ.ЗаказНаВнутреннееПотребление КАК Заказ
		|ГДЕ
		|	Заказ.Ссылка = &ЗаказНаПотребление");
	
	Запрос.УстановитьПараметр("ЗаказНаПотребление", ЗаказНаПотребление);
	Реквизиты = Запрос.Выполнить().Выбрать();
	Реквизиты.Следующий();
	
	// Заполнение шапки
	Организация             = Реквизиты.Организация;
	Приоритет               = Реквизиты.Приоритет;
	Сделка                  = Реквизиты.Сделка;
	ДокументОснование       = ЗаказНаПотребление;
	Подразделение           = Реквизиты.Подразделение;
	НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
	
	Склад = ДанныеЗаполнения.Склад;
	
	ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
	
КонецПроцедуры

Процедура ЗаполнитьДокументНаОснованииЗаказаНаСборку(Знач ДанныеЗаполнения)
	
	ЗаказНаСборку = ДанныеЗаполнения.Основание;
	Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	Заказ.Приоритет КАК Приоритет,
		|	Заказ.Организация КАК Организация,
		|	Заказ.Сделка КАК Сделка,
		|	Заказ.Подразделение КАК Подразделение,
		|	ВЫБОР
		|		КОГДА Заказ.НаправлениеДеятельности.УчетЗатрат
		|				ИЛИ Заказ.НаправлениеДеятельности.УчетРасчетовСПоставщиками
		|			ТОГДА Заказ.НаправлениеДеятельности
		|	КОНЕЦ КАК НаправлениеДеятельности
		|ИЗ
		|	Документ.ЗаказНаСборку КАК Заказ
		|ГДЕ
		|	Заказ.Ссылка = &ЗаказНаСборку");
	
	Запрос.УстановитьПараметр("ЗаказНаСборку", ЗаказНаСборку);
	Реквизиты = Запрос.Выполнить().Выбрать();
	Реквизиты.Следующий();
	
	// Заполнение шапки
	Организация             = Реквизиты.Организация;
	Сделка                  = Реквизиты.Сделка;
	Приоритет               = Реквизиты.Приоритет;
	ДокументОснование       = ЗаказНаСборку;
	Подразделение           = Реквизиты.Подразделение;
	НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
	
	Склад = ДанныеЗаполнения.Склад;
	
	ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
	
КонецПроцедуры

//++ НЕ УТ

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

//++ Устарело_Переработка24

Процедура ЗаполнитьДокументНаОснованииЗаказаПереработчику(Знач ДанныеЗаполнения)
	
	ЗаказПереработчику = ДанныеЗаполнения.Основание;
	Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	Таблица.Приоритет КАК Приоритет,
		|	Таблица.Организация КАК Организация,
		|	Таблица.Подразделение КАК Подразделение,
		|	ВЫБОР
		|		КОГДА Таблица.НаправлениеДеятельности.УчетЗатрат
		|				ИЛИ Таблица.НаправлениеДеятельности.УчетРасчетовСПоставщиками
		|			ТОГДА Таблица.НаправлениеДеятельности
		|	КОНЕЦ КАК НаправлениеДеятельности
		|ИЗ
		|	Документ.ЗаказПереработчику КАК Таблица
		|ГДЕ
		|	Таблица.Ссылка = &Заказ");
	Запрос.УстановитьПараметр("Заказ", ЗаказПереработчику);
	
	Реквизиты = Запрос.Выполнить().Выбрать();
	Реквизиты.Следующий();
	
	// Заполнение шапки
	Организация = Реквизиты.Организация;
	ДокументОснование = ЗаказПереработчику;
	Подразделение = Реквизиты.Подразделение;
	Приоритет = Реквизиты.Приоритет;
	НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
	
	Склад = ДанныеЗаполнения.Склад;
	
	ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
	
КонецПроцедуры
//-- Устарело_Переработка24

Процедура ЗаполнитьДокументНаОснованииЗаказаПереработчику2_5(Знач ДанныеЗаполнения)
	
	ЗаказПереработчику = ДанныеЗаполнения.Основание;
	Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	Таблица.Приоритет КАК Приоритет,
		|	Таблица.Организация КАК Организация,
		|	Таблица.Подразделение КАК Подразделение,
		|	Таблица.СкладМатериалов КАК СкладДокумента,
		|	ЕСТЬNULL(Таблица.СкладМатериалов.ЭтоГруппа, ЛОЖЬ) КАК ЭтоГруппа,
		|	ВЫБОР
		|		КОГДА Таблица.НаправлениеДеятельности.УчетЗатрат
		|				ИЛИ Таблица.НаправлениеДеятельности.УчетРасчетовСПоставщиками
		|			ТОГДА Таблица.НаправлениеДеятельности
		|	КОНЕЦ КАК НаправлениеДеятельности
		|ИЗ
		|	Документ.ЗаказПереработчику2_5 КАК Таблица
		|ГДЕ
		|	Таблица.Ссылка = &Заказ");
	Запрос.УстановитьПараметр("Заказ", ЗаказПереработчику);
	
	Реквизиты = Запрос.Выполнить().Выбрать();
	Реквизиты.Следующий();
	
	// Заполнение шапки
	Организация = Реквизиты.Организация;
	ДокументОснование = ЗаказПереработчику;
	Подразделение = Реквизиты.Подразделение;
	Приоритет = Реквизиты.Приоритет;
	НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
	
	Склад = ДанныеЗаполнения.Склад;
	Если Не ЗначениеЗаполнено(Склад)
			И Реквизиты.ЭтоГруппа
			И ПолучитьФункциональнуюОпцию("ИспользоватьСкладыВТабличнойЧастиДокументовЗакупки") Тогда
		
		Склад = Реквизиты.СкладДокумента;
		
	КонецЕсли;
	
	ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
	
КонецПроцедуры

//-- НЕ УТ


Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)

	Организация           = ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию(Организация);
	Если Не ЗначениеЗаполнено(Валюта) Тогда
		Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
	КонецЕсли;
	Подразделение         = ЗначениеНастроекПовтИсп.ПодразделениеПользователя(Менеджер, Подразделение);
	
	Если НЕ ЗначениеЗаполнено(ХозяйственнаяОперация) Тогда
		ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика;
	КонецЕсли;
	
	СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияБанковскогоСчетаОрганизацииПоУмолчанию();
	СтруктураПараметров.Организация    			= Организация;
	СтруктураПараметров.ФормаОплаты 			= ФормаОплаты;
	СтруктураПараметров.БанковскийСчет 			= БанковскийСчет;
	БанковскийСчет        = ЗначениеНастроекПовтИсп.ПолучитьБанковскийСчетОрганизацииПоУмолчанию(СтруктураПараметров);
	
	СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияКассыОрганизацииПоУмолчанию();
	СтруктураПараметров.Организация    	= Организация;
	СтруктураПараметров.ФормаОплаты 	= ФормаОплаты;
	СтруктураПараметров.Касса 			= Касса;
	Касса                 = ЗначениеНастроекПовтИсп.ПолучитьКассуОрганизацииПоУмолчанию(СтруктураПараметров);
	
	Склад                 = ЗначениеНастроекПовтИсп.ПолучитьСкладПоУмолчанию(
		Склад, 
		ПолучитьФункциональнуюОпцию("ИспользоватьСкладыВТабличнойЧастиДокументовЗакупки"));
	Приоритет             = ЗначениеНастроекПовтИсп.ПолучитьПриоритетПоУмолчанию(Приоритет);
	
	Если Не (ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Товары")) Тогда
		ПоступлениеОднойДатой = Истина;
	КонецЕсли;
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовПоставщикам") Тогда
		Статус = Перечисления.СтатусыЗаказовПоставщикам.Закрыт;
	Иначе
		Статус = Перечисления.СтатусыЗаказовПоставщикам.Согласован;
	КонецЕсли;
	
	ВариантПриемкиТоваров = ЗакупкиСервер.ПолучитьВариантПриемкиТоваров(Неопределено, Договор);
	
	ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
	УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
	
	ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
	УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
	
	СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВТЧ(ЭтотОбъект);
	СтруктураЗаполненияСтавкиНДС = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(ЭтотОбъект, Истина);
	СтруктураЗаполненияСтавкиНДС.ИнициализацияВходящегоДокумента = Истина;
	КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("СкорректироватьСтавкуНДС", СтруктураЗаполненияСтавкиНДС);
	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Товары, СтруктураДействий, КэшированныеЗначения);

	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
		КэшированныеЗначения.ОбработанныеСтроки,
		СтруктураДействий,
		Товары,
		КэшированныеЗначения);
	
	Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда
		СкладГруппа = Справочники.Склады.ЭтоГруппаИСкладыИспользуютсяВТЧДокументовПродажи(Склад);
		СкладыСервер.ЗаполнитьСкладыВТабличнойЧасти(Склад, СкладГруппа, Товары, Ложь, "СписатьНаРасходы");
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(АдресДоставкиДляПоставщика)
		И (СпособДоставки = Перечисления.СпособыДоставки.ПустаяСсылка()
			Или СпособДоставки = Перечисления.СпособыДоставки.СиламиПоставщикаДоНашегоСклада)
		И ЗначениеЗаполнено(Склад) Тогда
			
			Если Не Справочники.Склады.ЭтоГруппа(Склад) Тогда
				ДоступныеСклады = Новый Массив;
				ДоступныеСклады.Добавить(Склад);
			Иначе
				ДоступныеСклады = Товары.ВыгрузитьКолонку("Склад");
			КонецЕсли;
			
			Документы.ЗаказПоставщику.ЗаполнитьАдресДоставкиДляПоставщика(АдресДоставкиДляПоставщика, ДоступныеСклады, Дата);
		
	КонецЕсли;
	
КонецПроцедуры

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

	ЗаполнитьУсловияЗакупокПоСоглашению();

КонецПроцедуры

#КонецОбласти

#Область Прочее

Процедура ПроверитьИзменениеХозяйственнойОперации(Отказ)
	
	ЗаказНеОплачивается = ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПриемНаКомиссию
		Или ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПриемНаХранениеСПравомПродажи;
	
	Если Не ЭтоНовый() И ЗаказНеОплачивается Тогда
	
		Запрос = Новый Запрос("
		|ВЫБРАТЬ
		|	РасчетыСПоставщиками.СуммаПриход КАК СуммаОплаты
		|ИЗ
		|	РегистрНакопления.РасчетыСПоставщиками.Обороты(,,Период,
		|		ОбъектРасчетов.Объект = &Ссылка
		|	) КАК РасчетыСПоставщиками
		|
		|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|		Документ.ЗаказПоставщику КАК ДанныеДокумента
		|	ПО
		|		ДанныеДокумента.Ссылка = &Ссылка
		|		И ДанныеДокумента.ХозяйственнаяОперация <> &ХозяйственнаяОперация
		|ГДЕ
		|	РасчетыСПоставщиками.СуммаПриход > 0
		|");
		Запрос.УстановитьПараметр("Ссылка", Ссылка);
		Запрос.УстановитьПараметр("ХозяйственнаяОперация", ХозяйственнаяОперация);
		
		Выборка = Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			
			Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Заказ поставщику оплачен. Нельзя устанавливать операцию %1'"),
				ХозяйственнаяОперация);
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
				Текст,
				ЭтотОбъект,
				"ХозяйственнаяОперация",
				,
				Отказ);
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

	УстановитьПривилегированныйРежим(Истина);
	ТаблицаТовары = Запрос.Выполнить().Выгрузить();
	УстановитьПривилегированныйРежим(Ложь);

	Если ТаблицаТовары.Количество() > 0 Тогда 

		Товары.Загрузить(ТаблицаТовары);
		Склад = Товары[0].Склад;

	КонецЕсли;

КонецПроцедуры

Процедура ЗаполнитьДокументНаОснованииСделкиСводно(Знач СправочникОснование)

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

	УстановитьПривилегированныйРежим(Истина);
	МассивРезультатов = Запрос.ВыполнитьПакет();
	УстановитьПривилегированныйРежим(Ложь);

	РезультатПоСделке			= МассивРезультатов[0]; // РезультатЗапроса
	// МассивРезультатов[1] - Временная таблица ЗаказыКлиентов
	// МассивРезультатов[2] - Временная таблица ЗаказыПоставщикам.
	РезультатПоТоварам			= МассивРезультатов[3]; // РезультатЗапроса
	
	ВыборкаПоСделке = РезультатПоСделке.Выбрать();
	ВыборкаПоТоварам = РезультатПоТоварам.Выбрать();
	
	Если ВыборкаПоСделке.Следующий() Тогда
		Сделка = ВыборкаПоСделке.Сделка;
	КонецЕсли;
	
	Пока ВыборкаПоТоварам.Следующий() Цикл
		
		НоваяСтрока = Товары.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаПоТоварам);
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ЗаполнитьДокументНаОснованииИзмененияАссортимента(Знач ИзменениеАссортимента)
	
	//
	ОснованиеПроведен = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ИзменениеАссортимента, "Проведен");
	Если НЕ ОснованиеПроведен Тогда
		ТекстИсключения = Нстр("ru = 'Документ-основание %1 не проведен. Заполнение документа не возможно.'");
		ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИсключения, ИзменениеАссортимента);
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;
	//
	ДокументОснование = ИзменениеАссортимента;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ИзменениеАссортиментаТовары.Номенклатура
	|ИЗ
	|	Документ.ИзменениеАссортимента.Товары КАК ИзменениеАссортиментаТовары
	|ГДЕ
	|	ИзменениеАссортиментаТовары.Ссылка = &Ссылка
	|
	|УПОРЯДОЧИТЬ ПО
	|	ИзменениеАссортиментаТовары.НомерСтроки";
	Запрос.УстановитьПараметр("Ссылка", ИзменениеАссортимента);
	
	ВыборкаТоварыОснования = Запрос.Выполнить().Выбрать();
	
	КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС",
		ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(ЭтотОбъект, Истина));
	
	ОбрабатываемыеСтроки = Новый Массив();
	
	Пока ВыборкаТоварыОснования.Следующий() Цикл
		
		НоваяСтрока = Товары.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаТоварыОснования);
		
		ОбрабатываемыеСтроки.Добавить(НоваяСтрока);
		
	КонецЦикла;
	
	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
		ОбрабатываемыеСтроки,
		СтруктураДействий,
		Товары,
		КэшированныеЗначения);
	
КонецПроцедуры

Функция ЗаполнитьЦеныПоСоглашению()

	ПараметрыЗаполнения = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыЗаполненияЗаполнитьЦены();
	ПараметрыЗаполнения.Вставить("Дата", Дата);
	ПараметрыЗаполнения.Вставить("Валюта", Валюта);
	ПараметрыЗаполнения.Вставить("Организация", Организация);
	ПараметрыЗаполнения.Вставить("Соглашение", Соглашение);
	ПараметрыЗаполнения.Вставить("НалогообложениеНДС", НалогообложениеНДС);
	ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС, ВидЦеныПоставщика");

	ПересчитатьСуммуСУчетомРучнойСкидки = Новый Структура("Очищать", Ложь);
	СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьСумму", "КоличествоУпаковок");
	СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСуммуРучнойСкидки", "КоличествоУпаковок");
	СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", ПересчитатьСуммуСУчетомРучнойСкидки);

	ЦеныЗаполнены = ЦеныПартнеровЗаполнениеСервер.ЗаполнитьЦены(
		Товары,
		Неопределено,
		ПараметрыЗаполнения,
		СтруктураДействий);
	Возврат ЦеныЗаполнены;

КонецФункции

Процедура ПроверитьЗаполнитьПоступлениеОднойДатой()

	ПоступлениеОднойДатой = Истина;
	Если Товары.Количество() > 0 Тогда

		ДатаПоступления = Товары[0].ДатаПоступления;
		ДатаОтгрузки = Товары[0].ДатаПоступления;
		
		Для Каждого Строка Из Товары Цикл

			Если Строка.ДатаПоступления <> ДатаПоступления Тогда
				ПоступлениеОднойДатой = Ложь;
			КонецЕсли;
			Строка.ДатаОтгрузки = Строка.ДатаПоступления;
			
		КонецЦикла;

		Если ПоступлениеОднойДатой Тогда
			ЖелаемаяДатаПоступления = ДатаПоступления;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

// Параметры:
//    Таблица - ТаблицаЗначений - описание ссылки см. УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа.
//
Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) Экспорт

	СтрокаТаб = Таблица.Добавить();
	Если ЗначениеЗаполнено(Партнер) Тогда
		СтрокаТаб.ЗначениеДоступа = Партнер;
	Иначе
		// Всегда разрешено.
		СтрокаТаб.ЗначениеДоступа = Перечисления.ДополнительныеЗначенияДоступа.ДоступРазрешен;
	КонецЕсли;

КонецПроцедуры // ЗаполнитьНаборыЗначенийДоступа()

// Корректирует строки, по которым не была оформлено поступление или складские ордера или имеются расхождения по мерным товарам.
//
// Параметры:
// 		СтруктураПараметров - Структура - Структура параметров корректировки, конструктор: ЗаказыСервер.СтруктураКорректировкиСтрокЗаказа().
//
// Возвращаемое значение:
// 		Структура
// 		*	КоличествоСтрок - Количество отмененных/скорректированных строк
// 		*	СуммаОтклонения - Сумма увеличения заказа из-за превышения отгрузки мерных товаров.
//
Функция СкорректироватьСтрокиЗаказа(СтруктураПараметров) Экспорт
	
	КоличествоОтмененныхСтрок = 0;
	СуммаОтклоненияМерныхТоваров = 0;
	
	СтруктураВозврата = Новый Структура("КоличествоСтрок, СуммаОтклонения",0,0);

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

	ОбрабатываемыеСтроки = Новый Массив;
	Если ТаблицаТовары = Товары Тогда
		ОбрабатываемыеСтрокиНовые = ОбрабатываемыеСтроки;
	Иначе
		ОбрабатываемыеСтрокиНовые = Новый Массив;
	КонецЕсли;

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

	КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();

	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");

	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
		ОбрабатываемыеСтроки,
		СтруктураДействий,
		Товары,
		КэшированныеЗначения);
		
	Для Каждого СтрокаТоваров Из ОбрабатываемыеСтроки Цикл
		Ценообразование.ПересчитатьСуммыВСтроке(СтрокаТоваров, Ложь, Ложь, Истина, ЦенаВключаетНДС);
	КонецЦикла;
	
	Если ТаблицаТовары <> Товары Тогда
		ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
			ОбрабатываемыеСтрокиНовые,
			СтруктураДействий,
			ТаблицаТовары,
			КэшированныеЗначения);
			
			Для Каждого СтрокаТоваров Из ОбрабатываемыеСтрокиНовые Цикл
				Ценообразование.ПересчитатьСуммыВСтроке(СтрокаТоваров, Ложь, Ложь, Истина, ЦенаВключаетНДС);
			КонецЦикла;
	КонецЕсли;

	СтруктураВозврата.КоличествоСтрок = КоличествоОтмененныхСтрок;
	
	Возврат СтруктураВозврата;
	
КонецФункции

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

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

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

Процедура ЗаполнитьПустуюДатуПоступления()
	
	Если Товары.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Если ПроверитьПустуюДатуПоступления() Тогда
		Если ЗначениеЗаполнено(ЖелаемаяДатаПоступления) И ЖелаемаяДатаПоступления >= Дата Тогда
			ДатаПоступления = ЖелаемаяДатаПоступления;
		Иначе
			ДатаПоступления = ТекущаяДатаСеанса();
		КонецЕсли;
		
		Если ПоступлениеОднойДатой Тогда
			ЗаполнитьДатыПоступленияДляТовара();
		Иначе
			ЗаполнитьПустыеДатыПоступленияДляТовара();
		КонецЕсли;
		
	КонецЕсли;
КонецПроцедуры

Функция ПроверитьПустуюДатуПоступления()
	
	Для Каждого СтрокаТЧ Из Товары Цикл
		
		Если Не СтрокаТЧ.Отменено
			И Не ЗначениеЗаполнено(СтрокаТЧ.ДатаПоступления) Тогда
			
			Возврат Истина;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

Процедура ЗаполнитьПустыеДатыПоступленияДляТовара()
	
	Для Каждого СтрокаТЧ Из Товары Цикл
		Если Не ЗначениеЗаполнено(СтрокаТЧ.ДатаПоступления) Тогда
			СтрокаТЧ.ДатаПоступления = ДатаПоступления;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Процедура ЗаполнитьДатыПоступленияДляТовара()

	Для Каждого СтрокаТЧ Из Товары Цикл
		СтрокаТЧ.ДатаПоступления = ДатаПоступления;		
	КонецЦикла;
	
КонецПроцедуры

Процедура ЗаполнитьЦеныПоЗаказуПринципала()
	
	СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);

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

Процедура ЗаполнитьТоварыИзОснования(АдресТоварыОснования)
	
	ТоварыОснования = ПолучитьИзВременногоХранилища(АдресТоварыОснования); // ТаблицаЗначений
	КолонкаДатаОтгрузки = ТоварыОснования.Колонки.Найти("ДатаОтгрузки");
	Если КолонкаДатаОтгрузки <> Неопределено Тогда
		ТоварыОснования.Колонки.Удалить(КолонкаДатаОтгрузки);
	КонецЕсли;
	Товары.Загрузить(ТоварыОснования);
	УдалитьИзВременногоХранилища(АдресТоварыОснования);
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#КонецЕсли

Связанные материалы