Взаимозачет задолженности / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ПроверитьСовпадениеЮрЛиц(Реквизит, Представление, Отказ)
	
	ЮрЛицо = ЭтотОбъект[Реквизит];
	Если ЗначениеЗаполнено(Организация) И ЗначениеЗаполнено(ЮрЛицо) И (Организация = ЮрЛицо) Тогда
		Текст = НСтр("ru='Организация и %Контрагент% должны различаться.'");
		Текст = СтрЗаменить(Текст,"%Контрагент%", Представление);
		ОбщегоНазначения.СообщитьПользователю(Текст, ЭтотОбъект, Реквизит,, Отказ);
	КонецЕсли;
КонецПроцедуры

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

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

Процедура ЗаполнитьПоДаннымОбъектовРасчетов(Отказ = Ложь) Экспорт

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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