Подбор в РМК Розница 1.0

1. pawonex 6 21.06.13 09:31 Сейчас в теме
Доброго всем времени, хочу организовать поиск по цене в РМК Розница 1 при включение режима подбора. Точнее даже сделать фильтр по списку номенклатуры. Смысл такой:
Сделать поле для ввода строки поиска. две кнопки поиск и очистить.
Чтобы при нажатии на кнопку поиск в списке товаров отображались только товары с заданной в строке поиска ценой.
Ну и за раз добавить такой поиск по остальным полям.

В данный момент не могу даже найти где посмотреть форму РМК, где вообще открывается список при нажатии кнопки подбор в РМК.

Любой информации буду благодарен!!!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Dos_1985 21.06.13 10:02 Сейчас в теме
(1) pawonex, ИЩИ В документе ЧекККМ, ФормаРегистрации продаж. Через меню на главной панели ищешь Форма - Список элементов управления формы. Там все объекты, которы на диалог выводятся. то что ты ищешь скорее всего назвается ПанельПодборБыстрыеТовары - подбор
JohnConnor; pawonex; +2 Ответить
3. pawonex 6 21.06.13 17:15 Сейчас в теме
(2) Да спасибо!!!! То че надо=) Буду разбираться дальше!
4. pawonex 6 28.06.13 10:36 Сейчас в теме
Подскажите пожалуйста как правильно сделать отбор в табличной части Товары.
Перерыл кучу инфы, ни как не могу разобраться..

Пытаюсь для начала сделать отбор по артикулу.

Прочитал что в динамическом списке отбор надо делать следующим образом:

	Товар = ЭлементыФормы.Товары.ТекущиеДанные.Артикул;

	Отбор = ЭлементыФормы.Товары.ОтборСтрок.Артикул;

	Если Отбор.Найти("Артикул") = Неопределено Тогда
            Отбор.Добавить("Артикул");
	КонецЕсли;

	Отбор["Артикул"].Значение = Товар;
	Отбор["Артикул"].ВидСравнения = ВидСравнения.Содержит;
	Отбор["Артикул"].Использование = Истина;
Показать


Ругается так:

{Документ.ЧекККМ.Форма.ФормаРегистрацииПродаж.Форма(280)}: Значение не является значением объектного типа (Артикул)
Товар = ЭлементыФормы.Товары.ТекущиеДанные.Артикул;


Подскажите что делаю не так и как вообще правильно сделать отбор.

Цель такая сделать чтобы в Табличной части "Товары" в РМК, по нажатию кнопки Искать, отбирались товары содержащие строку указанную в Строке поиска.
5. CnupT 70 28.06.13 11:05 Сейчас в теме
(4) pawonex, так ведь в Рознице 1 уже реализован данный механизм. Поиск по практически любому реквизиту, плюс поиск "Везде". Самый красивый вариант, на мой взгляд, это добавить пункт в список полей для поиска "Цена". И в той процедуре, которая обрабатывает поиск по тому или иному реквизиту, написать что-то в роде
Если РеквизитПоиска = "Цена" Тогда
 /// Лезем в РС ЦеныНоменклатурыВМагазине, ищем там нужную цену, выводим требуемые колонки
Иначе
 /// Типовой код, уже написанный для остальных реквизитов
КонецЕсли; 


Благодаря такому способу Розница все сделает за тебя, при условии, что твой запрос будет выдавать результат по структуре идентичный тому, что она получает для штатных реквизитов поиска.
6. Sherdrada 28.06.13 15:03 Сейчас в теме
(5) CnupT, а как в Рознице 1 в РМК при подборе делать поиск по наименованию и артикулу? при подборе открывается список товаров, но они в иерархии и поиск по наименованию не работает
7. pawonex 6 29.06.13 13:01 Сейчас в теме
(5) Дак а в РМК то вообще по умолчанию нету поиска=(
10. pawonex 6 03.07.13 08:43 Сейчас в теме
Все ломаю голову как реализовать=)
(5) Понял о чем ты говорил и решил сделать именно так, добавляю поиск по цене в ОбщийМодуль.УправлениеНоменклатурой

Вот как сделал:
Функция НайтиПоЦене(Наименование, ТекДата, Список = Неопределено) Экспорт
	
	Если Не ТипЗнч(Список) = Тип("СписокЗначений") Тогда
		Результат = Новый СписокЗначений;
	Иначе
		Результат = Список;
	КонецЕсли;
	
	Запрос = Новый Запрос;	
	
	Запрос.Текст = "ВЫБРАТЬ
	                |	ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура.Ссылка
	                |ИЗ
	                |	РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних КАК ЦеныНоменклатурыМагазиновСрезПоследних
	                |ГДЕ
	                |	ЦеныНоменклатурыМагазиновСрезПоследних.Период = &Период
	                |	И ЦеныНоменклатурыМагазиновСрезПоследних.Цена = &Цена";
				//Параметры запроса
				Запрос.УстановитьПараметр("Период","%"+ТекДата+"%");// Дата
				Запрос.УстановитьПараметр("Цена", "%"+Наименование+"%");// Число
	
	РезультатЗапроса = Запрос.Выполнить();
	ТЗ = РезультатЗапроса.Выгрузить();
	
	Результат.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("Ссылка"));

	Возврат Результат;
	
КонецФункции
Показать


Основной вопрос на сколько верно я сделал запрос?

На данный момент ощибка такая:

{ОбщийМодуль.УправлениеНоменклатурой.Модуль(174)}: Ошибка при вызове метода контекста (ВыгрузитьКолонку)
	Результат.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("Ссылка"));
по причине:
Недопустимое значение параметра (параметр номер '1') (Колонка не принадлежит коллекции)



Подскажите где накосячил=)
12. Sherdrada 03.07.13 08:49 Сейчас в теме
(10) pawonex,
 Запрос.Текст = "ВЫБРАТЬ
                   |   ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура.Ссылка
                   |ИЗ
                   |   РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних КАК ЦеныНоменклатурыМагазиновСрезПоследних
                   |ГДЕ
                   |   ЦеныНоменклатурыМагазиновСрезПоследних.Период = &Период
                   |   И ЦеныНоменклатурыМагазиновСрезПоследних.Цена = &Цена";


попробуй

 |   ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура.Ссылка как Ссылка


Хотя я не уверена, что дело в этом
8. Nevskiy 29.06.13 13:09 Сейчас в теме
(4)

{Документ.ЧекККМ.Форма.ФормаРегистрацииПродаж.Форма(280)}: Значение не является значением объектного типа (Артикул)
Товар = ЭлементыФормы.Товары.ТекущиеДанные.Артикул;


Попробуй

Товар = ЭлементыФормы.Товары.ТекущиеДанные.НОМЕНКЛАТУРА.Артикул;
9. pawonex 6 29.06.13 19:48 Сейчас в теме
11. dmt 66 03.07.13 08:49 Сейчас в теме
Вижу такие косяки:

Заменить
Результат.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("Ссылка"));
на это
Результат.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("НоменклатураСсылка"));


Параметр цена, почему-то "наименование"???
13. pawonex 6 03.07.13 12:28 Сейчас в теме
(11) Наименование передается в функцию, по умолчанию решил не отходить от стандартов=)
Поменял как ты написал теперь на строку:
ТаблицаПодборКлавиши.Отбор.Ссылка.Значение = ТекущаяНадпись;

вот что говорит:
{Документ.ЧекККМ.Форма.ФормаРегистрацииПродаж.Форма(313)}: Ошибка при установке значения атрибута контекста (Значение)
		ТаблицаПодборКлавиши.Отбор.Ссылка.Значение = ТекущаяНадпись;
по причине:
Неверный тип значения


(12) Там в стандартных функциях так же запрос написан
"ВЫБРАТЬ
	|	Номенклатура.Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Артикул ПОДОБНО &Наименование"

Поэтому так и оставил, и я запрос в конструкторе собирал, он мне так написал=)


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

Но не могу разобраться как переделать его так чтобы он возвращал так же список ссылок а не список номенклатуры,если я правильно конечно понимаю суть этого запроса=)
Переделывал его по ЦеныНоменклатурыМагазинов. как будто бы запрос проходит. но из функции возвращается не правильный формат. Вот о том чем я говорил, как его переделать так чтобы он вернул такой же формат как в запросе поиска по артикулу:
Запрос.Текст = "ВЫБРАТЬ
	|	Номенклатура.Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Артикул ПОДОБНО &Наименование"
14. pawonex 6 05.07.13 08:04 Сейчас в теме
В общем вот к чему пришел, сделал запрос в отладчике запросов. В отладчике все благополучно работает=) В итоге получилась такая функция для поиска.

Функция НайтиПоЦене(Цена, ТекДата, ТекМагазин, Список = Неопределено) Экспорт
	
	Если Не ТипЗнч(Список) = Тип("СписокЗначений") Тогда
		Результат = Новый СписокЗначений;
	Иначе
		Результат = Список;
	КонецЕсли;
	
	Запрос = Новый Запрос;	
	
	Запрос.Текст = "ВЫБРАТЬ
	|	ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура.Ссылка
	|ИЗ
	|	РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних(&Дата, Цена = &Цена 
	|	И ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ (Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) 
	|	И Магазин В (&Магазин)) КАК ЦеныНоменклатурыМагазиновСрезПоследних 
	|";
				//Параметры запроса
				Запрос.УстановитьПараметр("Дата","%"+ТекДата+"%");// Дата
				Запрос.УстановитьПараметр("Цена", "%"+Цена+"%");// Число
				Запрос.УстановитьПараметр("Магазин", "%"+ТекМагазин+"%");// Число
				
	РезультатЗапроса = Запрос.Выполнить();
	ТЗ = РезультатЗапроса.Выгрузить();
	
	Результат.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("Ссылка"));

	Возврат Результат;
	
КонецФункции
Показать


Далее вызываю с формы РМК вот так:

Процедура КнопкаПоискНажатие(Элемент)


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



И вот как ругаецо:

{ОбщийМодуль.УправлениеНоменклатурой.Модуль(172)}: Ошибка при вызове метода контекста (Выполнить)
	РезультатЗапроса = Запрос.Выполнить();
по причине:
{(4, 2)}: Ошибка обработки представления "РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних:Несоответствие типов (Параметр номер ""1"")"
<<?>>РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних(&Дата, Цена = &Цена


Подскажите пожалуйста, что сейчас не так?
15. copybases 68 09.07.13 09:45 Сейчас в теме
(14) pawonex, попробуйте убрать проценты в Запрос.УстановитьПараметр: оставьте просто ТекДата, Цена и ТекМагазин.
17. pawonex 6 09.07.13 10:05 Сейчас в теме
(15)А спасибо!!! ХЗ точно это помогло или нет не могу сказать, я просто еще вчера попробовал так сделать=) А щас доделал " ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура.Ссылка КАК Ссылка" и все прошло=)))(11)Спасибо, я как раз из-за твоего поста обратил внимание на то что нужно ставить "как ссылка"=)))

Щас оттестирую и выложу готовое решение=)
16. пользователь 09.07.13 10:00
Сообщение было скрыто модератором.
...
18. pawonex 6 09.07.13 11:49 Сейчас в теме
Для начала откроем конфигуратор.
1. Откроем конфигурацию : Конфигурация-Открыть Конфигурацию
2. Открываем Общие модули-УправлениеНоменклатурой Ищем функции Функция НайтиПоАртикулу, НайтиПоКоду и т.д.
Добавляем ниже
Функция НайтиПоЦене(Цена, ТекДата, ТекМагазин, Список = Неопределено) Экспорт
    
    Если Не ТипЗнч(Список) = Тип("СписокЗначений") Тогда
        Результат = Новый СписокЗначений;
    Иначе
        Результат = Список;
    КонецЕсли;
    
    Запрос = Новый Запрос;    
    
    Запрос = Новый Запрос();
    Запрос.УстановитьПараметр("Магазин", ТекМагазин);
    Запрос.УстановитьПараметр("Период", ТекДата);
    Запрос.УстановитьПараметр("Цена", Цена);
    Запрос.Текст = "ВЫБРАТЬ
    |    ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних(&Период, Цена = &Цена И ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ (Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) И Магазин В (&Магазин)) КАК ЦеныНоменклатурыМагазиновСрезПоследних     
    |";
                            
    РезультатЗапроса = Запрос.Выполнить();
    ТЗ = РезультатЗапроса.Выгрузить();
    
    Результат.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("Ссылка"));

    Возврат Результат;
    
КонецФункции
Показать


3. Откроем Справочники-Номенклатура-Формы-ФормаСписка, копируем поле поиска и кнопки поиск и очистить.
4. Сама форма РМК Кассира находится в Документы-ЧекККМ-Формы-ФормаРегистрацииПродаж, заходим туда, вставляем куда нужно скопированные поле поиска и кнопки.
Переименовываем вставленные элемент, для этого правой кнопкой по любому элементу и выбираем свойства:
После поиска - ПолеПоискаТовары
Кнопка Искать - КнопкаПоиск
Кнопка Очистить - КнопкаОчиститьПоиск
5. У каждого элемента в свойствах в самом низу списка есть События. Для кнопок на нажитие пишем следующиее:
Кнопка поиска:
Процедура КнопкаПоискНажатие(Элемент)


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


На кнопку очистить:
Процедура КнопкаОчиститьПоискНажатие(Элемент)
    
    ПолеПоискаТовары = "";
    ТаблицаПодборКлавиши.Отбор.Сбросить();
    ЭлементыФормы.ТаблицаПодборКлавиши.Свернуть(Справочники.Номенклатура.ПустаяСсылка());
    ЭлементыФормы.ТаблицаПодборКлавиши.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;
    
КонецПроцедуры


Собственно вот и все, компилируем (F5) и в интерфейса кассира не забудьте открыть поле с подбором (Правда панель-Подбор либо F)
Если будет необходимо сделать поиск по Артикулу то нужно вместо
СписокОтбора = УправлениеНоменклатурой.НайтиПоЦене(ОбщегоНазначения.ПривестиСтрокуКЧислу(ТекущаяНадпись, Истина), ТекущаяДата(), Магазин);

написать
СписокОтбора = УправлениеНоменклатурой.НайтиПоАртикулу(ТекущаяНадпись);
Для поиска по всем полям:
СписокОтбора = УправлениеНоменклатурой.НайтиВезде(ТекущаяНадпись);

Спасибо большое: Dos_1985,CnupT,dmt,Sherdrada,copybases
19. summer1980 14.05.14 01:15 Сейчас в теме
Доброе время суток. Все сдалал как написано, все работает, вот только в отбор попадают товары с другими ценами, точенее товары которые когда либо стоили указанную цену.
20. pawonex 6 14.05.14 10:16 Сейчас в теме
19. Да есть такая проблемка;) чем вызвана пока не разбирался, продавцы и тем что есть довольны, но нужно все равно решать. Какие есть варианты?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот