Показывать день рождения в РМК

2022-03-28

Во время работы кассира в РМК, кассир имеет возможность отсканировать или выбрать карту клиента. При этом в РМК отобразятся фамилия и инициалы клиента и изменится сумма скидок, конечно если они настроены.
В 1с Рознице, имеется возможность настроить индивидуальные скидки в день рождения. И это очень важно, т.к. клиент, получив скидку, больше чем рассчитывал, обязательно это запомнит и вернется снова.
Это конечно хорошо, но кассир увидя скидку большую чем положено, может подумать что это какая-то ошибка, и начнет выяснять причины, покупка затянется и клиент может уйти недовольным. Поэтому нужно настроить информирование кассира о том, что у клиента сегодня день рождения, и в этом случае кроме того, что покупатель получит дополнительную скидку, он еще получит поздравления от кассира и хорошее настроение.

Название скидки в РМК просто ФИО

Как видно, при выборе дисконтной карты надпись "Скидка" становится зеленой и появляется Фамилия и инициалы(берется из справочника Физические Лица), вот сюда и нужно добавить день рождения, который также указан в справочнике Физические Лица.

Делать будем через расширения конфигурации. Изменяемый объект это форма обработки РМКУправляемыйРежим.
За изменение надписи "Скидка" отвечает процедура "ОбновитьТекстПроСкидку", но выполняется она на клиенте и получить данные из справочника физлиц не получится. Зато, у объекта есть реквизит "ДатаРождения", когда он заполняется непонятно, поэтому можно его использовать, нужно только найти где его изменить.
После поисков, я пришел к процедуре "СменитьВладельцаКарты", она выполняется на сервере, и вызывается как раз после выбора дисконтной карты покупателя.

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

&НаКлиенте
&Вместо("ОбновитьТекстПроСкидку")
Процедура ДР_ОбновитьТекстПроСкидку()
	Текст = Строка(Объект.ВладелецДисконтнойКарты) + " " + Формат(Объект.ДатаРождения, "ДЛФ=D");
	РозничныеПродажиКлиент.ОбновитьТекстПроСкидку(Объект.ДисконтнаяКарта, Текст, Элементы);
КонецПроцедуры

Здесь в процедуру "СменитьВладельцаКарты" добавилась одна строка - Объект.ДатаРождения = ВладелецКарты.ДатаРождения;
А в процедуре "ОбновитьТекстПроСкидку", мы отправляем Текст с ФИО и датой рождения вместо "Объект.ВладелецДисконтнойКарты".

Название скидки в РМК ФИО и День рождения

Теперь при продаже кассир может видеть дату рождения клиента.
На этом можно закончить, но для полного комфорта, кассиру желательно еще и указать что день рождения именно сегодня, для этого желательно выделить надпись другим цветом и сделать ее немного крупнее.

Это делается не совсем просто, в модуле "РозничныеПродажиКлиент" Процедура ОбновитьТекстПроСкидку. Нужно вычленить дату из текста скидки, преобразовать ее, сравнить с текущей датой и после этого настроить внешний вид.

&Вместо("ОбновитьТекстПроСкидку")
Процедура ДР_ОбновитьТекстПроСкидку(ДисконтнаяКарта, ВладелецДисконтнойКарты, Элементы)
	ШрифтЗаголовка = Элементы.СуммаДокументаБезСкидок.ШрифтЗаголовка;
	ЦветТекстаЗаголовка = Новый Цвет();
	ВладелецСкидки = "";
	ЗаголовокСкидки = НСтр("ru = 'Скидка'");
	Если ЗначениеЗаполнено(ДисконтнаяКарта) Тогда
		ЗаголовокСкидки = НСтр("ru = 'Скидка: %1'");
		ЦветТекстаЗаголовка = WebЦвета.Зеленый;
		п = СтрДлина(ВладелецДисконтнойКарты);
		Пока п>0 Цикл
      		Симв=Сред(ВладелецДисконтнойКарты,п,1);
      			Если Симв>="0" И Симв<="9" ИЛИ Симв="." Тогда
        		 ДР=Строка(Симв)+Строка(ДР);
			 ИначеЕсли Симв=" " Тогда
				 Прервать;
			 КонецЕсли;
			п=п-1;
		КонецЦикла; 
		ДР = СтроковыеФункцииКлиентСервер.СтрокаВДату(ДР);	
		Если Формат(НачалоДня(ТекущаяДата()),"ДФ=dd.MM") = Формат(ДР,"ДФ=dd.MM") Тогда  
			ШрифтЗаголовка = Новый Шрифт("Impact",12);
		КонецЕсли;
		ВладелецСкидки = ДисконтнаяКарта;
		Если ЗначениеЗаполнено(ВладелецДисконтнойКарты) Тогда
			ВладелецСкидки = ВладелецДисконтнойКарты;
		КонецЕсли;
		ЗаголовокСкидки = СокрЛП(СтрШаблон(ЗаголовокСкидки, ВладелецСкидки));
	КонецЕсли;	
	Элементы.СуммаСкидки.Заголовок = ЗаголовокСкидки;
	Элементы.СуммаСкидки.ЦветТекстаЗаголовка = ЦветТекстаЗаголовка;
	Элементы.СуммаСкидки.ШрифтЗаголовка = ШрифтЗаголовка; 
КонецПроцедуры
Выделение надписи если сегодня день рождения

По невыясненым причинам, при изменении цвета шрифта на любой кроме зеленого, или же изменение цвета рамки, влечет за собой непонятное поведение формы каждые несколько секунд вызывается процедура "ОбновитьФормуНаКлиенте". Происходит постоянное обновление формы, и работать становится невозможно.
В результате, выделить то, что у клиента сегодня день рождения можно только изменив шрифт заголовка, цвет поменять нельзя.

Расширение скачать можно здесь, писалось для 1С:Розница 2.3