Поступление денежных документов / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

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

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

#Область Инициализация

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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