Подбор документов-оснований для счета-фактуры / Модуль

файл

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

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

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

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура Отмена(Команда)
	
	Модифицированность = Ложь;
	Закрыть();
	
КонецПроцедуры

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

&НаКлиенте
Процедура Исключить(Команда)
	
	Для Каждого СтрокаТаблицы Из ТаблицаКОформлению Цикл
		СтрокаТаблицы.Выбран = Ложь;
	КонецЦикла;
	
	УстановитьОтборСтрокТаблицы();
	
КонецПроцедуры

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

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

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

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

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

&НаСервере
Процедура УстановитьОтборСтрокТаблицы(ОтборСтрок = Неопределено)
	
	Если ОтборСтрок <> Неопределено Тогда
		СтруктураОтбора = Новый ФиксированнаяСтруктура(ОтборСтрок);
		Элементы.ТаблицаКОформлению.ОтборСтрок = СтруктураОтбора;
	Иначе
		Элементы.ТаблицаКОформлению.ОтборСтрок = Неопределено;
	КонецЕсли;
	
	УстановитьИнформационнуюНадпись(ОтборСтрок);
	
КонецПроцедуры

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

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