Выкуп возвратной тары клиентом / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Перем РеквизитыШапки;
	
	Автор = Пользователи.ТекущийПользователь();
	
	ЗаполненНаОснованииДокумента = Ложь;

	ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	РезультатЗапрос = Запрос.Выполнить();
	
	Возврат (Не РезультатЗапрос.Пустой());
	
КонецФункции

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

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

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

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

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

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

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

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

#КонецЕсли

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