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

06.11.22

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
2020.08.28 для Розница 2.3.11.33. Платформа 8.3.20.2076 Актуальная
.epf 20,79Kb
25
25 Скачать (2 SM) Купить за 2 150 руб.
2020.01.22 для Розница 2.2.5.23. Платформа 8.3.14.1630
.epf 18,60Kb
72
72 Скачать (2 SM) Купить за 2 150 руб.

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

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

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

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

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

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

Рассмотрим пример скидки 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С 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    796331    4903    9546    

2858

SALE! 20%

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

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

8970 7176 руб.

15.12.2015    170789    955    364    

400

ККМ Кассовые операции Розничная торговля Обмен с ГосИС Программист Бухгалтер Пользователь Бухгалтерский учет Оперативный учет Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение конфигурации для УТ 11.5, КА 2.5 ,ERP 2.5 (Управляемые формы) позволяет выполнять печать кассовых чеков на одну ККМ 54-ФЗ с нескольких рабочих мест. НИКАКИХ НАСТРОЕК В РАЗРАБОТКЕ - ПОДКЛЮЧИЛ И ПЕЧАТАЙ. Если у вас несколько отделов и одна ККМ - печатайте на одной ККМ! Если у вас две ККМ и одна поломалась - печатайте на одной ККМ, пока ремонтируете другую!

4500 руб.

27.08.2018    122177    1025    584    

864

SALE! 25%

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 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 или интернет. Поддержка маркировки и разрешительного режима.

5880 4410 руб.

25.05.2015    335548    1956    3058    

1031

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

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий (тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.

44000 руб.

08.11.2017    122939    292    140    

398

Управление взаимоотношениями с клиентами (CRM) Оптовая торговля Розничная торговля Пользователь Платформа 1С v8.3 Оперативный учет Управляемые формы 1С:Управление торговлей 10 1С:Розница 2 Россия Управленческий учет Платные (руб)

Подсистема призвана упростить и автоматизировать процесс расчета и начисления бонусов покупателей. Бонусная система работает с конфигурациями 1С:УТ 10.3, 1С:Розница. Механизм реализован в начале 2013г. и работает до сих пор с постоянными совершенствованиями.

30000 руб.

02.11.2015    112283    102    87    

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

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

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

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

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

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

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

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

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

СуммаСкидки = Окр(КоличествоСкидки * ТоварСегмента.Цена * ПроцентСкидки / 100, ОкруглятьСуммуДо);
Прикрепленные файлы:
18. user834076 05.12.18 00:50 Сейчас в теме
Сергей, добрый день! А можно настроить скидку на каждый 3-ий товар независимо от количества товаров в чеке? Если да, то можете помочь ее настроить в базе за доп плату!
20. fixin 4273 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 4273 08.12.18 00:01 Сейчас в теме
(19) напишите в fixin@mail.ru , пришлю последнюю версию, протестируете.
22. user896337 08.12.18 09:04 Сейчас в теме
55. Rasty_ 107 26.11.20 17:58 Сейчас в теме
(21) Сообщения на данный момент закрыты. Написал на почту)
23. fixin 4273 11.12.18 00:22 Сейчас в теме
думаю, на этих выходных выложу апдейт обработки. исправлены будут ошибки и добавлено несколько новых возможностей. Алгоритм станет более надежным и качественным.
все возможности апробированы на клиентах.
24. fixin 4273 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 4273 15.05.19 13:20 Сейчас в теме
(25) в протоколе все правильно, похоже, что 105 и 175 не суммируются, т.к. в одной строке сразу 3 штуки товара. Видимо, ошибка, что не суммируются скидки в одну строку. Проверю, поправлю. Напишите мне на fixin@mail.ru, вышли исправление.

И не обязательно заполнять поле "давать скидку при наличии товара в чеке". Он же у вас и так есть.
27. fixin 4273 16.05.19 08:41 Сейчас в теме
(25) Какую версию используете?
По скриншоту видно, что на закладке (скидки) всего одна строка, а должно быть две.
Я воспроизвел ситуацию, в последней версии обработки все работает. Пишите в личку, вышлю версию (которая здесь последняя).
28. pererva98 27.09.19 18:15 Сейчас в теме
Добрый вечер! Не работает обработка. Пишет недействительный адрес или не найден родительский сеанс задания
Прикрепленные файлы:
29. fixin 4273 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 4273 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 4273 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 4273 06.11.19 20:19 Сейчас в теме
(39) обратитесь ко мне за последней версией в лычку, вышлю, она умеет намного больше.
42. grinlawyer 08.02.20 14:17 Сейчас в теме
Здравствуйте, а можно тоже узнать про последнюю версию grinlawyer@yandex.ru
(40)
44. fixin 4273 17.02.20 19:02 Сейчас в теме
(39) приведите пример. Думаю, что да.
Там все очень гибко, можно даже свои условия писать.
41. grinlawyer 08.02.20 14:16 Сейчас в теме
Здравствуйте, а можно тоже узнать про последнюю версию grinlawyer@yandex.ru
43. fixin 4273 17.02.20 18:56 Сейчас в теме
(41) по многочисленным просьбам выложил последнюю версию здесь.
45. pererva98 04.03.20 21:21 Сейчас в теме
Розница 2.3.3.19
При подборе товаров в Чек ошибка
Прикрепленные файлы:
46. fixin 4273 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 4273 18.06.20 20:39 Сейчас в теме
а ваши покупатели не запутаются в такой сложной схеме? ;-)
Сбрасывать количество в единицу после 3х, например - значит после каждого третьего товара считать первым.
Цена по скидке - если поставите 1, то будет по рублю.

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

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

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

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

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

Показать


При этом сегмент не назначайте, пусть проверяются все товары чека
70. timunya 8 26.07.22 12:39 Сейчас в теме
День добрый немного запутался в описании :)
как настроить чтобы была скидка кратная количеству из определенного сегмента номенклатуры, но сама скидка считалась сначала на самые дешевые товары (и они могут быть не в сегменте , а любые )
71. fixin 4273 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 4273 24.03.23 13:44 Сейчас в теме
(74) думаю, стоит просто рассчитать динамический сегмент заранее, нет?
76. sommid 27.03.23 12:54 Сейчас в теме
(75) изначально пробовали такой вариант, но он очень быстро перестал быть применим: магазинов много разнобрендовых, акции периодически меняются, новые сегменты появляются, очень быстро начали стопориться сегменты с обновлением по расписанию, скорее всего, потому что были достаточно большие списки результата. В итоге постоянные звонки с магазинов - почему товар не бьется по акции - потому что пришел в недавнем поступлении, все правила, чтобы он попал в акцию соблюдены, но вот обновление сегмента не сработало и скидки в чеке нет. В итоге перешли на динамические и назад возвращаться точно желания нету.
77. fixin 4273 27.03.23 16:08 Сейчас в теме
(76) ок. но я бы добился контроля расчета сегментов. Так проще, а значит надежнее.
80. suvolod 28 26.04.24 10:53 Сейчас в теме
Обработка достойная, но есть нюансы.
У меня стояла задача дать скидку 20% на каждые вторые джинсы в чеке. Что заметил.
1) Обработка не учитывает список исключаемой номенклатуры, который указан в настройках магазина. Обойти это можно, прописав этот список повторно в основном сегменте, на который дается скидка, но по хорошему хотелось бы в настройках увидеть галочку "Учитывать список исключаемой номенклатуры"

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

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

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

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

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


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