При переходе с устаревших версий конфигураций (например, 1С:УТ 10.3) на современные (1С:УТ 11.4 или 11.5) программисты часто сталкиваются с концептуальной проблемой. В старых системах расчет скидок был сосредоточен в понятных процедурах общих модулей, что позволяло легко "дописать" свою табличную часть в соглашение. В 1С:УТ 11 архитектура расчета скидок значительно усложнилась: она базируется на компоновке данных, предварительных расчетах и множестве связанных справочников. Попытка "вклиниться" в этот процесс через изменение кода (кастомизацию) часто ведет к потере производительности и сложностям при обновлении.
В данной статье мы разберем, как реализовать сложную структуру скидок (на папки, подпапки и конкретные товары) для каждого индивидуального соглашения, используя исключительно типовой функционал системы. Мы проанализируем ситуацию, когда у клиента тысячи товаров и сотни условий, и выясним, как заставить систему работать быстро и корректно.
Рассмотрим типичную задачу: заказчику требуется установить скидку 5% на всю категорию "Продукты", но внутри неё на "Кефиры" оставить 2%, на "Масло" — 0%, а на конкретный "Белый хлеб" поднять до 7%. При этом такие правила должны быть уникальны для каждого из 2000 контрагентов.
Программисты, привыкшие к Обычным формам, часто пытаются добавить табличную часть в СоглашениеСКлиентом и перехватить расчет в заказе. Однако в УТ 11 расчет скидок происходит через механизм СкидкиНаценкиСервер, который оперирует объектами Справочник.СкидкиНаценки. Вместо изменения кода, нам следует использовать мощь типового конструктора.
Первый и самый надежный способ — это использование Ценовых групп. Ценовая группа в 1С — это логический признак номенклатуры, который позволяет объединять товары не по физическому расположению в папках, а по правилам ценообразования. Разберем по шагам, как настроить систему:
Ценовую группу. Если структура скидок повторяет структуру папок, можно воспользоваться групповой обработкой и заполнить ценовые группы по иерархии справочника.Скидки (наценки). В поле "Назначение" выберем тип "Индивидуальное соглашение".Этот подход позволяет одной единственной настройкой скидки покрыть сразу все потребности по разным категориям товаров внутри одного соглашения.
Проанализируем ситуацию с исключениями (например, когда на папку 5%, а на конкретный товар 0%). В 1С:УТ 11 реализован механизм Групп совместного применения. Это ключевой инструмент для построения иерархии.
Чтобы реализовать логику "частное важнее общего", выполним следующие действия:
Система будет анализировать список сверху вниз. Как только она найдет скидку, условие которой выполняется для данной строки товара (например, для масла), она применит её и проигнорирует все остальные нижестоящие скидки в этой группе. Таким образом, "0%" по конкретной позиции успешно "вытеснит" общие "5%".
Если справочник номенклатуры постоянно меняется, и привязка к жестким ценовым группам неудобна, рассмотрим вариант с Сегментами номенклатуры. Это динамические списки товаров, которые формируются по определенным правилам.
Рассмотрим алгоритм настройки:
Это позволит системе автоматически включать новые товары из папки "Продукты" в расчет скидки без ручного переназначения ценовых групп для каждой карточки.
Часто возникает вопрос: как сделать так, чтобы на определенный товар скидка не действовала вообще, даже если в соглашении прописана общая скидка? Просто не указывать товар в списке недостаточно, так как на него может подействовать "общий" процент.
Правильное решение в УТ 11 — создать скидку с типом "Скидка (процент)" и значением 0. Эту скидку нужно установить в группу вытеснения с наивысшим приоритетом. Для системы 0% — это тоже скидка, она считается найденной и примененной, что прекращает дальнейший поиск по иерархии. Таким образом, итоговая цена останется базовой.
Если заказчик настаивает на интерфейсе "как в 10.3" (таблица прямо в соглашении), мы рекомендуем использовать Расширения конфигурации. Вместо изменения типовых модулей, можно сделать следующее:
ИндивидуальноеСоглашениеСКлиентом и его табличную часть.СкидкиНаценки и их привязку к этому соглашению на основе данных из вашей таблицы.Пример кода для программного создания связи скидки и соглашения (метафорически):
// Пример логики регистрации скидки для соглашения
НоваяСвязь = РегистрыСведений.НазначениеАвтоматическихСкидокНаценок.СоздатьМенеджерЗаписи();
НоваяСвязь.СкидкаНаценка = СсылкаНаСкидку;
НоваяСвязь.Получатель = СсылкаНаСоглашение;
НоваяСвязь.ОбъектСегментации = Справочники.СегментыНоменклатуры.ПустаяСсылка();
НоваяСвязь.Записать();
Этот путь позволит сохранить типовой механизм расчета (высокая скорость, корректность в чеках ККМ), но предоставит пользователю привычный интерфейс ввода данных.
Мы выяснили, что архитектура 1С:УТ 11 предполагает уход от жесткого кодинга в сторону настройки правил. Для эффективной реализации иерархических скидок необходимо:
Такой подход гарантирует стабильную работу базы данных даже при 16 000 товаров и 2 000 клиентов, сохраняя при этом возможность типового обновления конфигурации.