Имя: Пароль:
1C
1С v8
Расширение РМК на Розница 8. Аптека 2.2
0 ЗаЧтоМнеВсеЭто
 
05.10.19
04:47
Доброго времени суток. С разработкой в 1С столкнулся впервые, но выбора особо нет, так что приходится шаманить. Буду рад любой помощи)

Задача следующая. Родная форма подбора товара РМК довольно скудная и возникла необходимость добавить хотя бы поиск по цене и фильтр по остатку без использования расширенного поиска. На просторах я нашел довольно подробную статью по реализации подобного. Суть там в добавлении расширения на оную форму с созданием ряда процедур:

<pre>
&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
    СоздатьПолеНаСервере();
    ЭтаФорма.НольНеПоказывать=Истина;//если чаще подбор услуг то не надо
    СкрытьНулевыеОстатки();
КонецПроцедуры


Процедура СоздатьПолеНаСервере()
    //Добавляем реквизит
    нРеквизиты = Новый Массив;
    КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Неотрицательный);
    РеквизитПоиск = Новый РеквизитФормы("ПоискПоЦене", Новый ОписаниеТипов("Число",КвалификаторыЧисла), , "Поиск по цене", Истина);
    нРеквизиты.Добавить(РеквизитПоиск);
    РеквизитФлаг = Новый РеквизитФормы("НольНеПоказывать", Новый ОписаниеТипов("Булево"), , "Ноль не показывать", Истина);
    нРеквизиты.Добавить(РеквизитФлаг);     
    ИзменитьРеквизиты(нРеквизиты);
    //Добавляем поле ввода
    Элемент = ЭтаФорма.Элементы.Добавить("ПоискПоЦене", Тип("ПолеФормы"), ЭтаФорма.Элементы.ГруппаПоиска);
    Элемент.Вид = ВидПоляФормы.ПолеВвода;
    Элемент.ПутьКДанным = "ПоискПоЦене";  
    Элемент.Заголовок="Найти по цене";
    Элемент.Подсказка="(для отключения введите '0' и [Enter])";
    Элемент.УстановитьДействие("ПриИзменении", "НайтиПоЦене");
    Флаг = ЭтаФорма.Элементы.Добавить("НольНеПоказывать", Тип("ПолеФормы"), ЭтаФорма.Элементы.ГруппаПоиска);
    Флаг.Вид = ВидПоляФормы.ПолеФлажка;
    Флаг.ПутьКДанным = "НольНеПоказывать";  
    Флаг.Заголовок="Только с остатками";
    Флаг.Подсказка="(для услуг отключить)";  
    Флаг.УстановитьДействие("ПриИзменении", "СкрытьНулевыеОстатки");
    Флаг.Доступность=Ложь;
КонецПроцедуры


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



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



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



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




&НаКлиенте
Процедура Расш1_ПолеПоискаОкончаниеВводаТекстаПосле(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
    СкрытьНулевыеОстатки();
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ПолеПоискаПриИзмененииПосле(Элемент)
    СкрытьНулевыеОстатки();
КонецПроцедуры
</pre>

Работает все кроме переключения флага НольНеПоказывать. То бишь при его первом переключении на истину фильтр включается корректно, но при выключении система сначала весьма долго прогружает результат, после чего фильтр не выключается, а долгая прогрузка повторяется при каждом переключении активной позиции. Подозреваю, что проблема в отработки сочетания процедур ОтключитьОтборПоПолюКомпоновки и УстановитьОтборПоПолюКомпоновки, но не могу понять причины, поскольку они обе используется и в НайтиПоЦене - с этой процедурой все нормально.
1 Garykom
 
гуру
05.10.19
05:30
Как то у тебя все слишком сложно, можно намного проще
https://i.paste.pics/c015e5fd49322a84460772c16538e80a.png
2 ЗаЧтоМнеВсеЭто
 
05.10.19
13:28
(1) Как я и написал выше, с разработкой в 1С сталкиваюсь впервые. По этой причине не совсем понимаю суть представленного скриншота. Намного проще в каком смысле? Полагаю, вы скинули пример вообще полной замены конфигурационной формы подбора товаров на разработанную. Нечто похожее на такой "Прайс-лист" я нашел лишь в одноименном отчете конфигурации. С него, как я понимаю, и взята СКД для этой формы. Если я заблуждаюсь, поправьте пожалуйста.
3 Garykom
 
гуру
05.10.19
16:13
(2) Угу проще свою форму подбора сделать, там кода минимум.
И вызывать ее вместо типовой по F11, назад она возвращает тоже что и типовая.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший