Как добавить быстрый поиск по цене в подборе номенклатуры (РМК) в 1С:Управление торговлей 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В розничной торговле скорость обслуживания клиента имеет решающее значение. Часто возникает ситуация, когда кассиру в Рабочем месте кассира (РМК) необходимо оперативно найти товар по конкретной стоимости. Например, клиент просит пробить товар за 100 рублей, и кассиру нужно быстро вывести на экран всю номенклатуру с такой ценой, чтобы перенести ее в чек. Рассмотрим подробнее, как реализовать подобный функционал в конфигурации 1С:Управление торговлей 11, проанализируем штатные возможности и разберем варианты программной доработки.

Почему стандартная строка поиска не ищет по цене?

Многие пользователи интуитивно пытаются вбить цену прямо в стандартную верхнюю строку поиска (глобальный поиск по списку номенклатуры). Однако этот подход не дает результатов. Выясним причину такого поведения системы.

Дело в том, что глобальная строка поиска в 1С базируется на индексе полнотекстового поиска (ПТП) и ищет совпадения исключительно по строковым реквизитам справочника, таким как Наименование, Артикул или Штрихкод. Цена же не является реквизитом самого справочника номенклатуры. Это числовой показатель, который хранится в отдельном регистре сведений ЦеныНоменклатуры. В динамическом списке подбора цена вычисляется и присоединяется левым соединением (срез последних) по выбранному виду цены. Именно поэтому для поиска по цене всегда требуется отдельное поле и отдельный программный или пользовательский отбор.

Использование штатных отборов динамического списка

Если в конфигурацию нельзя вносить изменения, мы можем воспользоваться встроенными механизмами платформы. Разберем по шагам, как настроить отбор по цене вручную:

  1. В форме подбора номенклатуры перейдите в меню Еще и выберите пункт Настроить список.
  2. В открывшемся окне перейдите на вкладку Отбор.
  3. Найдите в доступных полях поле Цена и перенесите его в правую часть.
  4. Установите вид сравнения Равно (или В интервале, например, от 300 до 300) и укажите нужное значение.
  5. Нажмите Завершить редактирование.

Список мгновенно отфильтруется, и вы увидите только товары с заданной ценой. Однако этот метод имеет существенный недостаток для РМК: он требует слишком много кликов. При частой смене цен (например, сначала нужно найти товар за 500 рублей, а затем за 300 рублей) кассиру придется каждый раз заходить в настройки списка, что сильно замедляет обслуживание очереди.

Альтернативное решение: панель "Быстрые товары"

Проанализируем ситуацию с точки зрения бизнес-процесса. Если потребность искать товар по цене связана с форматом магазина "Все по 100 рублей" или продажей типовых услуг с фиксированной стоимостью, где кассиру нужно быстро пробить позицию на определенную сумму, логичнее использовать штатный механизм Панель быстрых товаров.

Вместо того чтобы искать товар среди тысяч позиций в справочнике, мы можем настроить специальные кнопки прямо на главном экране РМК:

  1. Создайте "служебную" номенклатуру (или выберите ходовые товары) со стоимостью 100, 300, 500 рублей.
  2. В настройках РМК добавьте эти позиции на панель быстрых товаров.
  3. Присвойте им горячие клавиши (например, Alt+1, Alt+2).

Теперь кассиру достаточно нажать одну кнопку на экране или комбинацию клавиш, чтобы товар нужной стоимости мгновенно оказался в чеке. Это полностью исключает необходимость сложного поиска.

Программная реализация быстрого поиска по цене через Расширения

Если специфика бизнеса все же требует наличия удобного поля ввода цены непосредственно в интерфейсе подбора, нам потребуется программная доработка. Правильнее всего реализовать ее через механизм Расширений, чтобы не снимать типовую конфигурацию с поддержки. Разберем реализацию подробнее.

Суть доработки заключается в добавлении нового поля на форму и программном управлении отбором динамического списка. Посмотрим на алгоритм действий:

  1. В расширении заимствуем форму подбора товаров в РМК (например, ФормаПодбораТоваров).
  2. Добавляем новый реквизит формы с именем ПоискПоЦене и типом Число.
  3. Выводим этот реквизит на форму в виде поля ввода, размещая его рядом со стандартной строкой поиска.
  4. Создаем обработчик события ПриИзменении для этого поля ввода.

В коде обработчика нам необходимо найти элемент отбора по полю "Цена" в компоновщике настроек динамического списка и установить для него введенное значение. Примерный код решения выглядит следующим образом:


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

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

Благодаря этому коду, как только кассир вводит число "100" и нажимает Enter, список автоматически фильтруется. Если поле очистить, отбор выключается, и отображается весь справочник.

Нюансы производительности при фильтрации

Рассмотрим важный технический аспект: производительность. Как мы обсуждали ранее, в УТ 11 цена присоединяется к динамическому списку левым соединением. Отбор по вычисляемому или присоединенному полю может существенно замедлить работу формы, особенно если номенклатурная база содержит сотни тысяч позиций.

Чтобы избежать "подвисаний" базы при вводе цены в наше новое поле, обязательно убедитесь, что:

  1. В регистре сведений ЦеныНоменклатуры установлены и актуальны все необходимые индексы баз данных.
  2. Сервер СУБД (SQL) регулярно обслуживается (обновление статистики, дефрагментация индексов).
  3. По возможности, объединяйте поиск по цене с выбором конкретной группы товаров (папки) — это значительно сократит объем данных, которые система обрабатывает при наложении соединения и отбора.

Применяя данные рекомендации, мы сможем создать удобный, быстрый и технически грамотный инструмент для работы кассира, полностью решающий задачу поиска товаров по их стоимости.

← На главную