Акт выполненных работ для клиента / Модуль объекта

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

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

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

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

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

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

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

// Инициализирует параметры заполнения видов запасов дополнительных свойств документа, используемых при записи документа
// в режиме 'Проведения' или 'Отмены проведения'.
//
// Параметры:
//	ДокументОбъект - ДокументОбъект.АктВыполненныхРабот - документ, для которого выполняется инициализация параметров.
//	РежимЗаписи - РежимЗаписиДокумента - режим записи документа.
//
Процедура ИнициализироватьПараметрыЗаполненияВидовЗапасовДляПроведения(ДокументОбъект, РежимЗаписи = Неопределено) Экспорт
	
	ПараметрыЗаполнения = ПараметрыЗаполненияВидовЗапасов();
	
	ДокументОбъект.ДополнительныеСвойства.Вставить("ПараметрыЗаполненияВидовЗапасов", ПараметрыЗаполнения);
	
КонецПроцедуры

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

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

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

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

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

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

	Если Не ЗначениеЗаполнено(Автор) И ЭтоНовый() Тогда
		Автор = Пользователи.ТекущийПользователь();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ПриКопировании(ОбъектКопирования)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ВидыЗапасов

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

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

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

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

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

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

Процедура ПроверитьКорректностьХозяйственнойОперацииДокументаОснования(ЕстьОшибкиХозяйственнаяОперация, ХозяйственнаяОперация)

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

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

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

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

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

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

#КонецЕсли

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