Цены не по подразделения в Альфа-Авто 5.1

В Альфа-авто цены привязаны к подразделениям. Когда становится много организаций, это перестает быть удобным, т.к. каждая организация привязывается к отдельному подразделению.

Я подумал, что самый простой способ решения проблемы — это добавление в подразделения поле «Подразделение цены», которое будет указывать, какую цену брать:

Запустил глобальный поиск, чтобы найти все обращения к регистру Цены. К моему удивлению, в Альфа-авто цены всегда вычисляются только в одной функции:

Я так обрадовался этому, потому что уже отравлен этим дублированием функционала в типовых 1С ради мнимой «производительности». Зато внесение модификаций в современные типовые становится адом. А тут достаточно поменять только в одном месте.

Посмотрел, какой формируется запрос по ценам:

ВЫБРАТЬ ПЕРВЫЕ 1
    ЦеныСрезПоследних.Цена КАК Цена,
    ВЫБОР
        КОГДА ЦеныСрезПоследних.ЕдиницаИзмерения=ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка) ТОГДА 1
        ИНАЧЕ ЦеныСрезПоследних.ЕдиницаИзмерения.Коэффициент
    КОНЕЦ КАК Коэффициент,

    0 + ВЫБОР
    КОГДА ЦеныСрезПоследних.ПодразделениеКомпании = &Подразделение0
        ТОГДА 0
    КОГДА ЦеныСрезПоследних.ПодразделениеКомпании = &Подразделение1
        ТОГДА 1
    КОГДА ЦеныСрезПоследних.ПодразделениеКомпании = &Подразделение2
        ТОГДА 2
    ИНАЧЕ 999
КОНЕЦ КАК ПолеДляСортировки
ИЗ
    РегистрСведений.Цены.СрезПоследних(&Момент,
    ТипЦен=&ТипЦен И
    Номенклатура=&Номенклатура И
    Контрагент=&Контрагент И
    ПодразделениеКомпании В (&МассивПодразделений)) КАК ЦеныСрезПоследних
ГДЕ
    0 + ВЫБОР
    КОГДА ЦеныСрезПоследних.ПодразделениеКомпании = &Подразделение0
        ТОГДА 0
    КОГДА ЦеныСрезПоследних.ПодразделениеКомпании = &Подразделение1
        ТОГДА 1
    КОГДА ЦеныСрезПоследних.ПодразделениеКомпании = &Подразделение2
        ТОГДА 2
    ИНАЧЕ 999
КОНЕЦ < 999 И
    ЦеныСрезПоследних.Цена <> 0

УПОРЯДОЧИТЬ ПО ПолеДляСортировки

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

Но это хорошо, если проектировать сначала. Потому что если у главного подразделения есть подразделения А и Б и на них уже назначены цены, то если я введу между ними подразделение Промежуточное, цены назначенные на Б уже не будут браться из Промежуточного подразделения.

Поэтому я решил не отказываться от своего плана и воплотил его в изменениях в эту функцию, внес их в цикл подбора подразделений:

Пока Истина Цикл
    //Осипов 2021-08-01 +++
    //Подмена подразделения, если указано, что нужно подменять...
    РасчПодразделение = ТекущееПодразделение;
    Если ЗначениеЗаполнено(ТекущееПодразделение) И ЗначениеЗаполнено(ТекущееПодразделение._ПодразделениеЦены) Тогда
        РасчПодразделение = ТекущееПодразделение._ПодразделениеЦены;
    КонецЕсли;
    //Запрос.УстановитьПараметр("Подразделение"+ПеременнаяЦикла,ТекущееПодразделение);
    //---
    
    
    // Отбор подразделений
    //Осипов 2021-08-01 +++
    //Подмена подразделения, если указано, что нужно подменять...
    //МассивПодразделений.Добавить(ТекущееПодразделение);
    МассивПодразделений.Добавить(РасчПодразделение);
    //---
    
    // Сортировка подразделений
    ТекстЗапросаНачало = ТекстЗапросаНачало + "
    |    КОГДА ЦеныСрезПоследних.ПодразделениеКомпании = &Подразделение"+ПеременнаяЦикла+"
    |        ТОГДА "+ПеременнаяЦикла;
    
    //Осипов 2021-08-01 +++
    //Подмена подразделения, если указано, что нужно подменять...
    //Запрос.УстановитьПараметр("Подразделение"+ПеременнаяЦикла,ТекущееПодразделение);
    Запрос.УстановитьПараметр("Подразделение"+ПеременнаяЦикла, РасчПодразделение);
    //---

Подробнее про ценообразование в Альфа-авто можно почитать тут.

Объем план: 1 час. Среда: Альфа-Авто: Автосалон+Автосервис+Автозапчасти ПРОФ, редакция 5.1 (5.1.10.09)

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *