Скидка на количество для Розницы 2.2
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Порядок настройки обработки
Обработка добавляется во внешние обработки:

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

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

Настройка внешней обработки
Рассмотрим пример скидки 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
Вступайте в нашу телеграмм-группу Инфостарт
См. также
ККМ Кассовые операции Розничная торговля НДС 22% Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения Россия Платные (руб)
Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1, ФФД 1.2). Подключайте любую онлайн кассу к практически любой конфигурации на обычных формах. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Поддерживает разрешительный режим и маркировку. Поддерживает локальный модуль честного знака для офлайн проверки. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows Адаптировано к ставке НДС 22% и ТС ПИоТ.
6100 руб.
27.02.2017 918832 6631 10489
Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Анализ продаж Пользователь 1С:Предприятие 7.7 1С:Предприятие 8 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 1.х 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 10 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)
Автоматизация заказа поставщику через 1С. Загрузка прайсов, анализ цен, управление заказами в УТ 10.3, УТ 11, КА2, УНФ, УПП, ERP, Розница 2
39141 руб.
21.04.2017 113525 212 44
Оптовая торговля Розничная торговля Обмен с ГосИС Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1C:Бухгалтерия Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)
Решение создано для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Задавайте вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, накоплен опыт и знания по данным темам.
20900 руб.
18.03.2019 128362 111 115
Оптовая торговля Розничная торговля Обмен с ГосИС Бухгалтер 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)
Автоматизация учета ЕГАИС в 1С для оптовой торговли, производства и импорта алкогольной продукции. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.
1091 руб.
15.12.2015 188379 1403 374
Рабочее место Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)
Расширение для работы с номенклатурой: отображение остатков, цен, изображений, аналитики по каждой позиции, подбор товаров в документы через корзину и оптимизация интерфейса.
17284 руб.
26.04.2016 688146 1573 669
Разработка Адаптация типовых решений Производство готовой продукции (работ, услуг) Розничная торговля 1С:Управление торговлей 10 Россия Платные (руб)
Доработка для 1С:Управление торговлей 10.3 (релиз 10.3.88.3) добавляет поддержку маркировки новых категорий товаров согласно постановлениям Правительства РФ 2025–2026 гг. Конфигурация УТ 10.3 снята с поддержки — новые маркируемые категории в типовую поставку больше не попадают. Доработка закрывает этот пробел: новые виды номенклатуры, обмен с ГИС МТ «Честный Знак». Поставляется в виде файла .cf
14640 руб.
23.04.2026 5443 49 13
ККМ Кассовые операции Розничная торговля НДС 22% Системный администратор Разработчик 1С:Предприятие 8 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 или интернет. Поддержка маркировки и разрешительного режима. Поддержка пробития чеков с новыми ставками НДС 5%, НДС 7% и НДС 22%.
7900 руб.
25.05.2015 406048 2036 3372
Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Обмен с ГосИС Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1C:Бухгалтерия Сельское хозяйство и рыболовство Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Пищевая промышленность Россия Бухгалтерский учет Управленческий учет Платные (руб)
Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий (тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.
11000 руб.
08.11.2017 132050 293 153
Допустим, покупают:
Туфли 1000 рублей
Ботинки 2000 рублей.
Акция - скидка 10% на второй товар в чеке по цене.
Соответственно скидка будет даваться на туфли, как более дешевый товар.
Т.е. будет 100 рублей.
все алгоритмически прозрачно и таких акций пруд пруди, обычно на обувь и вещи.
Скидка дается на товары из сегмента, а не на все товары в чеке.
Акционный не учитывает, это вам надо дописать, или создать сегмент без акционных товаров, если хотите. Но и так востребована.
Часто такая скидка дается в обувных и одежных - скидка на вторую, третью и далее пару. Причем первой считается самая дорогая.
-поле "Количество товаров 2" используется альтернативно с "Количество товаров 1" или одновременно (если 2-е, при какой прикладной логике);
-опция "Точное количество" за что отвечает?
- последняя опция "При наличии товара из сегмента в чеке" - содержит скидку, кот. надо предварительно создать в справочнике? А значение скидки тогда берется из этого элемента или из "Процент скидки", не совсем ясно.
Спасибо.
Можно указать количество 1 = 1, количество 2 = 3, тогда за 1 и 2-ю пару будет процент 1, а за 3ю, 4ю и т.д - процент 2. Если не указывать количество 2 (ноль), то только первый порог используется.
Точное количество - обозначает, что не количество1 (количество2) и выше, а именно на такое количество. Т.е. в прошлом примере действует на 1-ю пару и третью. На вторую скидки нет.
Последняя опция обозначает наличие определенного товара-маркера в чеке, который будет активизировать скидку. Например, скидка дается только при наличии в чеке купона (у нас была такая услуга за 1 копейку)...
Эти купоны добавлялись в сегмент "Купоны".
Всё из практики.
Мои настройки:
- Сегмент номенклатуры выбран
- Количество товаров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
Так же не работает сортировка и не работает порог. Исправьте пожалуйста обработку
И не обязательно заполнять поле "давать скидку при наличии товара в чеке". Он же у вас и так есть.
По скриншоту видно, что на закладке (скидки) всего одна строка, а должно быть две.
Я воспроизвел ситуацию, в последней версии обработки все работает. Пишите в личку, вышлю версию (которая здесь последняя).
(40)
Переименовали ПолучитьОписаниеТиповЧисла в ОписаниеТиповЧисла
ВсеТовары.Колонки.Добавить("СуммаВГруппе", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(15, 2));
ВсеТовары.Колонки.Добавить("СуммаБезСкидки", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(15, 2));
Вынес в свою функцию:
Функция ПолучитьОписаниеТиповЧисла(Разрядность, РазрядностьДробнойЧасти) Экспорт
Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Разрядность, РазрядностьДробнойЧасти));
КонецФункцииИ вызов:
ВсеТовары.Колонки.Добавить("СуммаВГруппе", ПолучитьОписаниеТиповЧисла(15, 2));
ВсеТовары.Колонки.Добавить("СуммаБезСкидки", ПолучитьОписаниеТиповЧисла(15, 2));Обновил.
при продаже 2 шт. товаров третий продается по фиксированной цене =1 руб (ну цена может меняться). При этом товар подсчитываемый =2 шт. может быть одиночным (например, носки черные муж арт..597852,), а может подсчитывать в указанном сегменте (например, при покупки 2 шт. из сегмента носки женские шерстяные -любая 3 пара продается по цене 1 руб)? Цены (по крайней мере пока) в сегменте на каждый товар одна и та же-сегмент объединяет одинаковый товар с разными характеристиками (цвет, размер и т.д). Но характеристики мы не используем -справочник линейный.
Также используется кратность продаж -если продали 4 шт. -уже 2шт идут по цене 1р., если 6 -уже 3шт. по 1 рублю и т.д.
Ну и порог количества продажи возможно может меняться -на некоторый товар могут назначить порог =3шт.
Можно ли как то выделить продажу товаров по акции? Т.е. для дальнейших отчетов сделать выборку проданных товаров по 1р.в рамках акции?
Сбрасывать количество в единицу после 3х, например - значит после каждого третьего товара считать первым.
Цена по скидке - если поставите 1, то будет по рублю.
Если этого не хватит - можно доработать, наверное.
Но основы заложены.
Если один товар продается в количестве 3 шт, то обработка да, может считать на третий скидку, если например, на каждый третий.
Сделал ему доработку, чтобы при расчете скидок сохранялся порядок строк.
Потому что там розница и чеки длинные, скидки постоянно случайным образом пересчитываются, поэтому сортирую товар по номеру строки.
Далее, он попросил галочку, чтобы сделать возможность подсчитывать товар в сегменте. Чтобы давать товар на каждую 3-ю вилку, на каждую 3-ю ложку, например, а не на каждый третий товар из сегмента "Столовая посуда", например.
Сейчас на тестировании, как протестирует, опубликую тут обновления.
Дело в том что по условиям акции на товары в ней участвующие бонусы не должны начисляться. А бонусы у нас не начисляются только на товары, по которым была скидка.
Скидка дается на товар из Сегмента А, если в чеке есть товар из Сегмента Б. Но это должно быть кратно - сколько в чеке товаров Б, на столько товаров А и можно дать скидку.
Например,
- чек 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 шт товара А
Если НЕ Кэш.Свойство("ТоваровСегментаБ") Тогда
Кэш.Вставить("СегментА", Справочники.СегментыНоменклатуры.НайтиПоНаименованию("Вино красное", истина));
Кэш.Вставить("СегментБ", Справочники.СегментыНоменклатуры.НайтиПоНаименованию("Вино белое", истина));
Кэш.Вставить("ТоваровСегментаБ", 0);
Для Каждого ТоварСегментаДоп ИЗ ТоварыСегмента Цикл
ЭтоБ = СегментыВызовСервера.ВходитВСегмент(ТоварСегментаДоп.Номенклатура, Кэш.СегментБ);
Если ЭтоБ Тогда
Кэш.ТоваровСегментаБ = Кэш.ТоваровСегментаБ + 1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЭтоА = СегментыВызовСервера.ВходитВСегмент(ТоварСегмента.Номенклатура, Кэш.СегментА);
Если ЭтоА Тогда
Р = НакопительКоличество <= Кэш.ТоваровСегментаБ;
КонецЕсли;
ПоказатьПри этом сегмент не назначайте, пусть проверяются все товары чека
как настроить чтобы была скидка кратная количеству из определенного сегмента номенклатуры, но сама скидка считалась сначала на самые дешевые товары (и они могут быть не в сегменте , а любые )
Для меня было важно:
1. "выгодное" формирование наборов для скидки, то есть самый дешевый товар, по которому будет рассчитываться сумма скидки, дополняется самым дорогим
2. использование динамических сегментов номенклатуры
3. исключение уценки (но тут специфика своей конфигурации, где ведется 2 разных вида цены, сравнение которых позволяет определить уцененный товар или нет)
4. распределение суммы скидки по товарам набора пропорционально стоимости товаров этого набора
Возможно, будет полезен пример использования динамических сегментов:
1. Модификация запроса получения ТоварыСегмента в подключаемой обработке по скидке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.КлючСвязи КАК КлючСвязи,
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Количество КАК Количество,
| Товары.Сумма КАК Сумма,
| Товары.СуммаВГруппе КАК СуммаВГруппе,
| Товары.СуммаБезСкидки КАК СуммаБезСкидки
|ПОМЕСТИТЬ ТоварыДокумента
|ИЗ
| &ВсеТовары КАК Товары
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Товары.КлючСвязи КАК КлючСвязи,
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Количество КАК Количество,
| Товары.Сумма КАК Сумма,
| Товары.СуммаВГруппе КАК СуммаВГруппе,
| Товары.СуммаБезСкидки КАК СуммаБезСкидки
|ИЗ
| ТоварыДокумента КАК Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатураСегмента КАК НоменклатураСегмента
| ПО (НоменклатураСегмента.Сегмент = &Сегмент)
| И Товары.Номенклатура = НоменклатураСегмента.Номенклатура
| И Товары.Характеристика = НоменклатураСегмента.Характеристика
| И (НЕ &ФормироватьДинамически)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Товары.КлючСвязи,
| Товары.Номенклатура,
| Товары.Характеристика,
| Товары.Количество,
| Товары.Сумма,
| Товары.СуммаВГруппе,
| Товары.СуммаБезСкидки
|ИЗ
| ТоварыДокумента КАК Товары
|ГДЕ
| &УсловиеПоДинамическомуСегменту
| И &ФормироватьДинамически";
Запрос.УстановитьПараметр("ВсеТовары", ВсеТовары);
Запрос.УстановитьПараметр("Сегмент", СегментНоменклатуры);
Запрос.УстановитьПараметр("ФормироватьДинамически", (СегментНоменклатуры.СпособФормирования = Перечисления.СпособыФормированияСегментов.ФормироватьДинамически));
FH_ОбщегоНазначенияСервер.ДополнитьЗапросОтборомПоСегментуНоменклатуры(Запрос, СегментНоменклатуры, "Товары", "УсловиеПоДинамическомуСегменту");
ТоварыСегмента = Запрос.Выполнить().Выгрузить(); Показать2. Функции общего модуля по подстановке условия по данным сегмента:
Процедура ДополнитьЗапросОтборомПоСегментуНоменклатуры(Запрос, СегментНоменклатуры, ИмяТаблицыВЗапросе, ИмяПараметраОтбораПоСегменту, ИсключениеТоваровСегмента=Ложь, ПрефиксИмениПараметра="") Экспорт
Настройки = СегментыВызовСервера.FH_ПолучитьНастройкиСписка(СегментНоменклатуры);
СКД = Настройки.СКД;
НастройкиСКДОтбор = Настройки.Настройки;
СоответствиеЗамен = Новый Соответствие;
СоответствиеЗамен.Вставить("Номенклатура", "Номенклатура");
СоответствиеЗамен.Вставить("Характеристика", "Характеристика");
ДополнитьЗапросОтборомПоОтборуСКД(Запрос, СКД, НастройкиСКДОтбор, ИмяТаблицыВЗапросе, ИмяПараметраОтбораПоСегменту, СоответствиеЗамен, ИсключениеТоваровСегмента, ПрефиксИмениПараметра);
КонецПроцедуры
Процедура ДополнитьЗапросОтборомПоОтборуСКД(Запрос, СКД, НастройкиСКДОтбор, ИмяТаблицыВЗапросе, ИмяПараметраОтбора, СоответствиеЗамен, ЭтоИсключение=Ложь, ПрефиксИмениПараметра="") Экспорт
//СоответствиеЗамен - как поля исходного запроса заменяем под реальный, где хотим использовать отбор
//например для ПравилаОпределенияДополнительногоКодаТНВЭД: КлассификаторКодовТНВЭД -> ИмяТаблицыВЗапросе + "." + "Номенклатура.КодТНВЭД"
//например для СегментыНоменклатуры: Номенклатура -> ИмяТаблицыВЗапросе + "." + Номенклатура
//например для СегментыНоменклатуры: ХарактеристикиНоменклатуры -> ИмяТаблицыВЗапросе + "." + Характеристика
Если НастройкиСКДОтбор = Неопределено Тогда
//считаем, что все подходит => поставить условие ИСТИНА
УсловиеПоСКД = " ИСТИНА ";
Иначе
//получить текст запроса СКД и вычленить из него блок с условиями ГДЕ
НастройкиСКД = СКД.НастройкиПоУмолчанию;
КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(НастройкиСКД.ПараметрыДанных, НастройкиСКДОтбор.ПараметрыДанных);
КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(НастройкиСКД.Отбор, НастройкиСКДОтбор.Отбор);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиСКД,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ТекстЗапросаСКД = МакетКомпоновки.НаборыДанных.Получить(0).Запрос;
Параметры = МакетКомпоновки.ЗначенияПараметров;
ТекстЗапросаСКД = Сред(ТекстЗапросаСКД, Найти(ТекстЗапросаСКД, "
|ГДЕ
|"));
Поз = Найти(ТекстЗапросаСКД, "УПОРЯДОЧИТЬ ПО");
Если Поз > 0 Тогда
ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, Поз-1);
КонецЕсли;
ТекстЗапросаСКД = " " + СокрЛП(СтрЗаменить(ТекстЗапросаСКД, "
|ГДЕ", "")); //пробел в начало добавляется, чтобы для текстов, где все условие НЕ заключено в скобки, чтобы не писать для этой ситуации специальный поиск и замену для поля, которое в начале строки текста запроса
Если ИмяТаблицыВЗапросе <> "" Тогда
Для каждого ТекПоле Из СоответствиеЗамен Цикл
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, " " + ТекПоле.Ключ + ".", " " + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение + ".");
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, Символы.Таб + ТекПоле.Ключ + ".", Символы.Таб + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение + ".");
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, Символы.ПС + ТекПоле.Ключ + ".", Символы.ПС + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение + ".");
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "(" + ТекПоле.Ключ + ".", "(" + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение + ".");
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, " " + ТекПоле.Ключ, " " + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение);
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, Символы.Таб + ТекПоле.Ключ, Символы.Таб + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение);
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, Символы.ПС + ТекПоле.Ключ, Символы.ПС + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение);
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "(" + ТекПоле.Ключ, "(" + "" + ИмяТаблицыВЗапросе + "." + ТекПоле.Значение);
КонецЦикла;
КонецЕсли;
Для каждого ТекПараметр Из Параметры Цикл
//заменяем в несколько итераций, чтобы не испортить текст запроса, т.к. все параметры однотипные: &П, &П1 и т.д.
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + " ", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + " "); //если после параметра пробел
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + ",", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + ","); //если после параметра ","
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + Символы.ПС, "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + Символы.ПС); //если после параметра перевод строки
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + ")", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + ")"); //если после параметра ")" - например, когда используется условие В (&П1)
Если Прав(ТекстЗапросаСКД, СтрДлина("&" + ТекПараметр.Имя)) = "&" + ТекПараметр.Имя Тогда //если параметр в конце текста запроса
ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, СтрДлина(ТекстЗапросаСКД) - СтрДлина("&" + ТекПараметр.Имя)) + "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя
КонецЕсли;
Запрос.УстановитьПараметр(ПрефиксИмениПараметра + "_" + ТекПараметр.Имя, ТекПараметр.Значение);
КонецЦикла;
УсловиеПоСКД = ?(ЭтоИсключение, " НЕ ", "") + " (" + ТекстЗапросаСКД + ")";
КонецЕсли;
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&" + ИмяПараметраОтбора, УсловиеПоСКД);
КонецПроцедуры Показать3. Так же в расширение общего модуля СегментыВызовСервера закинул использующуюся выше функцию:
Функция FH_ПолучитьНастройкиСписка(СегментСсылка) Экспорт
Возврат ПолучитьНастройкиСписка(СегментСсылка);
КонецФункцииЯ планирую, что динамические сегменты или вообще условия из СКД буду использовать в различных местах, поэтому в общем модуле, но можно все нужное перекинуть и в саму обработку, должно работать.
Проверял на Розница 2.3 на сегменте номенклатуры с использованием отбора по дополнительным реквизитам
в предыдущем варианте заменил применение отбора по сегменту на функцию:
//дополнение "полным" отбором по динамическому сегменту номенклатуры через условие (Номенклатура, Характеристика) В (...запрос самой выборки товаров СКД...)
// - так будет дольше работать, но можно использовать случаи, когда используются дополнительные реквизиты
Процедура ДополнитьЗапросПолнымОтборомПоСегментуНоменклатуры(Запрос, СегментНоменклатуры, ИмяТаблицыВЗапросе, ИмяПараметраОтбораПоСегменту, ИсключениеТоваровСегмента=Ложь, ПрефиксИмениПараметра="") Экспорт
Настройки = СегментыВызовСервера.FH_ПолучитьНастройкиСписка(СегментНоменклатуры);
СКД = Настройки.СКД;
НастройкиСКДОтбор = Настройки.Настройки;
НастройкиСКД = СКД.НастройкиПоУмолчанию;
КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(НастройкиСКД.ПараметрыДанных, НастройкиСКДОтбор.ПараметрыДанных);
КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(НастройкиСКД.Отбор, НастройкиСКДОтбор.Отбор);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиСКД,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ТекстЗапросаСКД = МакетКомпоновки.НаборыДанных.Получить(0).Запрос;
Параметры = МакетКомпоновки.ЗначенияПараметров;
//привести текст запроса к виду для использования в отборе вида (Номенклатура, Характеристика) В (<текст запроса СКД>) => убрать РАЗРЕШЕННЫЕ, упорядочивание, оставить в выборке 2 поля, считаем, что они идут первыми
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, " РАЗРЕШЕННЫЕ", " ");
Поз = Найти(ТекстЗапросаСКД, "УПОРЯДОЧИТЬ ПО");
Если Поз > 0 Тогда
ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, Поз-1);
КонецЕсли;
ПозС = Найти(ТекстЗапросаСКД, "КАК Характеристика") + СтрДлина("КАК Характеристика") - 1;
ПозПо = Найти(ТекстЗапросаСКД, "ИЗ
| Справочник.Номенклатура") - 1;
ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, ПозС) + Сред(ТекстЗапросаСКД, ПозПо);
//при необходимости приведение имен параметров к уникальным, если вдруг данная функция применяется в цикле
Для каждого ТекПараметр Из Параметры Цикл
//заменяем в несколько итераций, чтобы не испортить текст запроса, т.к. все параметры однотипные: &П, &П1 и т.д.
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + " ", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + " "); //если после параметра пробел
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + ",", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + ","); //если после параметра ","
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + Символы.ПС, "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + Символы.ПС); //если после параметра перевод строки
ТекстЗапросаСКД = СтрЗаменить(ТекстЗапросаСКД, "&" + ТекПараметр.Имя + ")", "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя + ")"); //если после параметра ")" - например, когда используется условие В (&П1)
Если Прав(ТекстЗапросаСКД, СтрДлина("&" + ТекПараметр.Имя)) = "&" + ТекПараметр.Имя Тогда //если параметр в конце текста запроса
ТекстЗапросаСКД = Лев(ТекстЗапросаСКД, СтрДлина(ТекстЗапросаСКД) - СтрДлина("&" + ТекПараметр.Имя)) + "&" + ПрефиксИмениПараметра + "_" + ТекПараметр.Имя
КонецЕсли;
Запрос.УстановитьПараметр(ПрефиксИмениПараметра + "_" + ТекПараметр.Имя, ТекПараметр.Значение);
КонецЦикла;
УсловиеПоСКД = ?(ИсключениеТоваровСегмента, " НЕ ", "") + "(" + ИмяТаблицыВЗапросе + ".Номенклатура, " + ИмяТаблицыВЗапросе + ".Характеристика) В (" + ТекстЗапросаСКД + ")";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&" + ИмяПараметраОтбораПоСегменту, УсловиеПоСКД);
КонецПроцедуры ПоказатьУ меня стояла задача дать скидку 20% на каждые вторые джинсы в чеке. Что заметил.
1) Обработка не учитывает список исключаемой номенклатуры, который указан в настройках магазина. Обойти это можно, прописав этот список повторно в основном сегменте, на который дается скидка, но по хорошему хотелось бы в настройках увидеть галочку "Учитывать список исключаемой номенклатуры"
2) Самый большой вопрос возник с одновременным использованием дисконтных карт и скидок, рассчитываемых этой обработкой. Решить его с дефолтной обработкой не смогли. Есть накопительные дисконтные карты, по которым дается скидка 5...15%. Плюс нужно дать скидку на каждые вторые джинсы, но при этом занулить скидку по первым джинсам, которая дана другой маркетинговой акцией. Игрались с порядком применения, вытеснением и т.д, но ничего не получилось. Сейчас это работает так: на вторые джинсы дается скидка 20%, а на первые дается скидка 5-15% по дисконтной карте. Т.е неправильно. Опять же, хотелось бы галочку "Обнулять автоматические скидки на первую позицию в чеке"
Последняя версия 2022-08-28
по "Учитывать список исключаемой номенклатуры" временно можно разрулить произвольным условием, например, проверить, есть ли товар в списке и если нет, обнулить скидку.
По дисконткам можно посмотреть галочку "Учитывать предыдущие скидки"
Но там немного другое - сортировка тогда идет по цене со скидкой и процент отсчитывается от цены со скидкой.
Так не зануляется.
Если УчитыватьПредыдущиеСкидки Тогда
ТекЦена = ТоварСегмента.ЦенаСоСкидкой;
Иначе
ТекЦена = ТоварСегмента.Цена;
КонецЕсли;
"Обнулять автоматические скидки на первую позицию в чеке" тоже можно реализовать произвольным условием, если речь про скидки, устанавливаемые этой обработкой, а не более ранее установленные.
я немного не понял, а если нам надо даже в одной строке на второе количество товара делать скидку т.е тут уже цена одна и если две штуки взяли то на одну штуку скидка не распространяется а на вторую штуку и на четвертую и на шестую... распространяется в одной этой строке и также если вторая позиция из этого сегмента по той-же цене если она четная в общем количестве получается то и там также распределение скидки
или ваш алгоритм только на позиции списка товаров работает без учета количества?
Исключительная ситуация при проверке условия скидок внешней обработкой:
{ОбщийМодуль.СкидкиНаценкиСервер.Модуль(2395)}: Метод объекта не обнаружен (ПроверитьУсловие)
Розница 2.3.23.44
Обработка на ИС последнего релиза, в коде обработки нет вызова ПроверитьУсловие, значит вызывает какая-то типовая функция, надо понять какая.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 684346
Создание 10.10.17 08:44
Обновление 06.11.22 19:59
Просмотры 36616
Загрузки 189
Рейтинг
20
Комментарии 98
Код открыт Да
Рубрики Прайсы Розничная торговля Ценообразование, анализ цен
Кому Пользователь
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация 1С:Розница 2
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Розничная и сетевая торговля (FMCG)
Налоги Не имеет значения
Вид учета Управленческий учет
Доступ к файлу Абонемент ($m)