В процессе автоматизации розничной торговли часто возникает задача: ограничить права кассира так, чтобы он не мог вводить произвольный процент ручной скидки, но при этом имел возможность применить конкретную маркетинговую акцию (например, «Скидка помятая упаковка» или «Уценка») к одной конкретной строке чека. В типовой конфигурации 1С:Управление торговлей 11.5 (а также в ERP и КА) эта задача решается сочетанием штатных настроек и небольших программных доработок. Рассмотрим подробнее, как это реализовать.
Прежде чем приступать к написанию кода, проанализируем возможности системы. В 1С:УТ 11.5 существует механизм «управляемых» скидок, которые технически являются автоматическими, но срабатывают только при ручном указании пользователем. Разберем по шагам, как это настроить:
При таком подходе кассир в документе (например, «Чек ККМ» или «Заказ клиента») может выделить строку, нажать кнопку Цены и скидки — Назначить ручную скидку. В открывшейся форме ОбщаяФорма.НазначениеРучнойСкидкиНаценки система отобразит список всех автоматических скидок с признаком «Назначается вручную», которые подходят для данной строки.
Если стандартного поведения недостаточно (например, требуется особый интерфейс выбора или специфическая логика передачи данных), мы можем воспользоваться программным методом, который предложил автор темы. Рассмотрим ситуацию, когда нам нужно передать массив выделенных строк в общий модуль расчета скидок.
Проанализируем алгоритм передачи параметров. Основная логика расчета скидок сосредоточена в серверных модулях. Чтобы наша скидка «зацепилась» именно за нужную строку, нам необходимо оперировать уникальными идентификаторами строк (КлючСвязи).
Посмотрим на пример логики, которую можно внедрить в расширение:
// В форме документа при вызове команды назначения скидки
МассивСтрок = Элементы.Запасы.ВыделенныеСтроки;
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ВыделенныеСтроки", МассивСтрок);
ПараметрыРасчета.Вставить("СкидкаДляПрименения", ВыбраннаяСкидкаСсылка);
// Вызов процедуры расчета с передачей контекста
СкидкиНаценкиСервер.РассчитатьСкидки(Объект, ПараметрыРасчета);
Важно помнить, что в типовых конфигурациях при любом изменении состава ТЧ (изменение количества, цены) происходит пересчет. Чтобы ваша выбранная вручную скидка не исчезла, она должна быть зафиксирована в табличной части НачисленныеСкидкиНаценки. Эта ТЧ является скрытой, и записи в ней должны иметь корректный КлючСвязи, соответствующий ключу строки в основной табличной части Товары.
Если вы работаете в Рабочем месте кассира (РМК), механизм выглядит несколько иначе. В современных версиях УТ 11.5 интерфейс РМК оптимизирован под сенсорные экраны. Для реализации нашей задачи выясним, как система обрабатывает «Управляемые скидки»:
В настройках профиля РМК можно установить флаг Запретить ввод ручных скидок, но оставить доступ к кнопке Скидки — Управляемые скидки. Это идеальный «гибридный» вариант: кассир не может ввести «-10%» текстом, но может нажать кнопку и выбрать из списка «Скидка выходного дня 5%».
Разберем важный момент: ограничение максимального процента. Даже если мы разрешаем ручной выбор из списка, стоит подстраховаться через механизм Правила ограничения ручных скидок. Выясним причину, почему это необходимо: если программист допустит ошибку в коде и скидка применится не к той строке или в двойном размере, система контроля прав (RLS или программная проверка при проведении) заблокирует документ, если итоговый процент превысит допустимый порог для данного пользователя.
Проанализируем структуру хранения данных о скидках в документе:
Товары.СуммаРучнойСкидки — хранит общую сумму всех ручных правок.СкидкиНаценки (табличная часть) — хранит детальную информацию о том, какая именно скидка (ссылка на справочник) была применена к какой строке.При программной реализации, как было указано в финальном решении автора темы, рекомендуется передавать в модуль расчета не всю форму (это излишне нагружает память и усложняет отладку), а именно массив идентификаторов строк МассивИдентификаторов. В модуле внешней обработки или расширения следует перехватывать момент расчета и фильтровать строки, проверяя их вхождение в переданный массив.
Таким образом, для решения задачи «Скидка для выделенной строки» в УТ 11.5 наиболее правильным путем будет:
СкидкиНаценки с обязательным указанием КлючаСвязи.Это обеспечит корректную работу системы, сохранение данных при пересчете документа и отсутствие конфликтов с автоматическими механизмами 1С.