Задача реализовать систему, когда для определения цены продажи клиента на конкретную позицию номенклатуры используются заранее установленные правила расчёта от закупочной цены учитывая группу к которой принадлежит клиент (например Опт, Розница,VIP) и ценовую (или номенклатурную) группу номенклатуры (например обувь, продукты, электровозы)
Собственно говоря, в классических торгово-производственных конфигурациях (УТ10,УПП,КА) есть механизм, который почти нам подходит (это документ "Установка типов цен по группам номенклатуры для покупателей"). Не подходит этот механизм из за невозможности вместо контрагентов указывать правила для групп (так было 5 лет назад, и так осталось до сих пор).
Исправим это, попытавшись минимально вмешаться в типовую конфигурацию.
Идея решения была предоставленна (Alex141516) в 2008 году
Подсистемы ценообразования в УТ10,КА,УТ1.2 скорее всего идентичны, так как действия выполненные в древней УПП (1.2.22.3) оказались работоспособными в УТ (10.3.12)
Реализация: (простая до безобразия. )
1) В конфигураторе в документе «УстановкаТиповЦенПоГруппамНоменклатурыДляПокупателей» у реквизита «Контрагент»
В свойстве «Выбор групп и элементов» нужно поставить «Группы» и в форме у соответствующего элемента управления установить ВыборГруппИЭлементов = Группы
2) Для корректного вычисления цены необходимо подправить в общем модуле «Ценообразование» функцию ПолучитьЦенуНоменклатуры()
Вместо:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Контрагент", ДоговорКонтрагента.Владелец);
Запрос.УстановитьПараметр("Группы", ПолучитьМассивГруппНоменклатуры(Номенклатура));
Нужно написать:
Если ТипЗнч(ДоговорКонтрагента) = Тип("СправочникСсылка.Контрагенты") Тогда
Контр = ДоговорКонтрагента;
Иначе
Контр = ДоговорКонтрагента.Владелец.Родитель;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Контрагент", Контр);
Запрос.УстановитьПараметр("Группы", ПолучитьМассивГруппНоменклатуры(Номенклатура));
3) Для работоспособности подбора номенклатуры необходимо в обработке ПодборНоменклатуры в модуле объекта внутри процедуры ВременнаяТаблицаЦен(Запрос) поменять одну строчку.
Вместо:
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТипИЗГрупп.НоменклатурнаяЦеноваяГруппа КАК НоменклатурнаяЦеноваяГруппа,
| ТипИЗГрупп.ТипЦен КАК ТипЦен
|ПОМЕСТИТЬ ТипИЗГрупп
|ИЗ
| РегистрСведений.ТипыЦенПоГруппамНоменклатурыДляПокупателей.СрезПоследних(&ДатаРегистраСведений, Контрагент = &Контрагент) КАК ТипИЗГрупп
|ГДЕ
| НЕ ТипИЗГрупп.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.ПустаяСсылка)
|ИНДЕКСИРОВАТЬ ПО НоменклатурнаяЦеноваяГруппа
|";
Написать :
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТипИЗГрупп.НоменклатурнаяЦеноваяГруппа КАК НоменклатурнаяЦеноваяГруппа,
| ТипИЗГрупп.ТипЦен КАК ТипЦен
|ПОМЕСТИТЬ ТипИЗГрупп
|ИЗ
| РегистрСведений.ТипыЦенПоГруппамНоменклатурыДляПокупателей.СрезПоследних(&ДатаРегистраСведений, Контрагент = (&Контрагент).Родитель) КАК ТипИЗГрупп
|ГДЕ
| НЕ ТипИЗГрупп.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.ПустаяСсылка)
|ИНДЕКСИРОВАТЬ ПО НоменклатурнаяЦеноваяГруппа
|";
И в процедуре мКоманднаяПанельТаблицыХарактеристикНоменклатурыЗаполнить() поменять одну строчку.
Вместо:
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТипИЗГрупп.НоменклатурнаяЦеноваяГруппа КАК НоменклатурнаяЦеноваяГруппа,
| ТипИЗГрупп.ТипЦен КАК ТипЦен
|ПОМЕСТИТЬ ТипИЗГрупп
|ИЗ
| РегистрСведений.ТипыЦенПоГруппамНоменклатурыДляПокупателей.СрезПоследних(&ДатаРегистраСведений, Контрагент = &Контрагент) КАК ТипИЗГрупп
|ГДЕ
| НЕ ТипИЗГрупп.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.ПустаяСсылка)
|ИНДЕКСИРОВАТЬ ПО НоменклатурнаяЦеноваяГруппа
|";
Написать:
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТипИЗГрупп.НоменклатурнаяЦеноваяГруппа КАК НоменклатурнаяЦеноваяГруппа,
| ТипИЗГрупп.ТипЦен КАК ТипЦен
|ПОМЕСТИТЬ ТипИЗГрупп
|ИЗ
| РегистрСведений.ТипыЦенПоГруппамНоменклатурыДляПокупателей.СрезПоследних(&ДатаРегистраСведений, Контрагент = (&Контрагент).Родитель) КАК ТипИЗГрупп
|ГДЕ
| НЕ ТипИЗГрупп.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.ПустаяСсылка)
|ИНДЕКСИРОВАТЬ ПО НоменклатурнаяЦеноваяГруппа
|";
4) Корректировка (а лучше добавление во внешние) обработки ПечатьПрайсЛиста
Этот пункт не обязателен, т.к. на работоспособность механизма ценообразования не влияет, да и прайсы печатают не все. Изменения в обработке минимальны: необходимо добавить группировку колонок по группам контрагентов и подправить запрос. Для примера прикрепляю один из вариантов этой обработки.
Использование:
1) Создаём типы цен соответствующие наценкам (или скидкам) от базовой цены (например закупочной)
Да, в реальной жизни таких типов цен будет достаточно много, но ведь это не так важно т.к. пользователь больше почти не имеет дела с этим справочником, ведь цена для контрагента определяется теперь принадлежностью его к определённой группе (Опт, Розница,VIP).
2) Для каждой «нужной» группы контрагентов (Опт, Розница,VIP) Создаём по одному документу "Установка типов цен по группам номенклатуры для покупателей" где для каждой ценовой или номенклатурной группы (в зависимости от «вида операции» документа) устанавливаем тип цены (а по сути, процент скидки или наценки на базовый тип). Естественно у позиций справочника номенклатуры должна быть указана номенклатурная или ценовая группа.
Всё, теперь при выборе или подборе товара в документах цена будет назначаться в соответствии с указанными нами правилами.
P.S.0 Механизм работоспособный (практически типовой) и проверен годами, однако я мог упустить какие то моменты.
P.S.1 Конечно можно пойти другим путём. Например, создав АРМ для генерации и изменения документов "Установка типов цен по группам номенклатуры для покупателей" для каждого контрагента в группе. Но тогда всё равно придётся вмешиваться в конфигурацию хотя бы для того, чтобы обрабатывать перенос контрагента между группами. В этой связи, добавить одну, и изменить три строки в конфигурации мне кажется меньшим из зол.
P.S.2 Возможно, есть более простой (или типовой) способ реализовать тоже самое. Буду рад о нём узнать.