Заказ клиента / Модуль объекта

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

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

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

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

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

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

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

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

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

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

// Заполняет условия продаж по соглашению в заказе клиента
//
// Возвращаемое значение:
// 	Булево - Признак, что цены перезаполнены по соглашению.
Функция ЗаполнитьУсловияПродажПоСоглашению(ПересчитыватьЦены = Истина) Экспорт
	
	ЦеныРассчитаны = Ложь;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	Автор = Пользователи.АвторизованныйПользователь();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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