Скидка на количество для Розницы 2.2

06.11.22

Задачи пользователя - Прайсы

В Рознице 2.2 есть очень гибкая система скидок, но увы, такие востребованные скидки, как скидка на первый и второй товар в чеке не реализованы. К счастью, есть возможность реализовать алгоритм в виде внешней обработки, не меняя конфигурации. Эта обработка позволяет делать скидки на 1-ю, 2-ю, 3-ю и далее позиции в чеке из заданного сегмента.

Скачать исходный код

Наименование Файл Версия Размер
2020.08.28 для Розница 2.3.11.33. Платформа 8.3.20.2076 Актуальная
.epf 20,79Kb
20
.epf 20,79Kb 20 Скачать
2020.01.22 для Розница 2.2.5.23. Платформа 8.3.14.1630
.epf 18,60Kb
72
.epf 18,60Kb 72 Скачать

Порядок настройки обработки

Обработка добавляется во внешние обработки:

Создается элемент справочника "Скидки-наценки":

По кнопке "Настройки" открывается форма настройки внешней обработки, о ее настройке в разделе "Настройка внешней обработки". Если кнопка Настройки недоступна, выполнить команду "Еще - Разрешить редактирование реквизитов".

Создается и проводится маркетинговая акция:

Настройка внешней обработки

Рассмотрим пример скидки 30% на каждую вторую позиции в чеке по сегменту "Бытовая техника":

Сегмент номенклатуры – указывает, на какие позиции в чеке давать скидки. Например, на обувь можно давать скидку, а аксессуары (носки, шнурки) – не учитывать.

При наличии товара из сегмента в чеке - позволяет организовать скидку при наличии товара из другого сегмента.

Для каждого из порогов скидки 1-3 указывается:

  • Количество товара - при накоплении какого количества применять порог скидки.
  • Процент скидки - какой процент скидки применять при срабатывании порога.
  • Цена по скидке - вместо процента можно использовать цену, например, продажа за 1 рубль.
  • Вид количества - вариант применения скидки по порогу.
    • Обычный - если накоплено количество, больше или равное указанного в поле "Количество товара". Используется чаще всего.
    • Точное количество - если накоплено количество, равное указанному в поле "Количество товара".
    • Точное количество общее - если общее количество товара по сегменту в чеке равно указанному в поле "Количество товара".

Для определения порядка товаров в чеке важен порядок, если установлена галочка «Сортировать вперед дешевые», то первым считается самый дешевый, затем более дорогой и т.д. Если галочка не установлена, то наоборот, первым считается самый дорогой - такой порядок наиболее часто применимый.

Округлять скидку до - позволяет округлять скидку. 0 - не округлять. -1 - округлять до 10 рублей, 0.1 - округлять до 10 копеек.

Сбрасывать количество в единицу после накопления - позволяет организовывать циклические скидки, когда скидка дается, например, на каждый второй, а не на второй и более товар. Для каждого второго нужно поставить 2.

Учитывать предыдущие скидки - если расчет скидок внешней обработкой идет не первым в приоритете, то перед ним могут быть начислены другие скидки, установленная галочка позволяет их учитывать. Если она установлена, то будут делаться скидки от цены, на которую уже применены предыдущие скидки. Иначе скидка будет рассчитываться от начальной цены.

Условие - условие на языке 1С, позволяет делать гибкие настройки.

Отладка - при расчете скидок выводить отладочные сообщения с префиксом "Отладка" в окно сообщений.

Алгоритм применения скидок

Для простоты и точности расчета строки, где продается 2 и более товара, программа обрабатывает несколько раз, каждый раз обрабатывая продажу только одной штуки товара, постепенно накапливая количество.

Поэтому на каждом шаге программа имеет накопленное по сегменту количество продажи.

При расчете в поле "Условие" можно использовать следующие переменные:

Р - результат, принимает значение истина или Ложь. Истина - применять порог скидки.

НакопительКоличества - текущее накопленное количество

ОбщееКоличество - общее количество товара по сегменту в чеке.

Кэш - это структура - куда можно заполнять вычисляемые лишь однажды значения.

ВсеТовары - таблица всех товаров по сегменту.

Вот, например, формула, которая делает скиду на самые дешевые каждые третьи позиции в чеке:

Р = НакопительКоличества > ОбщееКоличество - Цел(ОбщееКоличество/3)

Проверим на чеке из 6 позиций для накопленного количества от 1 до 6 (товар отсортирован от дорого к дешевому):

1: 1 > (6 - 2) ложь
2: 2 > (6 - 2) ложь
3: 3 > (6 - 2) ложь
4: 4 > (6 - 2) ложь
5: 5 > (6 - 2) истина
6: 6 > (6 - 2) истина

Того же результат можно добиться, установив поле "Сбрасывать количество в единицу после накопления" в 3.

На практике можно применять довольно сложные системы расчета:

СегментБелое = Справочники.СегментыНоменклатуры.НайтиПоНаименованию("Вино белое", истина);
СегментКрасное = Справочники.СегментыНоменклатуры.НайтиПоНаименованию("Вино красное", истина);
ЭтоБелое = СегментыВызовСервера.ВходитВСегмент(ТоварСегмента.Номенклатура, СегментБелое);
ЭтоКрасное = СегментыВызовСервера.ВходитВСегмент(ТоварСегмента.Номенклатура, СегментКрасное);

Сообщить("Товар: " + ТоварСегмента.Номенклатура + " Белое?" + ЭтоБелое + " Красное? " + ЭтоКрасное + " Цена: " + ТоварСегмента.Цена);

КоличествоБелых = 0; КоличествоКрасных = 0;
КоличетвоКрасныхИБелых = 0;

Для Каждого ТоварСегмента2 ИЗ ВсеТовары Цикл
    ЭтоБелое2 = СегментыВызовСервера.ВходитВСегмент(ТоварСегмента2.Номенклатура, СегментБелое);
    ЭтоКрасное2 = СегментыВызовСервера.ВходитВСегмент(ТоварСегмента2.Номенклатура, СегментКрасное);
    Сообщить("   Товар2: " + ТоварСегмента2.Номенклатура + " Белое?" + ЭтоБелое2 + " Красное? " + ЭтоКрасное2 + " Цена: " + ТоварСегмента2.Цена);
    
    Если ЭтоБелое2 И ТоварСегмента2.Цена >= ТоварСегмента.Цена Тогда
        КоличествоБелых = КоличествоБелых + ТоварСегмента2.Количество;
    КонецЕсли;
    Если ЭтоКрасное2 И ТоварСегмента2.Цена >= ТоварСегмента.Цена Тогда
        КоличествоКрасных = КоличествоКрасных + ТоварСегмента2.Количество;
    КонецЕсли;
    
    Если ЭтоКрасное2 ИЛИ ЭтоБелое2 Тогда
        КоличетвоКрасныхИБелых = КоличетвоКрасныхИБелых + ТоварСегмента2.Количество;
    КонецЕсли;
КонецЦикла;
Сообщить("   Белых:" + КоличествоБелых + " Красных: " + КоличествоКрасных + " Накопитель: " + НакопительКоличества);

Однако не стоит забывать о скорости расчета, используйте Кэш для оптимизации.

Тестирование расчета скидок

Для тестирования обработки нужно создать чек, подобрать товар и нажать Скидки – Рассчитать скидки:

При расчете скидок будет выводиться комментарий расчета.

Если включена отладка, то будут выводиться также и отладочные сообщения.

На закладке "Скидки" также можно посмотреть скидки:

При подборе товара через РМК скидка будет рассчитываться автоматически.

Особенности использования

Нельзя использовать динамические сегменты, т.к. алгоритм использует регистр состава сегмента. Нужно поддерживать сегменты в актуальном состоянии.

Версии:

  • 2020.08.28 для Розница 2.3.11.33. Платформа 8.3.20.2076 Актуальная
  • 2020.01.22 для Розница 2.2.5.23. Платформа 8.3.14.1630

скидки

См. также

Автоматический заказ поставщику в 1С: загрузка прайсов и анализ цен поставщиков для УТ 10.3, УТ 11, КА2, УНФ, УПП, ERP, Розница 2

Бюджетирование и планирование Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Анализ продаж Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Система управления запасами для 1С помогает работать с запасами правильно: автоматически рассчитывает потребность и делает заказ поставщику, загружает прайсы, перемещает товары по филиалам, анализирует продажи и позволяет управлять ассортиментом.

28500 руб.

21.04.2017    91827    116    40    

203

ККТ-ОНЛАЙН 54-ФЗ: Обработка для работы онлайн касс АТОЛ, ШТРИХ, VIKI PRINT и т.д. МАРКИРОВКА (Разрешит. режим) + ЭКВАЙРИНГ + БЕСПЛАТНЫЙ ДЕМО

ККМ Кассовые операции Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения 1С:CRM ПРОФ, КОРП Россия Платные (руб)

Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1). Подключайте любую онлайн кассу к практически любой конфигурации. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Поддерживает разрешительный режим. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows ЭМУЛЯТОР + ЭКВАЙРИНГ + МАРКИРОВКА + ПОДДЕРЖКА ФФД 1.2

6000 руб.

27.02.2017    774941    4705    9505    

2800

ЕГАИС++. Опт, производство, импорт

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 руб.

15.12.2015    167282    711    362    

391

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 руб.

29.10.2014    212795    632    526    

447

54-ФЗ и Разрешительный режим. Обработки для подключения онлайн-касс к 1С 8 (поддержка Маркировки) + Эмулятор + ФФД 1.2

ККМ Кассовые операции Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия автономного учреждения Россия Платные (руб)

Обработка осуществляет обслуживание ККТ АТОЛ, Штрих и Меркурий для конфигураций "УТ 10.3", "КА 1.1", "УПП 1.3", "Розница 1.0", "БП 2.0" и других отраслевых решений, построенных на основе указанных выше конфигурациях. Поддерживает возможность параллельно пробития чеков на одной ККМ несколькими пользователями. Поддерживает Веб-сервер Атол. Соответствует требованиям 54-ФЗ. Поддерживает ФФД 1.0, 1.05, 1.1 и 1.2. Разделяет чеки по нескольким СНО. Поддерживает механизмы подключения ККТ по TCP/IP, для работы через RDP или интернет. Поддержка маркировки и разрешительного режима.

5400 руб.

25.05.2015    322871    1856    3023    

1000

Обмен с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

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

104000 руб.

18.03.2019    111067    34    114    

179

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 09.04.2024, версия 9.9 - 9.10)

14400 руб.

20.11.2015    152423    370    376    

505
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. psviridov 10.10.17 08:45 Сейчас в теме
Прошу прощения, а это точно востребованная скидка? Ни разу не видел и не реализовывал, хотя и проработал в торговле больше 10 лет. И даже не могу ее себе представить-я как покупатель выложил товары на ленту, а что потом? Говорю кассиру-вот это пусть будет первой/последней позицией в чеке (она-же берет сперва что поближе, но товар лежит некой компактной кучкой, а не строгой вереницей)? Учитывает-ли ваша обработка то, что n-ной позицией в чеке, на которую надо предоставить скидку может являться товар с фиксированной ценой или товар, на которую скидка не распространяется (акционный, например)?
2. fixin 4254 10.10.17 09:18 Сейчас в теме
(1) показываю на пальцах.
Допустим, покупают:

Туфли 1000 рублей
Ботинки 2000 рублей.

Акция - скидка 10% на второй товар в чеке по цене.

Соответственно скидка будет даваться на туфли, как более дешевый товар.

Т.е. будет 100 рублей.

все алгоритмически прозрачно и таких акций пруд пруди, обычно на обувь и вещи.

Скидка дается на товары из сегмента, а не на все товары в чеке.

Акционный не учитывает, это вам надо дописать, или создать сегмент без акционных товаров, если хотите. Но и так востребована.
5. psviridov 10.10.17 10:54 Сейчас в теме
(2) Т.е. скидка дается не на позицию, которая стоит на n- строке по порядку, а в смысле если в чеке n-позиций, то дается на самое дешевое (т.е. скидка на длину чека)?
6. fixin 4254 10.10.17 12:48 Сейчас в теме
(5) ну не знаю что вы подразумеваете под длиной чека. По-моему в примере все ясно написано.
Часто такая скидка дается в обувных и одежных - скидка на вторую, третью и далее пару. Причем первой считается самая дорогая.
78. psa247 14 14.11.23 17:34 Сейчас в теме
(1) Коллега, я работаю в торговле меньше вашего, а с первого раза понял, про что идет речь )
79. fixin 4254 16.11.23 09:53 Сейчас в теме
(78) для этого достаточно не работать в торговле, а просто покупать в магазинах, такая скидка довольно распространена.
3. user635667 140 10.10.17 09:41 Сейчас в теме
да идея вполне актуально. во всяких Кари магазинах часто такое бывает, странно что в типовой конфиге не реализованно. хотя там наверное по каким то мудренным скидочным акциям.
4. fixin 4254 10.10.17 09:50 Сейчас в теме
(3) я сперва тоже пробовал через типовые мудреные акции, но потом плюнул, и написал код.
В реальном магазине (обувном) работает, так шта...
7. Davlad_A 72 13.10.17 14:23 Сейчас в теме
Сережа, можно подробнее:
-поле "Количество товаров 2" используется альтернативно с "Количество товаров 1" или одновременно (если 2-е, при какой прикладной логике);
-опция "Точное количество" за что отвечает?
- последняя опция "При наличии товара из сегмента в чеке" - содержит скидку, кот. надо предварительно создать в справочнике? А значение скидки тогда берется из этого элемента или из "Процент скидки", не совсем ясно.
Спасибо.
8. fixin 4254 13.10.17 15:49 Сейчас в теме
(7) Количество 1 и Количество 2 - это пороги.
Можно указать количество 1 = 1, количество 2 = 3, тогда за 1 и 2-ю пару будет процент 1, а за 3ю, 4ю и т.д - процент 2. Если не указывать количество 2 (ноль), то только первый порог используется.

Точное количество - обозначает, что не количество1 (количество2) и выше, а именно на такое количество. Т.е. в прошлом примере действует на 1-ю пару и третью. На вторую скидки нет.

Последняя опция обозначает наличие определенного товара-маркера в чеке, который будет активизировать скидку. Например, скидка дается только при наличии в чеке купона (у нас была такая услуга за 1 копейку)...
Эти купоны добавлялись в сегмент "Купоны".

Всё из практики.
9. Davlad_A 72 13.10.17 21:45 Сейчас в теме
Отлично, теперь все понятно.
Спасибо, хорошая вещь!
10. fixin 4254 14.10.17 12:35 Сейчас в теме
(9) да, эта разработка закрывает определенное белое пятно. Ведь такие акции не редкость, а инструмента для их проведения в 1с не было.

Я закрыл этот пробел, буду рад, если кому пригодится.
11. annach-83@mail.ru 28.11.17 07:48 Сейчас в теме
Добры день. Подскажите, пжл, а как сделать скидку на третий товар? Например: на 1-й - 20%, на второй - 30%, на третий - 40%
12. fixin 4254 28.11.17 15:03 Сейчас в теме
(11) тут только два порога.
Могу доработать третий за 1000, предоплата. Или сами допишите по аналогии
13. qsanatoly 01.12.17 08:47 Сейчас в теме
Сергей, скажите, а действует ли данная обработка, если в чеке 4 товара и на 2 из них (самых дешевых) необходима скидка. Не пойму как настроить в этом случае: если в чеке больше двух товаров, а скидку необходимо на каждый второй более дешевый?
14. fixin 4254 02.12.17 23:13 Сейчас в теме
(13) поставьте первый порог на количество = 1 и второй порог на количество = 2. Т.е. ставьте галочку "Точное количество". Тогда на 3-й и 4-й товар и т.п. скидки не будет. Процент скидки соответственно ставьте одинаковым.
15. d.tohmahov 08.08.18 14:30 Сейчас в теме
Именно то что я и искал, подскажите, работает из РМК ?
16. fixin 4254 13.08.18 11:49 Сейчас в теме
(15) да, все такие внешние обработки работают из рмк
17. Dilovar9 64 16.11.18 09:19 Сейчас в теме
Нашел ошибку. Если кол. товара в строке больше чем 1, то тогда считается неверно. Исправить можно так.

СуммаСкидки = Окр(КоличествоСкидки * ТоварСегмента.Цена * ПроцентСкидки / 100, ОкруглятьСуммуДо);
Прикрепленные файлы:
18. user834076 05.12.18 00:50 Сейчас в теме
Сергей, добрый день! А можно настроить скидку на каждый 3-ий товар независимо от количества товаров в чеке? Если да, то можете помочь ее настроить в базе за доп плату!
20. fixin 4254 08.12.18 00:01 Сейчас в теме
(18) напишите мне на fixin@mail.ru я скину более актуальную версию, там 3 скидки, если вы ставите порог3 = 0, то скидка будет всегда (вроде). Но если что, смогу и допилить за символическую плату, если так не сработает.
19. user896337 05.12.18 10:41 Сейчас в теме
Сергей, добрый день! Не корректно работает обработка.
Мои настройки:
- Сегмент номенклатуры выбран
- Количество товаров1: 2
- Процент скидки: 10
- Количество товаров2: 0
- Точное количество: Да
- Сортировать вперед дешевые: Да
- При наличии товара из сегмента в чеке Не выбран
- Округлять сумму до: 0

Документ чек
1) Товар 1. Количество 1. цена 230
2) Товар 2. Количество 1. Цена 650
3) Товар 3. Количество 1. Цена 450. % авт 10. Сумма авт. 45

Не работает сортировка и не работает порог.

Для примера еще один документ чек. В этот же чек добавил еще одну позицию.
1) Товар 1. Количество 1. цена 230. % авт 10. Сумма авт. 23
2) Товар 2. Количество 1. Цена 650
3) Товар 3. Количество 1. Цена 450
4) Товар 4. Количество 1. Цена 150

Так же не работает сортировка и не работает порог. Исправьте пожалуйста обработку
Прикрепленные файлы:
21. fixin 4254 08.12.18 00:01 Сейчас в теме
(19) напишите в fixin@mail.ru , пришлю последнюю версию, протестируете.
22. user896337 08.12.18 09:04 Сейчас в теме
55. Rasty_ 106 26.11.20 17:58 Сейчас в теме
(21) Сообщения на данный момент закрыты. Написал на почту)
23. fixin 4254 11.12.18 00:22 Сейчас в теме
думаю, на этих выходных выложу апдейт обработки. исправлены будут ошибки и добавлено несколько новых возможностей. Алгоритм станет более надежным и качественным.
все возможности апробированы на клиентах.
24. fixin 4254 18.12.18 23:48 Сейчас в теме
выложил новую версию. читайте UPD к статье (внизу)
25. STnmsk 07.02.19 19:36 Сейчас в теме
Добрый день!
При вот таких настройках https://yadi.sk/i/8rv7kiIvuadx4w скидка на третий товар считается 50%, а на второй не считается совсем.
В сегменте всего один товар.
https://yadi.sk/i/mugQln7O4OWedw
26. fixin 4254 15.05.19 13:20 Сейчас в теме
(25) в протоколе все правильно, похоже, что 105 и 175 не суммируются, т.к. в одной строке сразу 3 штуки товара. Видимо, ошибка, что не суммируются скидки в одну строку. Проверю, поправлю. Напишите мне на fixin@mail.ru, вышли исправление.

И не обязательно заполнять поле "давать скидку при наличии товара в чеке". Он же у вас и так есть.
27. fixin 4254 16.05.19 08:41 Сейчас в теме
(25) Какую версию используете?
По скриншоту видно, что на закладке (скидки) всего одна строка, а должно быть две.
Я воспроизвел ситуацию, в последней версии обработки все работает. Пишите в личку, вышлю версию (которая здесь последняя).
28. pererva98 27.09.19 18:15 Сейчас в теме
Добрый вечер! Не работает обработка. Пишет недействительный адрес или не найден родительский сеанс задания
Прикрепленные файлы:
29. fixin 4254 29.09.19 09:05 Сейчас в теме
(28) нажимаете вверху справка - о программе - там "Информация для технической поддержки" и копируете оттуда.
или пришлите мне запрос на fixin@mail.ru вышлю последнюю версию, может там это уже починено.
30. pererva98 30.09.19 09:27 Сейчас в теме
Перевыбрали заново из файла - ошибка ушла. Вроде работает. Спасибо
31. pererva98 30.09.19 17:44 Сейчас в теме
Подскажите пожалуйста, как можно сделать? Условия такие: При покупке трех товаров из сегмента, на третий по наименьшей стоимости дается скидка 50%. Это настроить получилось. Но еще должна применяться ДК, с которой скидка не должна даваться, только накопления падают с покупки этих товаров. Так вот это не получается сделать. Скидка по ДК на дешевый товар не дается, а на остальных два дается. Как ее можно убрать?
32. fixin 4254 01.10.19 10:02 Сейчас в теме
(31) копать в группы совместного применения, хотя думаю, что в таком случае на первые два товара тоже должна начисляться скидка одна копейка, как вариант.
eugene1C; +1 Ответить
33. eugene1C 4 02.10.19 16:05 Сейчас в теме
(32) вы правы, создание корневой группы скидок с вытеснением, помещение новой скидки первой в группе с вытеснением, работает.
34. eugene1C 4 02.10.19 16:13 Сейчас в теме
(32) При применении в обработке надо добавлять "нулевые" записи сумм скидок даже для тех строк, для которых скидка не работает, чтобы вытеснение срабатывало.
35. eugene1C 4 02.10.19 16:13 Сейчас в теме
(32) Если заранее непонятно, должна ли хоть в какой то строке сработать новая скидка, то чтобы "нулевые" записи не вытеснили ошибочно остальные скидки, придется делать первый дублирующий прогон с установкой флага необходимости применить новую скидку, и запись "нулевых" записей производить по этому флагу.
36. pererva98 07.10.19 14:17 Сейчас в теме
Подскажите пожалуйста такую ситуацию как правильно настроить? При покупке 3-х вещей из сегмента, на самую дешевую 50%. При этом если в чек подбирается 4-е вещи или 5 вещей, то все равно должна даваться скидка 50% только на одну самую дешевую. А скидка перепрыгивает не на самую дешевую вещь. Как это настроить?
37. fixin 4254 08.10.19 19:38 Сейчас в теме
(36) напишите мне Fixin@mail.ru, вышлю самую последнюю версию, там это можно настроить
Хотя даже в таком варианте скидка должна даваться на самую маленкькую, ведь сортировка по цене идет.
38. LifeRock 06.11.19 15:20 Сейчас в теме
обработка умеет делать скидку на каждую вторую штуку по строке?
39. LifeRock 06.11.19 15:28 Сейчас в теме
точнее не так. а может ли считать только по строке а не по документу?
40. fixin 4254 06.11.19 20:19 Сейчас в теме
(39) обратитесь ко мне за последней версией в лычку, вышлю, она умеет намного больше.
42. grinlawyer 08.02.20 14:17 Сейчас в теме
Здравствуйте, а можно тоже узнать про последнюю версию grinlawyer@yandex.ru
(40)
44. fixin 4254 17.02.20 19:02 Сейчас в теме
(39) приведите пример. Думаю, что да.
Там все очень гибко, можно даже свои условия писать.
41. grinlawyer 08.02.20 14:16 Сейчас в теме
Здравствуйте, а можно тоже узнать про последнюю версию grinlawyer@yandex.ru
43. fixin 4254 17.02.20 18:56 Сейчас в теме
(41) по многочисленным просьбам выложил последнюю версию здесь.
45. pererva98 04.03.20 21:21 Сейчас в теме
Розница 2.3.3.19
При подборе товаров в Чек ошибка
Прикрепленные файлы:
46. fixin 4254 04.03.20 21:46 Сейчас в теме
(45) 1С - мракобесы. Зачем переименовывать имена процедур
Переименовали ПолучитьОписаниеТиповЧисла в ОписаниеТиповЧисла

	
ВсеТовары.Колонки.Добавить("СуммаВГруппе", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(15, 2));
	ВсеТовары.Колонки.Добавить("СуммаБезСкидки", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(15, 2));



Вынес в свою функцию:

Функция ПолучитьОписаниеТиповЧисла(Разрядность, РазрядностьДробнойЧасти) Экспорт
	Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Разрядность, РазрядностьДробнойЧасти));
КонецФункции


И вызов:

	ВсеТовары.Колонки.Добавить("СуммаВГруппе", ПолучитьОписаниеТиповЧисла(15, 2));
	ВсеТовары.Колонки.Добавить("СуммаБезСкидки", ПолучитьОписаниеТиповЧисла(15, 2));




Обновил.
47. vdv 18.06.20 10:43 Сейчас в теме
Здравствуйте, сейчас запускаю Розница 2.3, хотел уточнить возможно ли с помощью вашей обработки создать следующий вариант скидок:
при продаже 2 шт. товаров третий продается по фиксированной цене =1 руб (ну цена может меняться). При этом товар подсчитываемый =2 шт. может быть одиночным (например, носки черные муж арт..597852,), а может подсчитывать в указанном сегменте (например, при покупки 2 шт. из сегмента носки женские шерстяные -любая 3 пара продается по цене 1 руб)? Цены (по крайней мере пока) в сегменте на каждый товар одна и та же-сегмент объединяет одинаковый товар с разными характеристиками (цвет, размер и т.д). Но характеристики мы не используем -справочник линейный.
Также используется кратность продаж -если продали 4 шт. -уже 2шт идут по цене 1р., если 6 -уже 3шт. по 1 рублю и т.д.
Ну и порог количества продажи возможно может меняться -на некоторый товар могут назначить порог =3шт.
Можно ли как то выделить продажу товаров по акции? Т.е. для дальнейших отчетов сделать выборку проданных товаров по 1р.в рамках акции?
48. fixin 4254 18.06.20 20:39 Сейчас в теме
а ваши покупатели не запутаются в такой сложной схеме? ;-)
Сбрасывать количество в единицу после 3х, например - значит после каждого третьего товара считать первым.
Цена по скидке - если поставите 1, то будет по рублю.

Если этого не хватит - можно доработать, наверное.
Но основы заложены.

Если один товар продается в количестве 3 шт, то обработка да, может считать на третий скидку, если например, на каждый третий.
49. vdv 19.06.20 00:27 Сейчас в теме
Пользователи сами придумали эту схему. Действует уже полгода, пока работают ,не запутались.Сейчас реализовано как скидка = (цена-1р). Но это приходиться контролировать каждую переоценку и создавать новую скидку. Ваша обработка похоже более гибче работает, но только я не понял до конца как её настроить под мои запросы.Можно на почту написать по более подробной настройке обработки?
50. fixin 4254 19.06.20 15:19 Сейчас в теме
можно. Пишите, подскажу.
В деле скидок за каждую N покупку я круче всех. ;-)
Можно сказать "собаку на этом съел".
51. fixin 4254 29.06.20 18:40 Сейчас в теме
Ко мне обратился один клиент.
Сделал ему доработку, чтобы при расчете скидок сохранялся порядок строк.
Потому что там розница и чеки длинные, скидки постоянно случайным образом пересчитываются, поэтому сортирую товар по номеру строки.

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

Сейчас на тестировании, как протестирует, опубликую тут обновления.
52. Oskoll 03.09.20 16:19 Сейчас в теме
Здравствуйте. Подскажите, есть ли возможность настроить обработку таким образом, чтобы сумма скидки на каждый n товар из определенного сегмента распределялась на все n товаров? Т.е. скидка 50% на каждый второй товар рассчитана как 1000р., и эта 1000р. распределяется на оба товара и т.д.
Дело в том что по условиям акции на товары в ней участвующие бонусы не должны начисляться. А бонусы у нас не начисляются только на товары, по которым была скидка.
53. fixin 4254 03.09.20 17:19 Сейчас в теме
(52) можно, но это нужно дорабатывать.
54. Oskoll 03.09.20 17:27 Сейчас в теме
Можем договориться на доработку?
58. fixin 4254 26.01.21 12:01 Сейчас в теме
56. user935584 26.01.21 11:35 Сейчас в теме
Добрый день! Как я понял, в обработке скидка не раскидывается на позиции в чеке? Смысл в том, если товар идет в подарок, его цена должна раскидаться на все позиции в виде скидки. Это можно сделать с помощью вашей обработки?
57. fixin 4254 26.01.21 12:00 Сейчас в теме
(56) в последней версии да, было такое обращение и соответствующая доработка. Но последнюю я еще не обновлял на сайте.
59. user935584 26.01.21 12:18 Сейчас в теме
(57) как её можно получить?
60. fixin 4254 26.01.21 15:29 Сейчас в теме
61. papami 55 04.02.21 11:36 Сейчас в теме
Добрый день! Не получается настроить скидку на каждый третий таким образом чтобы скидка применялась на самые дешевые позиции. Т.е. из списка на 6 позиции по цене 550, 700, 1300,1500,2300,1800 обработка делает скидки на 1500 и 550. А должна на 550 и 700. Можно так настроить?
Прикрепленные файлы:
62. papami 55 04.02.21 12:05 Сейчас в теме
а из 5 позиций скидка делается не на самую дешевую, а на 3 по цене
63. fixin 4254 04.02.21 20:01 Сейчас в теме
64. comaks 28.06.21 11:06 Сейчас в теме
Здравствуйте, на последних версиях 1С Розница 2.3.6 и выше работает?
65. fixin 4254 30.06.21 11:54 Сейчас в теме
(64) Не знаю, проверял только на макс релизе Розница, редакция 2.3 (2.3.4.33)
66. Bortkevich 69 07.07.21 11:45 Сейчас в теме
А моожно как-то ограничить применение скидки. чтобы она не всегда работала, а по купону например
67. fixin 4254 07.07.21 14:37 Сейчас в теме
(66) Через произвольное условие. Смотрите, если ли в чеке купон (кодом на языке 1С) и тогда разрешаете скидку.
68. user890763 03.08.21 21:08 Сейчас в теме
Подскажите, пожалуйста, как правильно настроить следующее условие.
Скидка дается на товар из Сегмента А, если в чеке есть товар из Сегмента Б. Но это должно быть кратно - сколько в чеке товаров Б, на столько товаров А и можно дать скидку.
Например,
- чек 1: 1 шт Товар А + 1 шт Товар Б => скидка 10% на 1 шт товара А
- чек 2: 2 шт Товар А + 1 шт Товар Б => скидка 10% на 1 шт товара А
- чек 3: 2 шт Товар А + 2 шт Товар Б => скидка 10% на 2 шт товара А
- чек 4: 1 шт Товар А + 2 шт Товар Б => скидка 10% на 1 шт товара А
- чек 5: 3 шт Товар А + 2 шт Товар Б => скидка 10% на 2 шт товара А
- чек 6: 3 шт Товар А + 3 шт Товар Б => скидка 10% на 3 шт товара А
69. fixin 4254 04.08.21 15:19 Сейчас в теме
(68) думаю, произвольным запросом, код вроде:
Если НЕ Кэш.Свойство("ТоваровСегментаБ")  Тогда
                                                               Кэш.Вставить("СегментА", Справочники.СегментыНоменклатуры.НайтиПоНаименованию("Вино красное", истина));
                                                               Кэш.Вставить("СегментБ", Справочники.СегментыНоменклатуры.НайтиПоНаименованию("Вино белое", истина));
                                                               
                                                               Кэш.Вставить("ТоваровСегментаБ", 0);
                                                               Для Каждого ТоварСегментаДоп ИЗ ТоварыСегмента Цикл
                                                                              ЭтоБ = СегментыВызовСервера.ВходитВСегмент(ТоварСегментаДоп.Номенклатура, Кэш.СегментБ);
                                                                              Если ЭтоБ Тогда
                                                                                              Кэш.ТоваровСегментаБ = Кэш.ТоваровСегментаБ + 1;
                                                                              КонецЕсли;
                                                               КонецЦикла;
                                               КонецЕсли;

                                                               
                                               ЭтоА = СегментыВызовСервера.ВходитВСегмент(ТоварСегмента.Номенклатура, Кэш.СегментА);
                                               Если ЭтоА Тогда
                                                               Р = НакопительКоличество <= Кэш.ТоваровСегментаБ;
                                               КонецЕсли;

Показать


При этом сегмент не назначайте, пусть проверяются все товары чека
70. timunya 7 26.07.22 12:39 Сейчас в теме
День добрый немного запутался в описании :)
как настроить чтобы была скидка кратная количеству из определенного сегмента номенклатуры, но сама скидка считалась сначала на самые дешевые товары (и они могут быть не в сегменте , а любые )
71. fixin 4254 27.07.22 12:48 Сейчас в теме
(70) вам нужно обратить внимание на произвольное условие.
Сегмент не указываем. Накопитель количества накапливаем пропорционально количеству из сегменту.
Товары будут в порядке от дешевых к дорогим.
72. sommid 22.03.23 12:27 Сейчас в теме
В чистом виде не подошло, но подсматривал логику и оформление. Спасибо.

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

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

Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Товары.КлючСвязи КАК КлючСвязи,
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.Количество КАК Количество,
	|	Товары.Сумма КАК Сумма,
	|	Товары.СуммаВГруппе КАК СуммаВГруппе,
	|	Товары.СуммаБезСкидки КАК СуммаБезСкидки
	|ПОМЕСТИТЬ ТоварыДокумента
	|ИЗ
	|	&ВсеТовары КАК Товары
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	Товары.КлючСвязи КАК КлючСвязи,
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.Количество КАК Количество,
	|	Товары.Сумма КАК Сумма,
	|	Товары.СуммаВГруппе КАК СуммаВГруппе,
	|	Товары.СуммаБезСкидки КАК СуммаБезСкидки
	|ИЗ
	|	ТоварыДокумента КАК Товары
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатураСегмента КАК НоменклатураСегмента
	|		ПО (НоменклатураСегмента.Сегмент = &Сегмент)
	|			И Товары.Номенклатура = НоменклатураСегмента.Номенклатура
	|			И Товары.Характеристика = НоменклатураСегмента.Характеристика
	|			И (НЕ &ФормироватьДинамически)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	Товары.КлючСвязи,
	|	Товары.Номенклатура,
	|	Товары.Характеристика,
	|	Товары.Количество,
	|	Товары.Сумма,
	|	Товары.СуммаВГруппе,
	|	Товары.СуммаБезСкидки
	|ИЗ
	|	ТоварыДокумента КАК Товары
	|ГДЕ
	|	&УсловиеПоДинамическомуСегменту
	|	И &ФормироватьДинамически";
	Запрос.УстановитьПараметр("ВсеТовары", ВсеТовары);
	Запрос.УстановитьПараметр("Сегмент", СегментНоменклатуры);
	
	Запрос.УстановитьПараметр("ФормироватьДинамически", (СегментНоменклатуры.СпособФормирования = Перечисления.СпособыФормированияСегментов.ФормироватьДинамически));
    	FH_ОбщегоНазначенияСервер.ДополнитьЗапросОтборомПоСегментуНоменклатуры(Запрос, СегментНоменклатуры, "Товары", "УсловиеПоДинамическомуСегменту");
	
	ТоварыСегмента = Запрос.Выполнить().Выгрузить();
Показать


2. Функции общего модуля по подстановке условия по данным сегмента:

Процедура ДополнитьЗапросОтборомПоСегментуНоменклатуры(Запрос, СегментНоменклатуры, ИмяТаблицыВЗапросе, ИмяПараметраОтбораПоСегменту, ИсключениеТоваровСегмента=Ложь, ПрефиксИмениПараметра="") Экспорт
	
	Настройки = СегментыВызовСервера.FH_ПолучитьНастройкиСписка(СегментНоменклатуры);
	СКД = Настройки.СКД;
	НастройкиСКДОтбор = Настройки.Настройки;
	
	СоответствиеЗамен = Новый Соответствие;
	СоответствиеЗамен.Вставить("Номенклатура", "Номенклатура");
	СоответствиеЗамен.Вставить("Характеристика", "Характеристика");
	
	ДополнитьЗапросОтборомПоОтборуСКД(Запрос, СКД, НастройкиСКДОтбор, ИмяТаблицыВЗапросе, ИмяПараметраОтбораПоСегменту, СоответствиеЗамен, ИсключениеТоваровСегмента, ПрефиксИмениПараметра);
	
КонецПроцедуры

Процедура ДополнитьЗапросОтборомПоОтборуСКД(Запрос, СКД, НастройкиСКДОтбор, ИмяТаблицыВЗапросе, ИмяПараметраОтбора, СоответствиеЗамен, ЭтоИсключение=Ложь, ПрефиксИмениПараметра="") Экспорт
	
	//СоответствиеЗамен - как поля исходного запроса заменяем под реальный, где хотим использовать отбор
	//например для ПравилаОпределенияДополнительногоКодаТНВЭД: КлассификаторКодовТНВЭД -> ИмяТаблицыВЗапросе + "." + "Номенклатура.КодТНВЭД"
	//например для СегментыНоменклатуры: Номенклатура -> ИмяТаблицыВЗапросе + "." + Номенклатура
	//например для СегментыНоменклатуры: ХарактеристикиНоменклатуры -> ИмяТаблицыВЗапросе + "." + Характеристика
	
	Если НастройкиСКДОтбор = Неопределено Тогда
		//считаем, что все подходит => поставить условие ИСТИНА
		УсловиеПоСКД = " ИСТИНА ";
	Иначе
		//получить текст запроса СКД и вычленить из него блок с условиями ГДЕ
		НастройкиСКД = СКД.НастройкиПоУмолчанию;
		КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(НастройкиСКД.ПараметрыДанных, НастройкиСКДОтбор.ПараметрыДанных);
		КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(НастройкиСКД.Отбор, НастройкиСКДОтбор.Отбор);
		
		КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
		МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиСКД,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
		ТекстЗапросаСКД = МакетКомпоновки.НаборыДанных.Получить(0).Запрос;
		Параметры = МакетКомпоновки.ЗначенияПараметров;
		
		ТекстЗапросаСКД = Сред(ТекстЗапросаСКД, Найти(ТекстЗапросаСКД, "
		|ГДЕ
		|"));
		
		Поз = Найти(ТекстЗапросаСКД, "УПОРЯДОЧИТЬ ПО");
		Если Поз > 0 Тогда
			ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, Поз-1);
		КонецЕсли;
		
		ТекстЗапросаСКД = " " + СокрЛП(СтрЗаменить(ТекстЗапросаСКД, "
		|ГДЕ", "")); //пробел в начало добавляется, чтобы для текстов, где все условие НЕ заключено в скобки, чтобы не писать для этой ситуации специальный поиск и замену для поля, которое в начале строки текста запроса
		
		Если ИмяТаблицыВЗапросе <> "" Тогда
			Для каждого ТекПоле Из СоответствиеЗамен Цикл				
				ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, " " + ТекПоле.Ключ + ".", " " + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение + ".");
				ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, Символы.Таб + ТекПоле.Ключ + ".", Символы.Таб + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение + ".");
				ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, Символы.ПС + ТекПоле.Ключ + ".", Символы.ПС + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение + ".");
				ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "(" + ТекПоле.Ключ + ".", "(" + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение + ".");
				
				ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, " " + ТекПоле.Ключ, " " + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение);
				ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, Символы.Таб + ТекПоле.Ключ, Символы.Таб + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение);
				ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, Символы.ПС + ТекПоле.Ключ, Символы.ПС + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение);
				ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "(" + ТекПоле.Ключ, "(" + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение);
			КонецЦикла;		
		КонецЕсли;
			
		Для каждого ТекПараметр Из Параметры Цикл
			//заменяем в несколько итераций, чтобы не испортить текст запроса, т.к. все параметры однотипные: &П, &П1 и т.д.
			ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + " ", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + " ");              	//если после параметра пробел
			ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + ",", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + ",");              	//если после параметра ","
			ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + Символы.ПС, "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + Символы.ПС);	//если после параметра перевод строки
			ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + ")", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + ")");				//если после параметра ")" - например, когда используется условие В (&П1)
			Если Прав(ТекстЗапросаСКД, СтрДлина("&" + ТекПараметр.Имя)) = "&" + ТекПараметр.Имя Тогда																		//если параметр в конце текста запроса
				ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, СтрДлина(ТекстЗапросаСКД) - СтрДлина("&" + ТекПараметр.Имя)) + "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя
			КонецЕсли;
			Запрос.УстановитьПараметр(ПрефиксИмениПараметра + "_" + ТекПараметр.Имя, ТекПараметр.Значение);
		КонецЦикла;
		
		УсловиеПоСКД = ?(ЭтоИсключение, " НЕ ", "") + " (" + ТекстЗапросаСКД + ")";
	КонецЕсли;
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&" + ИмяПараметраОтбора, УсловиеПоСКД);
	
КонецПроцедуры
Показать


3. Так же в расширение общего модуля СегментыВызовСервера закинул использующуюся выше функцию:

Функция FH_ПолучитьНастройкиСписка(СегментСсылка) Экспорт
	
		Возврат ПолучитьНастройкиСписка(СегментСсылка);
	
	КонецФункции


Я планирую, что динамические сегменты или вообще условия из СКД буду использовать в различных местах, поэтому в общем модуле, но можно все нужное перекинуть и в саму обработку, должно работать.
73. sommid 23.03.23 10:06 Сейчас в теме
(72) при тестировании в новых условиях выяснилось, что такой подход работает только если отборы накладываются на реквизиты справочников, при использовании дополнительных реквизитов не работает (. Пока думаю, что с этим можно сделать.
74. sommid 23.03.23 11:04 Сейчас в теме
(73) пока только такой вариант получился: не через шуструю работу из-за применения "ГДЕ" условий из СКД, а через ГДЕ (Номенклатура, Характеристика) В (<ТекстЗапросаСКД>), т.е. будет полная выборка всех товаров по условиям СКД, что дольше, но зато работает при использовании дополнительных реквизитов, так же есть некоторые допущения.
Проверял на Розница 2.3 на сегменте номенклатуры с использованием отбора по дополнительным реквизитам

в предыдущем варианте заменил применение отбора по сегменту на функцию:
//дополнение "полным" отбором по динамическому сегменту номенклатуры через условие (Номенклатура, Характеристика) В (...запрос самой выборки товаров СКД...)
//	- так будет дольше работать, но можно использовать случаи, когда используются дополнительные реквизиты
Процедура ДополнитьЗапросПолнымОтборомПоСегментуНоменклатуры(Запрос, СегментНоменклатуры, ИмяТаблицыВЗапросе, ИмяПараметраОтбораПоСегменту, ИсключениеТоваровСегмента=Ложь, ПрефиксИмениПараметра="") Экспорт
	
	Настройки = СегментыВызовСервера.FH_ПолучитьНастройкиСписка(СегментНоменклатуры);
	СКД = Настройки.СКД;
	НастройкиСКДОтбор = Настройки.Настройки;
	
	НастройкиСКД = СКД.НастройкиПоУмолчанию;
	КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(НастройкиСКД.ПараметрыДанных, НастройкиСКДОтбор.ПараметрыДанных);
	КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(НастройкиСКД.Отбор, НастройкиСКДОтбор.Отбор);
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиСКД,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	ТекстЗапросаСКД = МакетКомпоновки.НаборыДанных.Получить(0).Запрос;
	Параметры = МакетКомпоновки.ЗначенияПараметров;
	
	//привести текст запроса к виду для использования в отборе вида (Номенклатура, Характеристика) В (<текст запроса СКД>) => убрать РАЗРЕШЕННЫЕ, упорядочивание, оставить в выборке 2 поля, считаем, что они идут первыми
	ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, " РАЗРЕШЕННЫЕ", " ");
	
	Поз = Найти(ТекстЗапросаСКД, "УПОРЯДОЧИТЬ ПО");
	Если Поз > 0 Тогда
		ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, Поз-1);
	КонецЕсли;
	
	ПозС = Найти(ТекстЗапросаСКД, "КАК Характеристика") + СтрДлина("КАК Характеристика") - 1;
	ПозПо = Найти(ТекстЗапросаСКД, "ИЗ
									|	Справочник.Номенклатура") - 1;
	ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, ПозС) + Сред(ТекстЗапросаСКД, ПозПо);
	
	//при необходимости приведение имен параметров к уникальным, если вдруг данная функция применяется в цикле
	Для каждого ТекПараметр Из Параметры Цикл
		//заменяем в несколько итераций, чтобы не испортить текст запроса, т.к. все параметры однотипные: &П, &П1 и т.д.
		ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + " ", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + " ");              	//если после параметра пробел
		ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + ",", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + ",");              	//если после параметра ","
		ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + Символы.ПС, "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + Символы.ПС);	//если после параметра перевод строки
		ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + ")", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + ")");				//если после параметра ")" - например, когда используется условие В (&П1)
		Если Прав(ТекстЗапросаСКД, СтрДлина("&" + ТекПараметр.Имя)) = "&" + ТекПараметр.Имя Тогда																		//если параметр в конце текста запроса
			ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, СтрДлина(ТекстЗапросаСКД) - СтрДлина("&" + ТекПараметр.Имя)) + "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя
		КонецЕсли;
		Запрос.УстановитьПараметр(ПрефиксИмениПараметра + "_" + ТекПараметр.Имя, ТекПараметр.Значение);
	КонецЦикла;
	
	УсловиеПоСКД = ?(ИсключениеТоваровСегмента, " НЕ ", "") + "(" + ИмяТаблицыВЗапросе + ".Номенклатура, " + ИмяТаблицыВЗапросе + ".Характеристика) В (" + ТекстЗапросаСКД + ")";
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&" + ИмяПараметраОтбораПоСегменту, УсловиеПоСКД);
	
КонецПроцедуры
Показать
75. fixin 4254 24.03.23 13:44 Сейчас в теме
(74) думаю, стоит просто рассчитать динамический сегмент заранее, нет?
76. sommid 27.03.23 12:54 Сейчас в теме
(75) изначально пробовали такой вариант, но он очень быстро перестал быть применим: магазинов много разнобрендовых, акции периодически меняются, новые сегменты появляются, очень быстро начали стопориться сегменты с обновлением по расписанию, скорее всего, потому что были достаточно большие списки результата. В итоге постоянные звонки с магазинов - почему товар не бьется по акции - потому что пришел в недавнем поступлении, все правила, чтобы он попал в акцию соблюдены, но вот обновление сегмента не сработало и скидки в чеке нет. В итоге перешли на динамические и назад возвращаться точно желания нету.
77. fixin 4254 27.03.23 16:08 Сейчас в теме
(76) ок. но я бы добился контроля расчета сегментов. Так проще, а значит надежнее.
80. suvolod 28 26.04.24 10:53 Сейчас в теме
Обработка достойная, но есть нюансы.
У меня стояла задача дать скидку 20% на каждые вторые джинсы в чеке. Что заметил.
1) Обработка не учитывает список исключаемой номенклатуры, который указан в настройках магазина. Обойти это можно, прописав этот список повторно в основном сегменте, на который дается скидка, но по хорошему хотелось бы в настройках увидеть галочку "Учитывать список исключаемой номенклатуры"

2) Самый большой вопрос возник с одновременным использованием дисконтных карт и скидок, рассчитываемых этой обработкой. Решить его с дефолтной обработкой не смогли. Есть накопительные дисконтные карты, по которым дается скидка 5...15%. Плюс нужно дать скидку на каждые вторые джинсы, но при этом занулить скидку по первым джинсам, которая дана другой маркетинговой акцией. Игрались с порядком применения, вытеснением и т.д, но ничего не получилось. Сейчас это работает так: на вторые джинсы дается скидка 20%, а на первые дается скидка 5-15% по дисконтной карте. Т.е неправильно. Опять же, хотелось бы галочку "Обнулять автоматические скидки на первую позицию в чеке"
81. fixin 4254 26.04.24 15:38 Сейчас в теме
(80) я пока не развиваю обработку, т.к. не знаю, работает она в 3.0 или нет, а клиентов на 3.0 под нее не было.
Последняя версия 2022-08-28

по "Учитывать список исключаемой номенклатуры" временно можно разрулить произвольным условием, например, проверить, есть ли товар в списке и если нет, обнулить скидку.

По дисконткам можно посмотреть галочку "Учитывать предыдущие скидки"

Но там немного другое - сортировка тогда идет по цене со скидкой и процент отсчитывается от цены со скидкой.
Так не зануляется.

				Если УчитыватьПредыдущиеСкидки Тогда
					ТекЦена = ТоварСегмента.ЦенаСоСкидкой;
				Иначе
					ТекЦена = ТоварСегмента.Цена;
				КонецЕсли;


"Обнулять автоматические скидки на первую позицию в чеке" тоже можно реализовать произвольным условием, если речь про скидки, устанавливаемые этой обработкой, а не более ранее установленные.
Прикрепленные файлы:
Оставьте свое сообщение