Как реализовать сложную иерархическую систему скидок по номенклатурным группам в 1С:Управление торговлей 11

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

При переходе с устаревших версий конфигураций (например, 1С:УТ 10.3) на современные (1С:УТ 11.4 или 11.5) программисты часто сталкиваются с концептуальной проблемой. В старых системах расчет скидок был сосредоточен в понятных процедурах общих модулей, что позволяло легко "дописать" свою табличную часть в соглашение. В 1С:УТ 11 архитектура расчета скидок значительно усложнилась: она базируется на компоновке данных, предварительных расчетах и множестве связанных справочников. Попытка "вклиниться" в этот процесс через изменение кода (кастомизацию) часто ведет к потере производительности и сложностям при обновлении.

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

Анализ проблемы: почему "костыли" в коде — это плохой путь

Рассмотрим типичную задачу: заказчику требуется установить скидку 5% на всю категорию "Продукты", но внутри неё на "Кефиры" оставить 2%, на "Масло" — 0%, а на конкретный "Белый хлеб" поднять до 7%. При этом такие правила должны быть уникальны для каждого из 2000 контрагентов.

Программисты, привыкшие к Обычным формам, часто пытаются добавить табличную часть в СоглашениеСКлиентом и перехватить расчет в заказе. Однако в УТ 11 расчет скидок происходит через механизм СкидкиНаценкиСервер, который оперирует объектами Справочник.СкидкиНаценки. Вместо изменения кода, нам следует использовать мощь типового конструктора.

Решение 1: Использование ценовых групп и уточнение в скидках

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

  1. Назначим каждой позиции номенклатуры соответствующую Ценовую группу. Если структура скидок повторяет структуру папок, можно воспользоваться групповой обработкой и заполнить ценовые группы по иерархии справочника.
  2. Создадим элемент справочника Скидки (наценки). В поле "Назначение" выберем тип "Индивидуальное соглашение".
  3. Перейдем на закладку "Результат предоставления". Здесь мы не просто указываем общий процент, а используем гиперссылку "Уточнить по ценовым группам".
  4. В появившейся таблице перечислим все ценовые группы и соответствующие им проценты. Например: "Молочные продукты" — 5%, "Хлебобулочные" — 7%.

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

Решение 2: Иерархия и вытеснение (Логика приоритетов)

Проанализируем ситуацию с исключениями (например, когда на папку 5%, а на конкретный товар 0%). В 1С:УТ 11 реализован механизм Групп совместного применения. Это ключевой инструмент для построения иерархии.

Чтобы реализовать логику "частное важнее общего", выполним следующие действия:

  1. Создадим группу скидок с вариантом совместного применения "Вытеснение".
  2. Внутри этой группы разместим скидки в порядке от частного к общему (сверху вниз).
  3. На самый верх поместим скидку на конкретный товар (например, "Масло" — 0%).
  4. Ниже разместим скидку на подпапку (например, "Кефиры" — 2%).
  5. В самом низу разместим общую скидку на все товары соглашения (5%).

Система будет анализировать список сверху вниз. Как только она найдет скидку, условие которой выполняется для данной строки товара (например, для масла), она применит её и проигнорирует все остальные нижестоящие скидки в этой группе. Таким образом, "0%" по конкретной позиции успешно "вытеснит" общие "5%".

Решение 3: Сегменты номенклатуры как гибкий фильтр

Если справочник номенклатуры постоянно меняется, и привязка к жестким ценовым группам неудобна, рассмотрим вариант с Сегментами номенклатуры. Это динамические списки товаров, которые формируются по определенным правилам.

Рассмотрим алгоритм настройки:

  1. Создадим сегмент номенклатуры (например, "Товары с высокой наценкой").
  2. В способе формирования выберем "Периодически обновлять". Важно: Динамические сегменты (формируемые в момент обращения) не могут быть использованы в расчете скидок из-за высокой нагрузки на сервер, поэтому выбираем именно вариант с регламентным обновлением.
  3. В схеме компоновки данных сегмента укажем условие "В иерархии", выбрав нужную папку справочника.
  4. В самой скидке на закладке "Условия предоставления" или в фильтре номенклатуры укажем созданный сегмент.

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

Технические нюансы: Процент 0% и запрет скидок

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

Правильное решение в УТ 11 — создать скидку с типом "Скидка (процент)" и значением 0. Эту скидку нужно установить в группу вытеснения с наивысшим приоритетом. Для системы 0% — это тоже скидка, она считается найденной и примененной, что прекращает дальнейший поиск по иерархии. Таким образом, итоговая цена останется базовой.

Автоматизация назначения скидок через расширения

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

  1. Добавить в расширение документ ИндивидуальноеСоглашениеСКлиентом и его табличную часть.
  2. Создать подписку на событие при записи соглашения.
  3. Программно генерировать или обновлять элементы справочника СкидкиНаценки и их привязку к этому соглашению на основе данных из вашей таблицы.

Пример кода для программного создания связи скидки и соглашения (метафорически):


// Пример логики регистрации скидки для соглашения
НоваяСвязь = РегистрыСведений.НазначениеАвтоматическихСкидокНаценок.СоздатьМенеджерЗаписи();
НоваяСвязь.СкидкаНаценка = СсылкаНаСкидку;
НоваяСвязь.Получатель = СсылкаНаСоглашение;
НоваяСвязь.ОбъектСегментации = Справочники.СегментыНоменклатуры.ПустаяСсылка();
НоваяСвязь.Записать();

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

Выводы и рекомендации

Мы выяснили, что архитектура 1С:УТ 11 предполагает уход от жесткого кодинга в сторону настройки правил. Для эффективной реализации иерархических скидок необходимо:

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

← На главную