Чек ККМ / Подарочные сертификаты / Модуль формы

файл

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтотОбъект, ПоддерживаемыеТипыПодключаемогоОборудования);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии()
	
	МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтотОбъект);
	
КонецПроцедуры

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыПодарочныеСертификаты

&НаКлиенте
Процедура ПодарочныеСертификатыСуммаПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.ПодарочныеСертификаты.ТекущиеДанные;
	
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	// Если ничего не надо было доплачивать, то введенная сумма должна быть меньше, чем
	// наибольшая сумма из суммы до изменения и суммы, которую осталось оплатить.
	Если РежимОткрытияДоплата И Доплатить = 0 Тогда
		СуммаДоИзменения = СуммаОплаты - (ПодарочныеСертификаты.Итог("Сумма") - ТекущаяСтрока.Сумма);
		ТекущаяСтрока.Сумма = Мин(ТекущаяСтрока.Сумма, СуммаДоИзменения + ОсталосьДоплатить);
	КонецЕсли;
	
	ТекущаяСтрока.Сумма = Мин(ТекущаяСтрока.Сумма, ТекущаяСтрока.Остаток);
	СуммаОплатыПодарочнымиСертификатами = ПодарочныеСертификаты.Итог("Сумма");
	
	Если РежимОткрытияДоплата Тогда
		ДельтаСуммыОплаты = СуммаОплаты - СуммаОплатыПодарочнымиСертификатами;
		ОсталосьДоплатить = ОсталосьДоплатить + ДельтаСуммыОплаты;
	КонецЕсли;

	// новая сумма оплаты
	СуммаОплаты = СуммаОплатыПодарочнымиСертификатами;
	
	// Если по итогу интерактивного ввода вышла переплата и если нужно было что-то доплатить,
	// то нужно уменьшить сумму в строке и сумму оплаты
	Если РежимОткрытияДоплата И ОсталосьДоплатить < 0 И Доплатить <> 0 Тогда
		ТекущаяСтрока.Сумма = ТекущаяСтрока.Сумма + ОсталосьДоплатить;
		СуммаОплаты = СуммаОплаты + ОсталосьДоплатить;
		ОсталосьДоплатить = 0;
	КонецЕсли;
	
	Элементы.ПодарочныеСертификатыСчитатьПодарочныйСертификат.Доступность = (Не РежимОткрытияДоплата Или ОсталосьДоплатить > 0);
	
КонецПроцедуры

&НаКлиенте
Процедура ПодарочныеСертификатыПередУдалением(Элемент, Отказ)
	
	ДанныеКУдалению = Элементы.ПодарочныеСертификаты.ТекущиеДанные;
	ДельтаИзменения = ДанныеКУдалению.Сумма;
	СуммаОплаты = СуммаОплаты - ДельтаИзменения;
	
	Если РежимОткрытияДоплата Тогда
		ОсталосьДоплатить = ОсталосьДоплатить + ДельтаИзменения;
	КонецЕсли;
КонецПроцедуры

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

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

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

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

		Если СтрокаТЧ.СтатусАктивации = Истина
			И СтрокаТЧ.ДатаОкончанияДействия < ТекущаяДата И ЗначениеЗаполнено(СтрокаТЧ.ПодарочныйСертификат) Тогда
			ОбщегоНазначенияКлиент.СообщитьПользователю(
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Подарочный сертификат в строке %1 просрочен. Дата окончания действия %2.'"),
					ПодарочныеСертификаты.Индекс(СтрокаТЧ) + 1, Формат(СтрокаТЧ.ДатаОкончанияДействия, "ДЛФ=D")),
				Неопределено,
				"ПодарочныеСертификаты["+ПодарочныеСертификаты.Индекс(СтрокаТЧ)+"].ПодарочныйСертификат",
				,
				Отказ);
		КонецЕсли;
	
		Если ЗначениеЗаполнено(СтрокаТЧ.ПодарочныйСертификат)
				И (Не СтрокаТЧ.СтатусАктивации Или СтрокаТЧ.Остаток <= 0) Тогда
			ОбщегоНазначенияКлиент.СообщитьПользователю(
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Подарочный сертификат в строке %1 не может быть использован для оплаты.'"),
					ПодарочныеСертификаты.Индекс(СтрокаТЧ) + 1),
				Неопределено,
				"ПодарочныеСертификаты["+ПодарочныеСертификаты.Индекс(СтрокаТЧ)+"].ПодарочныйСертификат",
				,
				Отказ);
		КонецЕсли;
		
	КонецЦикла;

	Если Не Отказ Тогда
		Закрыть(ПоместитьТабличнуюЧастьПодарочныеСертификатыВХранилище(ВладелецФормы.УникальныйИдентификатор));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СчитатьПодарочныйСертификат(Команда)
	
	ОчиститьСообщения();

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтотОбъект, Команда);
	
КонецПроцедуры

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

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

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодарочныеСертификаты.Имя);

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

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодарочныеСертификаты.Остаток");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
	ОтборЭлемента.ПравоеЗначение = 0;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодарочныеСертификаты.ДатаОкончанияДействия");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ТекущаяДата");

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодарочныеСертификаты.Остаток");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = 0;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЗакрытыйДокумент);
	
	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПодарочныеСертификатыСумма.Имя);

	ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

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

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодарочныеСертификаты.Остаток");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
	ОтборЭлемента.ПравоеЗначение = 0;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодарочныеСертификаты.ДатаОкончанияДействия");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ТекущаяДата");

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПодарочныеСертификаты.Остаток");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = 0;

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

#Область ШтрихкодыИТорговоеОборудование

&НаКлиенте
Процедура ОбработатьШтрихкоды(ДанныеШтрихкодов)
	
	Если Не ШтрихкодированиеНоменклатурыКлиент.ШтрихкодыВалидны(ДанныеШтрихкодов) Тогда
		Возврат;
	КонецЕсли;
	
	Если ТипЗнч(ДанныеШтрихкодов) = Тип("Массив") Тогда
		МассивШтрихкодов = ДанныеШтрихкодов;
	Иначе
		МассивШтрихкодов = Новый Массив;
		МассивШтрихкодов.Добавить(ДанныеШтрихкодов);
	КонецЕсли;
	
	ПодарочныеСертификатыКлиент.ОбработатьПолученныйКодНаКлиенте(
		ЭтотОбъект,
		МассивШтрихкодов[0].Штрихкод,
		ПредопределенноеЗначение("Перечисление.ТипыКодовКарт.Штрихкод"),
		ПараметрыОбработкиПодарочныхСертификатов);
	
КонецПроцедуры

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

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

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

&НаСервере
Функция ПоместитьТабличнуюЧастьПодарочныеСертификатыВХранилище(Идентификатор)
	
	Возврат ПоместитьВоВременноеХранилище(ПодарочныеСертификаты.Выгрузить(), Идентификатор);
	
КонецФункции

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

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

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

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

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

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

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

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