Данная доработка направлена на исключение лишних телодвижений при фильтрации товара по цене и скрытия товара без остатков.
Готового решения не нашел, поэтому решил допилить самостоятельно.
Расширение сделано для конфигурации "Розница для Беларуси, редакция 2.2".
Часть материала взята отсюда //infostart.ru/public/122253/ часть не помню откуда, остальное сам.
Добавляем Расширение конфигурации.
В него копируем интересующую нас форму подбора и создаем процедуру при Открытии в которой указываем вызов процедуры для создания поля формы:
Процедура РасшРМКпоискПоЦене_ПриОткрытииПосле(Отказ)
СоздатьПолеНаСервере();
КонецПроцедуры
Добавляем саму процедуру создания поля:
Процедура СоздатьПолеНаСервере()
//Добавляем реквизит
нРеквизиты = Новый Массив;
КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Неотрицательный);
РеквизитПоиск = Новый РеквизитФормы("ПоискПоЦене", Новый ОписаниеТипов("Число",КвалификаторыЧисла), , "Поиск по цене", Истина);
нРеквизиты.Добавить(РеквизитПоиск);
ИзменитьРеквизиты(нРеквизиты);
//Добавляем поле ввода
Элемент = ЭтаФорма.Элементы.Добавить("ПоискПоЦене", Тип("ПолеФормы"), ЭтаФорма.Элементы.ГруппаПоиска);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = "ПоискПоЦене";
Элемент.Заголовок="Найти по цене";
Элемент.Подсказка="(для отключения введите '0' и [Enter])";
Элемент.УстановитьДействие("ПриИзменении", "НайтиПоЦене");
КонецПроцедуры
Процедура, отключающая отбор
если он уже использовался ранее
Процедура ОтключитьОтборПоПолюКомпоновки(Имя)
Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Имя) Тогда
ЭлементОтбора.Использование = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
и установки отбора заново
Процедура УстановитьОтборПоПолюКомпоновки(Имя,Значение,ВидСравнения,Булв)
ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Имя);
ЭлементОтбора.ВидСравнения = ВидСравнения;
ЭлементОтбора.ПравоеЗначение = Значение;
ЭлементОтбора.Использование = Булв;
КонецПроцедуры
Затем собственно саму процедуру, установленную для поля ПриИзменении:
Процедура НайтиПоЦене()
ЧтоИскать=Число(ЭтаФорма.Элементы.ГруппаПоиска.ПодчиненныеЭлементы.ПоискПоЦене.ТекстРедактирования);
ЕстьОтбор = Истина;
ДоступноеПоле = КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("РозничнаяЦена").Поле;
ОтключитьОтборПоПолюКомпоновки(ДоступноеПоле);// отключаем отбор если он был уже использован
Если НЕ Число(ЧтоИскать)=0 Тогда
ВС = ВидСравненияКомпоновкиДанных.Равно;
Исп = Истина;
УстановитьОтборПоПолюКомпоновки(ДоступноеПоле,ЧтоИскать,ВС,Исп);// и устанавливаем отбор наново
КонецЕсли;
ВыполнитьРасширенныйПоискПоСКД(); //вызов процедуры из формы подбора в самой конфигурации
КонецПроцедуры
Аналогично поступаем с отключением нулевых остатков.
создаем:
Процедура СоздатьПолеНаСервере()
//Добавляем реквизит
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
РеквизитФлаг = Новый РеквизитФормы("НольНеПоказывать", Новый ОписаниеТипов("Булево"), , "Ноль не показывать", Истина);
нРеквизиты.Добавить(РеквизитФлаг);
ИзменитьРеквизиты(нРеквизиты);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Добавляем флажок
Флаг = ЭтаФорма.Элементы.Добавить("НольНеПоказывать", Тип("ПолеФормы"), ЭтаФорма.Элементы.ГруппаПоиска);
Флаг.Вид = ВидПоляФормы.ПолеФлажка;
Флаг.ПутьКДанным = "НольНеПоказывать";
Флаг.Заголовок="Только с остатками";
Флаг.Подсказка="(для услуг отключить)";
Флаг.УстановитьДействие("ПриИзменении", "СкрытьНулевыеОстатки");
КонецПроцедуры
и дописываем процедуру действия ПриИзменении:
Процедура СкрытьНулевыеОстатки()
ПолеПоиска = "";
ЕстьОтбор = Истина;
ДоступноеПоле = КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("ОстатокПоМагазину").Поле;
ВС = ВидСравненияКомпоновкиДанных.Больше;
Исп=ЭтаФорма.НольНеПоказывать;
ОтключитьОтборПоПолюКомпоновки(ДоступноеПоле);
УстановитьОтборПоПолюКомпоновки(ДоступноеПоле,0,ВС,Исп);
ВыполнитьРасширенныйПоискПоСКД();
КонецПроцедуры
Добавляем в ПриОткрытии:
Процедура РасшРМКпоискПоЦене_ПриОткрытииПосле(Отказ)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ЭтаФорма.НольНеПоказывать=Истина;//если чаще подбор услуг то не надо
СкрытьНулевыеОстатки();
КонецПроцедуры
P.S. Если кому очень надо вышлю на e-mail, Viber. Skype или Почтой :-), напишите в комментах или в личку куда!?
Добавил квалификатор числа, в поле ПоискПоЦене, так как в версиях 1с отличных от 8.3.10.2580, невозможно было искать товар с ценой меньше 1 (точнее можно, но задом наперед: 12-> ,12 -> 0,12).
КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Неотрицательный);
РеквизитПоиск = Новый РеквизитФормы(«ПоискПоЦене», Новый ОписаниеТипов(«Число»,КвалификаторыЧисла), , «Поиск по цене», Истина);