Показ только подарочных сертификатов с остаками в старой форме РМК. УНФ 3.0

У клиента используется старая форма РМК (из чека):

При выборе подарочного сертификата показываются все номера подарочного сертификата.

Также можно выбрать сертификат через ввод текстом его номера.

Исправляю ситуацию. Запрещаю ввод текста и ограничиваю выбор сертификатов только теми, которые есть на остатках.

Проверяю:

В списке выбора показываются только доступные сертификаты:

Доступные сертификаты:
00000006
00000008
00000025
00000026
00000028
00000001
00000005
00000018
00000021
00000022
00000023

Доработка в форму Документ.ЧекККМ.ФормаОплаты:

&НаСервере
&Вместо("ПодготовитьСтруктуруВыбораСертификатаНаСервере")
Функция дппс_ПодготовитьСтруктуруВыбораСертификатаНаСервере(ИмяЭлемента)
	// Вставить содержимое метода.
	Результат = ПродолжитьВызов(ИмяЭлемента);   
	Результат.Вставить("ПоказыватьТолькоНаОстатках", истина);
	Возврат Результат;
КонецФункции


&НаСервере
&После("УстановитьДоступностьНомераСертификатаНаСервере")
Процедура дппс_УстановитьДоступностьНомераСертификатаНаСервере(ИмяЭлемента, ОчищатьНомер)
	
	Индекс = 0;      
	Пока Истина Цикл
		//Запрещаем подбор сертификата в поле ввода через ввод текста и быстрый выбор
		ТекИмяЭлемента = "НомерСертификата_" + XMLСтрока(Индекс);
		Элемент = ЭтаФорма.Элементы.Найти(ТекИмяЭлемента);
		Если Элемент = Неопределено Тогда
			Прервать;
		КонецЕсли;
		Элемент.БыстрыйВыбор = ложь;
		Элемент.РедактированиеТекста = ложь;
		Индекс = Индекс + 1;
	КонецЦикла;

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

Событие УстановитьДоступностьНомераСертификатаНаСервере вызывается после динамического добавления поля подарочного сертификата. Там я обрабатываю все поля ввода номеров подарочных сертификатов.

Использую свой параметр ПоказыватьТолькоНаОстатках для формы выбора сертификатов.

Доработка в форму Справочник.СерииНоменклатуры.ФормаВыбора:

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

Хотел использовать исключение для чтения стека вызова, чтобы определять, что форма выбора вызывается из РМК, но показывало только такой стек:

{ДоработкиПоПодарочнымСертификатам Справочник.СерииНоменклатуры.Форма.ФормаВыбора.Форма(7)}:ВызватьИсключение "";

[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ИсключениеВызванноеИзВстроенногоЯзыка]

В остальном все довольно просто — получаю доступные подарочные сертификат (в УНФ это номенклатура + серийный номер) и ограничиваю список.

Среда: УНФ 3.0.6.200 Платформа: 8.3.24.1548

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 6

  1. rzd:

    А какой принцип не позволят писать оптимальные запросы?

    • оптимальные или идеальные? Принцип называется «не стоит экономить на спичках».
      Оптимальные запросы стоят дороже, а окупится ли эффект? Труд программиста не бесплатен.

      • rzd:

        А на сколько «дороже» условие на измерение в виртуальной таблице, чем в секции ГДЕ? Желательно в конкретных денежных величинах

        • я пробовал сначала в ВТ, но там нельзя было использовать остаток, так что только снаружи.
          По подарочному сертификату отбор можно было вынести внутрь, согласен, но не критично. Не заметил.
          Исправление сейчас стоит минимум 15 минут * 3.000 в час = 3000 : 4 = 750 рублей (с проверкой на продакте)
          Не думаю, что нужно напрягать клиента ради такой безделицы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *