В розничной торговле часто возникает жизненная ситуация: покупатель просит взвесить весовой товар (например, конфеты, печенье или овощи) на конкретную круглую сумму, допустим, ровно на 100 рублей. В торговых весах на прилавке цены может не быть (или весы используются только для определения массы), а кассиру в программе приходится вручную подбирать вес на калькуляторе, чтобы выйти на нужную сумму. В типовой конфигурации «1С:Розница» (будь то редакции 2.2, 2.3 или современная 3.0), а также в решении «1С:РМК» встроенного механизма для обратного пересчета количества из суммы «из коробки» не предусмотрено.
В этой статье мы подробно разберем, почему разработчики фирмы «1С» заложили именно такую логику, какие стандартные организационные и технические методы позволяют обойти это ограничение, и как программно реализовать автоматический пересчет количества через расширение конфигурации или внешнюю обработку.
Давайте проанализируем математическую и складскую логику платформы «1С:Предприятие». В любой товароучетной системе заложена строгая иерархия расчетов: Количество × Цена = Сумма. Первичным в учете всегда является физический объем товара (в штуках, литрах или килограммах). Программа обязана списать со склада строго определенное количество физического остатка.
Если мы позволим пользователю вручную менять поле Сумма в строке чека, система расценит это действие либо как предоставление ручной скидки (тогда цена уменьшится, а количество останется прежним), либо как ошибку округления. Изменение количества в обратную сторону при вводе суммы нарушило бы базовые алгоритмы проведения документов розничных продаж. Тем не менее, решить эту задачу можно несколькими путями.
Рассмотрим самый популярный индустриальный метод, который не требует изменения кода программы. На торговой точке устанавливаются электронные весы с возможностью печати этикеток (работающие в режиме Offline). В такие весы из 1С предварительно выгружается база товаров с их ценами и кодами PLU.
Процесс продажи выглядит следующим образом:
Количество, умножает на цену из базы и получает искомую сумму.Если покупка оборудования не планируется, а дорабатывать программу нельзя (например, у вас базовая версия конфигурации), разберем простейший алгоритм работы кассира с помощью платформенных средств. Вместо использования смартфона или физического калькулятора можно задействовать встроенный калькулятор «1С»:
F15 (или комбинацией клавиш в зависимости от настроек операционной системы) вызывается встроенный калькулятор платформы.Enter.Количество.Для документов («Реализация товаров», «Поступление товаров», «Чек ККМ» в режиме обычного документа) можно решить задачу без изменения типовой конфигурации и без снятия ее с поддержки. Для этого мы можем написать внешнюю обработку заполнения табличной части.
Выясним, как это работает. При нажатии на кнопку заполнения будет открываться небольшое модальное окно, где кассир сможет указать целевую сумму. Программа выполнит расчет и перезапишет количество в текущей строке документа.
Приведем пример программного кода, который должен содержаться в модуле внешней обработки:
Процедура Инициализировать(ОбъектИсточник, ИмяТабличнойЧасти, НаправлениеПерехода) Экспорт
// Получаем текущую строку табличной части документа
СтрокаТаблицы = ОбъектИсточник[ИмяТабличнойЧасти];
Если СтрокаТаблицы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// В реальной обработке здесь открывается диалоговая форма ввода желаемой суммы.
// Предположим, пользователь ввел СуммаПокупателя = 100.
СуммаПокупателя = 100;
Для Каждого Строка Из СтрокаТаблицы Цикл
// Проверяем наличие цены, чтобы избежать деления на ноль
Если Строка.Цена <> 0 Тогда
Строка.Количество = СуммаПокупателя / Строка.Цена;
// Вызываем стандартный обработчик пересчета суммы и скидок
ОбработкаТабличнойЧастиКлиент.РассчитатьСуммуТабЧасти(Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот способ идеален для оптовой и мелкооптовой торговли, но для быстрого обслуживания в интерфейсе РМК (Рабочего места кассира) он не очень удобен, так как требует совершения лишних кликов мышью.
Если нам требуется автоматизировать именно рабочее место кассира (РМК), то лучшим современным решением будет создание расширения конфигурации. Это позволит сохранить конфигурацию на поддержке и без проблем устанавливать обновления от фирмы «1С».
Проанализируем задачу. Нам необходимо, чтобы при изменении поля Сумма в интерфейсе РМК система не рассчитывала ручную скидку, а пересчитывала количество. Для этого мы перехватим событие изменения поля суммы на форме РМК.
Разберем по шагам создание такого расширения:
ФормаРМК или аналогичная в зависимости от редакции программы).ПриИзменении в модуль расширения с аннотацией &После или &Вместо.Посмотрим на пример реализации кода в модуле формы расширения:
&НаКлиенте
&После("ТоварыСуммаПриИзменении")
Процедура Расш_ТоварыСуммаПриИзмененииПосле(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
// Проверяем, что цена заполнена и товар является весовым
Если ТекущаяСтрока.Цена <> 0 И ТекущаяСтрока.Весовой Тогда
// Отключаем на время автоматические обработчики, чтобы избежать зацикливания
НовоеКоличество = ТекущаяСтрока.Сумма / ТекущаяСтрока.Цена;
// Округляем до 3 знаков после запятой (точность граммов)
ТекущаяСтрока.Количество = Окр(НовоеКоличество, 3);
// Принудительно вызываем пересчет остальных показателей строки
РассчитатьИтогиСтрокиРМК(ТекущаяСтрока);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При использовании этого метода кассиру достаточно будет кликнуть в поле «Сумма» текущей строки, ввести «100» и нажать клавишу ввода. Программа мгновенно пересчитает количество товара до грамма, сохранив установленную в базе розничную цену.
Существует также оригинальный «хитрый» метод автоматизации без изменения конфигурации РМК, который отлично подходит для базовых версий программы. Суть его заключается в перехвате сигнала от электронных весов.
В момент, когда программа запрашивает вес с подключенного по кабелю оборудования, специальная внешняя компонента (драйвер-эмулятор) или промежуточная утилита перехватывает этот запрос и выводит на экран окно ввода суммы. Кассир вбивает «100 рублей», утилита делит это значение на цену товара и возвращает в «1С» уже рассчитанный вес, как будто он пришел напрямую с физических весов. Такой фокус позволяет использовать автоматический расчет на абсолютно любой, даже закрытой для редактирования лицензии программы.