Как реализовать выбор скидки из списка для выделенной строки в 1С:УТ 11.5

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

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

Способ 1. Использование штатного механизма управляемых скидок

Прежде чем приступать к написанию кода, проанализируем возможности системы. В 1С:УТ 11.5 существует механизм «управляемых» скидок, которые технически являются автоматическими, но срабатывают только при ручном указании пользователем. Разберем по шагам, как это настроить:

  1. Перейдем в справочник Скидки (наценки).
  2. Создадим новую скидку и в поле «Способ назначения» выберем значение Назначается вручную.
  3. В поле «Область действия» укажем В строке. Это критически важно, так как именно эта настройка позволит применять скидку индивидуально к каждой позиции номенклатуры.
  4. В настройках ограничений или условий можно оставить список пустым (если скидка доступна всегда) или указать сегмент номенклатуры.

При таком подходе кассир в документе (например, «Чек ККМ» или «Заказ клиента») может выделить строку, нажать кнопку Цены и скидки — Назначить ручную скидку. В открывшейся форме ОбщаяФорма.НазначениеРучнойСкидкиНаценки система отобразит список всех автоматических скидок с признаком «Назначается вручную», которые подходят для данной строки.

Способ 2. Программная модификация через расширение

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

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

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


// В форме документа при вызове команды назначения скидки
МассивСтрок = Элементы.Запасы.ВыделенныеСтроки;
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ВыделенныеСтроки", МассивСтрок);
ПараметрыРасчета.Вставить("СкидкаДляПрименения", ВыбраннаяСкидкаСсылка);

// Вызов процедуры расчета с передачей контекста
СкидкиНаценкиСервер.РассчитатьСкидки(Объект, ПараметрыРасчета);

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

Работа с формой выбора в РМК

Если вы работаете в Рабочем месте кассира (РМК), механизм выглядит несколько иначе. В современных версиях УТ 11.5 интерфейс РМК оптимизирован под сенсорные экраны. Для реализации нашей задачи выясним, как система обрабатывает «Управляемые скидки»:

В настройках профиля РМК можно установить флаг Запретить ввод ручных скидок, но оставить доступ к кнопке Скидки — Управляемые скидки. Это идеальный «гибридный» вариант: кассир не может ввести «-10%» текстом, но может нажать кнопку и выбрать из списка «Скидка выходного дня 5%».

Технические нюансы и контроль прав

Разберем важный момент: ограничение максимального процента. Даже если мы разрешаем ручной выбор из списка, стоит подстраховаться через механизм Правила ограничения ручных скидок. Выясним причину, почему это необходимо: если программист допустит ошибку в коде и скидка применится не к той строке или в двойном размере, система контроля прав (RLS или программная проверка при проведении) заблокирует документ, если итоговый процент превысит допустимый порог для данного пользователя.

Проанализируем структуру хранения данных о скидках в документе:

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

Таким образом, для решения задачи «Скидка для выделенной строки» в УТ 11.5 наиболее правильным путем будет:

  1. Использование признака Назначается вручную в справочнике скидок.
  2. Настройка Области действия: В строке.
  3. При необходимости — программная фиксация выбора через корректировку ТЧ СкидкиНаценки с обязательным указанием КлючаСвязи.

Это обеспечит корректную работу системы, сохранение данных при пересчете документа и отсутствие конфликтов с автоматическими механизмами 1С.

← На главную