Карты лояльности / Помощник регистрации / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем ВыполняетсяЗакрытие;

&НаКлиенте
Перем СтэкСтраниц; // Массив - История переходов для возврата по кнопке назад

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

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

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

	УстановитьУсловноеОформление();
	
	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
		Возврат;
	КонецЕсли;

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

	СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);

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

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

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

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

&НаКлиенте
Процедура ПередЗакрытиемЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	УдалитьКартуЛояльности = ДополнительныеПараметры.УдалитьКартуЛояльности;
	Результат = РезультатВопроса;
	Если Результат = КодВозвратаДиалога.Да Тогда
		ВыполняетсяЗакрытие = Истина;
		Если УдалитьКартуЛояльности И ЗначениеЗаполнено(НоваяКарта) Тогда
			УдалитьЗарегистрированнуюКартуЛояльности();
		КонецЕсли;
		Закрыть();
	КонецЕсли;

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

&НаКлиенте
Процедура ПриЗакрытии()

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

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

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

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

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

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

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

&НаКлиенте
Процедура ЗаполнитьИнформациюОВладельцеКартыПриИзменении(Элемент)
	
	Элементы.ГруппаИнформацияОВладельцеКарты.Доступность = Не ЗаполнитьИнформациюОВладельцеКарты = "Позже";
	Элементы.ГруппаГруппаДоступа.Доступность 		 	 = ЗаполнитьИнформациюОВладельцеКарты = "Позже";	
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаменяемаяКартаПриИзменении(Элемент)
	
	Если ЗначениеЗаполнено(ЗаменяемаяКарта) Тогда
		ПодключитьОбработчикОжидания("ДалееОбработчикОжидания", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПервыйКодНовойКартыПриИзменении(Элемент)
	
	Если ЗначениеЗаполнено(ПервыйКодНовойКарты) Тогда
		ПодключитьОбработчикОжидания("ДалееОбработчикОжидания", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура НайденныеКартыЛояльностиСчитываниеНовойКартыЛояльностиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ПодключитьОбработчикОжидания("ДалееОбработчикОжидания", 0.1, Истина);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ШтрихкодНовойКартыПриИзменении(Элемент)
	
	Если ЗначениеЗаполнено(ВторойКодНовойКарты) Тогда
		ПодключитьОбработчикОжидания("ДалееОбработчикОжидания", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПартнерСчитываниеЗаменяемойКартыЛояльностиПриИзменении(Элемент)
	
	Если Не ЗначениеЗаполнено(ЗаменяемаяКарта) Тогда
		ЗаменяемаяКарта = ПолучитьКартуПоУмолчаниюДляПартнера(Партнер);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СоглашениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ПараметрыВыбораСоглашения = ПродажиКлиент.ПараметрыНачалаВыбораСоглашенияСКлиентом();
	
	ПараметрыВыбораСоглашения.Элемент               = Элемент;
	ПараметрыВыбораСоглашения.Партнер               = Партнер;
	ПараметрыВыбораСоглашения.Документ              = Соглашение;
	ПараметрыВыбораСоглашения.ДатаДокумента         = Дата;
	ПараметрыВыбораСоглашения.ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.РеализацияКлиенту");

	ПродажиКлиент.НачалоВыбораСоглашенияСКлиентом(ПараметрыВыбораСоглашения, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ТипПервогоКодаНовойКартыОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

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

&НаКлиенте
Процедура Отмена(Команда)
	
	Закрыть();
	
КонецПроцедуры

&НаКлиенте
Процедура Назад(Команда)
	
	Если СтэкСтраниц.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Элементы.Страницы.ТекущаяСтраница = СтэкСтраниц[СтэкСтраниц.Количество()-1];
	СтэкСтраниц.Удалить(СтэкСтраниц.Количество()-1);
	
	УстановитьЗаголовок(Элементы.Страницы.ТекущаяСтраница);
	
	Если СтэкСтраниц.Количество() = 0 Тогда
		Элементы.СтраницыКнопкиНазад.ТекущаяСтраница = Элементы.СтраницыКнопкиНазад.ПодчиненныеЭлементы.КнопкаНазадОтсутствует;
	КонецЕсли;
	
	Элементы.Далее.КнопкаПоУмолчанию = Истина;
	Элементы.СтраницыКнопкиДалее.ТекущаяСтраница = Элементы.СтраницыКнопкиДалее.ПодчиненныеЭлементы.КнопкаДалее;
	
	ЗадаватьВопросПриЗакрытии = Истина;
	
КонецПроцедуры

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

&НаКлиенте
Процедура СоздатьНовогоПартнера(Команда)
	
	ОткрытьФорму("Справочник.Партнеры.Форма.ПомощникНового",Новый Структура("ВводНовогоРозничногоПокупателя",Истина), ВладелецФормы);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПечатьАнкетыMicrosoftWord(Команда)
	
	Если Не ЗначениеЗаполнено(НоваяКарта) Тогда
		ЗарегистрироватьКартуЛояльности("Позже", Ложь);
	КонецЕсли;
	
	КартыЛояльностиКлиент.ПечатьАнкетыMicrosoftWord(НоваяКарта);
	
КонецПроцедуры

&НаКлиенте
Процедура ПечатьАнкетыMXL(Команда)
	
	Если Не ЗначениеЗаполнено(НоваяКарта) Тогда
		ЗарегистрироватьКартуЛояльности("Позже", Ложь);
	КонецЕсли;
	
	КартыЛояльностиКлиент.ПечатьАнкетыMXL(НоваяКарта);
	
КонецПроцедуры

&НаКлиенте
Процедура ПечатьАнкетыOpenOfficeOrgWriter(Команда)
	
	Если Не ЗначениеЗаполнено(НоваяКарта) Тогда
		ЗарегистрироватьКартуЛояльности("Позже", Ложь);
	КонецЕсли;
	
	КартыЛояльностиКлиент.ПечатьАнкетыOpenOfficeOrgWriter(НоваяКарта);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

	//

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

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

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

	//

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьЗаголовок(Страница)
	Если Страница = Элементы.Страницы.ПодчиненныеЭлементы.ГруппаВыборРежимаРегистрацииКартыЛояльности Тогда
		Заголовок = НСтр("ru = 'Помощник регистрации карт лояльности'");
	ИначеЕсли Режим = "РегистрацияНовойКартыЛояльности" Тогда
		Заголовок = НСтр("ru = 'Регистрация новой карты лояльности'");
	ИначеЕсли Режим = "ЗаменаКартыЛояльности" Тогда
		Заголовок = НСтр("ru = 'Замена карты лояльности'");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПерейтиНаСтраницу(Страница)
	
	СтэкСтраниц.Добавить(Элементы.Страницы.ТекущаяСтраница);
	Элементы.Страницы.ТекущаяСтраница = Страница;
	Элементы.СтраницыКнопкиНазад.ТекущаяСтраница = Элементы.СтраницыКнопкиНазад.ПодчиненныеЭлементы.КнопкаНазад;
	
	Если Страница = Элементы.Страницы.ПодчиненныеЭлементы.ГруппаВводИнформацииОВладельцеКарты Тогда
		Элементы.СтраницыКнопкиДалее.ТекущаяСтраница = Элементы.СтраницыКнопкиДалее.ПодчиненныеЭлементы.КнопкаГотово;
		Элементы.Готово.КнопкаПоУмолчанию = Истина;
	Иначе
		Элементы.Далее.КнопкаПоУмолчанию = Истина;
	КонецЕсли;
	
	УстановитьЗаголовок(Страница);
	
	Если Страница = Элементы.Страницы.ПодчиненныеЭлементы.ГруппаВыборНовойКартыЛояльности Тогда
		Если ТипПервогоКодаНовойКарты = ПредопределенноеЗначение("Перечисление.ТипыКодовКарт.МагнитныйКод") Тогда
			Текст = НСтр("ru = 'Обнаружено несколько карт лояльности с магнитным кодом %1.
			                   |Выберите подходящую карту.'");
		Иначе
			Текст = НСтр("ru = 'Обнаружено несколько карт лояльности со штрихкодом %1.
			                   |Выберите подходящую карту.'");
		КонецЕсли;
		НадписьВыборКартыЛояльности = СтрШаблон(Текст, ПервыйКодНовойКарты);
	ИначеЕсли Страница = Элементы.Страницы.ПодчиненныеЭлементы.ГруппаВыборЗаменяемойКартыЛояльности Тогда
		Если ТипКодаЗаменяемойКарты = ПредопределенноеЗначение("Перечисление.ТипыКодовКарт.МагнитныйКод") Тогда
			Текст = НСтр("ru = 'Обнаружено несколько карт лояльности с магнитным кодом %1.
			                   |Выберите подходящую карту.'");
		Иначе
			Текст = НСтр("ru = 'Обнаружено несколько карт лояльности со штрихкодом %1.
			                   |Выберите подходящую карту.'");
		КонецЕсли;
		НадписьВыборКартыЛояльности = СтрШаблон(Текст, ПервыйКодНовойКарты);
	ИначеЕсли Страница = Элементы.Страницы.ПодчиненныеЭлементы.ГруппаСчитываниеНовойКартыЛояльности Тогда
		ТекущийЭлемент = Элементы.ПервыйКодНовойКарты;
	ИначеЕсли Страница = Элементы.Страницы.ПодчиненныеЭлементы.ГруппаСчитываниеЗаменяемойКартыЛояльности Тогда
		ТекущийЭлемент = Элементы.ЗаменяемаяКарта;
	ИначеЕсли Страница = Элементы.Страницы.ПодчиненныеЭлементы.ГруппаУточнениеВторогоКодаКартыЛояльности Тогда
		Если ТипПервогоКодаНовойКарты = ПредопределенноеЗначение("Перечисление.ТипыКодовКарт.МагнитныйКод") Тогда
			ТекущийЭлемент = Элементы.ШтрихкодНовойКарты;
			Текст = НСтр("ru = 'Карта лояльности ""%1"" (Магнитный код: %2) является картой смешанного типа (имеет магнитный и штриховой коды).
			                   |Считайте при помощи сканера штрихкода или укажите вручную штрихкод карты.'");
		Иначе
			ТекущийЭлемент = Элементы.МагнитныйКодНовойКарты;
			Текст = НСтр("ru = 'Карта лояльности ""%1"" (Штрихкод: %2) является картой смешанного типа (имеет магнитный и штриховой коды).
			                   |Считайте при помощи считывателя магнитных карт или укажите вручную магнитный код карты.'");
		КонецЕсли;
		НадписьУточнениеВторогоКодаКартыЛояльности = СтрШаблон(Текст, ВидНовойКарты, ПервыйКодНовойКарты);
	ИначеЕсли Страница = Элементы.Страницы.ПодчиненныеЭлементы.ГруппаВводИнформацииОВладельцеКарты Тогда
		Если ТипНовойКарты = ПредопределенноеЗначение("Перечисление.ТипыКарт.Смешанная") Тогда
			Текст = НСтр("ru = 'Карта лояльности ""%1"" (%2: %3, %4: %5) является персонализированной.
			                   |Для завершения регистрации уточните информацию о владельце карты.'");
			НадписьВводИнформацииОВладельцеКарты = СтрШаблон(Текст, ВидНовойКарты, ТипПервогоКодаНовойКарты, ПервыйКодНовойКарты, ТипВторогоКодаНовойКарты, ВторойКодНовойКарты);
		Иначе
			Текст = НСтр("ru = 'Карта лояльности ""%1"" (%2: %3) является персонализированной.
			                   |Для завершения регистрации уточните информацию о владельце карты.'");
			НадписьВводИнформацииОВладельцеКарты = СтрШаблон(Текст, ВидНовойКарты, ТипПервогоКодаНовойКарты, ПервыйКодНовойКарты);
		КонецЕсли;
		Если ЗначениеЗаполнено(ЗаменяемаяКарта) Тогда
			НадписьВводИнформацииОВладельцеКарты = СтрШаблон(НСтр("ru = 'Заменяемая карта лояльности ""%1"" будет аннулирована.'"), ЗаменяемаяКарта)
			                                     + Символы.ПС + НадписьВводИнформацииОВладельцеКарты;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОбработатьПервыйКодНовойКартыНаКлиенте(Данные, ТипКода, Предобработка)
	
	ОчиститьСообщения();
	
	Результат = ОбработатьПервыйКодНовойКартыНаСервере(Данные, ТипКода, Предобработка);
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;
	
	Если НайденныеКартыЛояльностиСчитываниеНовойКартыЛояльности.Количество() > 1 Тогда
		ПерейтиНаСтраницу(Элементы.Страницы.ПодчиненныеЭлементы.ГруппаВыборНовойКартыЛояльности);
	ИначеЕсли НайденныеКартыЛояльностиСчитываниеНовойКартыЛояльности.Количество() = 1 Тогда
		ОбработатьВыборНовойКартыЛояльности(НайденныеКартыЛояльностиСчитываниеНовойКартыЛояльности[0]);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаСервере
Процедура УдалитьЗарегистрированнуюКартуЛояльности()
	
	УстановитьПривилегированныйРежим(Истина);
	КартаОбъект = НоваяКарта.ПолучитьОбъект();
	КартаОбъект.Удалить();
	
	НоваяКарта = Справочники.КартыЛояльности.ПустаяСсылка();
	
КонецПроцедуры

&НаСервере
Процедура ГотовоНаСервере()
	
	Если Не ЗначениеЗаполнено(НоваяКарта) Тогда
		ЗарегистрироватьКартуЛояльности(ЗаполнитьИнформациюОВладельцеКарты, Истина);
	Иначе
		ИзменитьДанныеПартнераКартыЛояльности();
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ЗаменяемаяКарта) Тогда
		КартыЛояльностиСервер.АннулироватьКартуЛояльности(ЗаменяемаяКарта);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДалееОбработчикОжидания()
	
	Далее(Команды["Далее"]);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьКартуПоУмолчаниюДляПартнера(Партнер)
	Возврат КартыЛояльностиСервер.ПолучитьКартуПоУмолчаниюДляПартнера(Партнер);
КонецФункции

&НаСервереБезКонтекста
Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита)
	
	Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита);
	
КонецФункции

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

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

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

ВыполняетсяЗакрытие = Ложь;

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

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