Как в «1С:Розница» автоматически пересчитывать количество (вес) при вводе суммы («взвесьте на 100 рублей»)?

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

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

В этой статье мы подробно разберем, почему разработчики фирмы «1С» заложили именно такую логику, какие стандартные организационные и технические методы позволяют обойти это ограничение, и как программно реализовать автоматический пересчет количества через расширение конфигурации или внешнюю обработку.

Почему в типовой конфигурации нет этой функции?

Давайте проанализируем математическую и складскую логику платформы «1С:Предприятие». В любой товароучетной системе заложена строгая иерархия расчетов: Количество × Цена = Сумма. Первичным в учете всегда является физический объем товара (в штуках, литрах или килограммах). Программа обязана списать со склада строго определенное количество физического остатка.

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

Вариант 1. Использование весов с печатью этикеток (Offline) без доработки системы

Рассмотрим самый популярный индустриальный метод, который не требует изменения кода программы. На торговой точке устанавливаются электронные весы с возможностью печати этикеток (работающие в режиме Offline). В такие весы из 1С предварительно выгружается база товаров с их ценами и кодами PLU.

Процесс продажи выглядит следующим образом:

  1. Продавец насыпает товар на весы и вводит код PLU на клавиатуре весов.
  2. На дисплее весов отображается текущий вес, цена за килограмм и итоговая стоимость.
  3. Продавец добавляет или убирает товар до тех пор, пока стоимость на экране весов не приблизится к желаемым 100 рублям.
  4. Нажимается кнопка печати — весы выдают этикетку со штрихкодом EAN-13, в котором зашифрованы код товара и его точный вес (например, 0,352 кг).
  5. Кассир на кассе считывает штрихкод сканером. Программа 1С автоматически декодирует вес, подставляет его в поле Количество, умножает на цену из базы и получает искомую сумму.

Вариант 2. Использование встроенного калькулятора 1С

Если покупка оборудования не планируется, а дорабатывать программу нельзя (например, у вас базовая версия конфигурации), разберем простейший алгоритм работы кассира с помощью платформенных средств. Вместо использования смартфона или физического калькулятора можно задействовать встроенный калькулятор «1С»:

  1. При заполнении строки чека кассир активирует поле ввода количества.
  2. Нажатием клавиши F15 (или комбинацией клавиш в зависимости от настроек операционной системы) вызывается встроенный калькулятор платформы.
  3. Кассир вводит целевую сумму (например, 100), делит ее на цену за килограмм (например, 280) и нажимает клавишу Enter.
  4. Полученное точное значение (0.357) автоматически подставляется в поле Количество.

Вариант 3. Создание внешней обработки табличной части (для документов)

Для документов («Реализация товаров», «Поступление товаров», «Чек ККМ» в режиме обычного документа) можно решить задачу без изменения типовой конфигурации и без снятия ее с поддержки. Для этого мы можем написать внешнюю обработку заполнения табличной части.

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

Приведем пример программного кода, который должен содержаться в модуле внешней обработки:


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

КонецПроцедуры

Этот способ идеален для оптовой и мелкооптовой торговли, но для быстрого обслуживания в интерфейсе РМК (Рабочего места кассира) он не очень удобен, так как требует совершения лишних кликов мышью.

Вариант 4. Разработка расширения конфигурации для РМК

Если нам требуется автоматизировать именно рабочее место кассира (РМК), то лучшим современным решением будет создание расширения конфигурации. Это позволит сохранить конфигурацию на поддержке и без проблем устанавливать обновления от фирмы «1С».

Проанализируем задачу. Нам необходимо, чтобы при изменении поля Сумма в интерфейсе РМК система не рассчитывала ручную скидку, а пересчитывала количество. Для этого мы перехватим событие изменения поля суммы на форме РМК.

Разберем по шагам создание такого расширения:

  1. Создаем новое расширение в конфигураторе и добавляем в него форму РМК (обычно это форма ФормаРМК или аналогичная в зависимости от редакции программы).
  2. Находим на форме элемент управления, связанный с вводом суммы строки, и переносим его событие ПриИзменении в модуль расширения с аннотацией &После или &Вместо.
  3. Пишем обработчик пересчета.

Посмотрим на пример реализации кода в модуле формы расширения:


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

КонецПроцедуры

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

Вариант 5. Обходной путь для Базовых версий (перехват запроса веса)

Существует также оригинальный «хитрый» метод автоматизации без изменения конфигурации РМК, который отлично подходит для базовых версий программы. Суть его заключается в перехвате сигнала от электронных весов.

В момент, когда программа запрашивает вес с подключенного по кабелю оборудования, специальная внешняя компонента (драйвер-эмулятор) или промежуточная утилита перехватывает этот запрос и выводит на экран окно ввода суммы. Кассир вбивает «100 рублей», утилита делит это значение на цену товара и возвращает в «1С» уже рассчитанный вес, как будто он пришел напрямую с физических весов. Такой фокус позволяет использовать автоматический расчет на абсолютно любой, даже закрытой для редактирования лицензии программы.

← На главную