Показ только подарочных сертификатов с остаками в старой форме РМК. УНФ 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
А какой принцип не позволят писать оптимальные запросы?
оптимальные или идеальные? Принцип называется «не стоит экономить на спичках».
Оптимальные запросы стоят дороже, а окупится ли эффект? Труд программиста не бесплатен.
А на сколько «дороже» условие на измерение в виртуальной таблице, чем в секции ГДЕ? Желательно в конкретных денежных величинах
я пробовал сначала в ВТ, но там нельзя было использовать остаток, так что только снаружи.
По подарочному сертификату отбор можно было вынести внутрь, согласен, но не критично. Не заметил.
Исправление сейчас стоит минимум 15 минут * 3.000 в час = 3000 : 4 = 750 рублей (с проверкой на продакте)
Не думаю, что нужно напрягать клиента ради такой безделицы.
Это называется производственная халатность.
не драматизируй. лучшее враг хорошего.