Аннулирование подарочных сертификатов / Модуль менеджера

файл

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

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

#Область ДляВызоваИзДругихПодсистем

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

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

#Область Проведение

// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
//  МеханизмыДокумента - Массив из Строка - список имен учетных механизмов, для которых будет выполнена
//              регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
	
	МеханизмыДокумента.Добавить("Взаиморасчеты");
	МеханизмыДокумента.Добавить("ОборотныеРегистрыУправленческогоУчета");
	МеханизмыДокумента.Добавить("ПодарочныеСертификаты");
	МеханизмыДокумента.Добавить("УчетДоходовРасходов");
	МеханизмыДокумента.Добавить("УчетПрочихАктивовПассивов");
	МеханизмыДокумента.Добавить("РеестрДокументов");

	АннулированиеПодарочныхСертификатовЛокализация.ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента);
	
КонецПроцедуры

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

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

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

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

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

// Определяет список команд создания на основании.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.КомандыСозданияНаОсновании
//  Параметры - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.Параметры
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
	
	БизнесПроцессы.Задание.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
	
КонецПроцедуры

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
//   Параметры - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.Параметры
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
КонецПроцедуры

#Область АннулированиеСертификатов

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

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


// СтандартныеПодсистемы.ВерсионированиеОбъектов
// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
// Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

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

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

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

	Если ЕстьКоллекцияПС Тогда
		ТекстОтбораОбъектаРасчета = 
		"ПодарочныйСертификат В (Выбрать ПодарочныйСертификат из ОтборПодарочныеСертификаты)";
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборОбъектовРасчетаПодмена", ТекстОтбораОбъектаРасчета);
	Иначе
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборОбъектовРасчетаПодмена", "");
	КонецЕсли;

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

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

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

			ПараметрыАннулирования.ДатаДокумента = ПериодАннулирования;
			Если ЗначениеЗаполнено(ДатаСозданияДокумента) Тогда
				ПараметрыАннулирования.ДатаДокумента = ДатаСозданияДокумента;
			КонецЕсли;

			ПараметрыАннулирования.Организация = ЭлемОрганизация; 
			ПараметрыАннулирования.ПодарочныеСертификаты = ПСДляАннулирования; 
			СоздатьДокументАннулирования(ПараметрыАннулирования);
			
			Если НЕ ПустаяСтрока(ПараметрыАннулирования.ТекстОшибки) Тогда
				Прервать;
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры

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

#Область Проведение

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных; 

КонецФункции

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

	РасчетСебестоимостиПрикладныеАлгоритмы.ЗаполнитьПараметрыИнициализации(Запрос, Реквизиты);
	
КонецПроцедуры

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

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

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

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

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

	ИмяРегистра = "ВременнаяТаблицаКурсыВалютДокумента";

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

	ТекстыЗапроса.Добавить(ТекстЗапросаКурсыВалютДокумента, ИмяРегистра);

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


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

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

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

#Область ПодборАннулированныхПС

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

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

// Возвращаемое значение:
//	Число - максимальное количество строк одного документа аннулирования ПС при автозаполнении
Функция АвтоАннулированиеМаксимумПС()
	
	Возврат 10000;
	
КонецФункции

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

#Область БлокировкаПриОбновленииИБ

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

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

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

#КонецЕсли

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