Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
16 апр 2024, 15:45

Рассчёт скидки покупателю, прошу помощи.

Автор SoulPower, 04 июн 2011, 10:49

0 Пользователей и 1 гость просматривают эту тему.

SoulPower

Всем привет, помогите пожалуйста.

Задача: Добавить автоматически расчёт скидки покупателю при оформлении расходной накладной, Размер скидки зависит от суммы уже произведённых закупок в предыдущем месяце.

Скидки я храню в справочнике, сделки покупателей в регистре Продажи. Из клиентского приложения при изминении клиента вызываю функцию, которая выполняется на сервере, вот листинг:

Функция ВычислениеСкидки(Клиент) Экспорт
   ДатаНачала = НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), -1));
   ДатаОкончания = КонецМесяца(ДобавитьМесяц(ТекущаяДата(), -1));
   ОборотКлиента = РегистрыНакопления.Продажи.Обороты(ДатаНачала,ДатаОкончания,,Клиент,"Выручка");
    Запрос = Новый Запрос;
   Запрос.Текст ="ВЫБРАТЬ
                 |   Скидки.ОбъемЗакупки КАК ОбъемЗакупки,
                 |   Скидки.ПроцентСкидки
                 |ИЗ
                 |   Справочник.Скидки КАК Скидки
                 |
                 |УПОРЯДОЧИТЬ ПО
                 |   ОбъемЗакупки УБЫВ";
   Результат = Запрос.Выполнить();
   ТЗ = Результат.Выгрузить();
   ВыборкаДетальныеЗаписи = Результат.Выбрать();
   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
      Если ОборотКлиента >= ВыборкаДетальныеЗаписи.ОбъемЗакупки тогда
         Возврат ВыборкаДетальныеЗаписи.ПроцентСкидки;
      КонецЕсли;
   КонецЦикла;   
КонецФункции

Проблема вот в чём:
Метод Обороты() ругается на параметр Клиент, а я ему вроде передаю строку как и надо.

Да и вообще нихрена не работает, помогите плиз)

cska-fanat-kz

РегистрыНакопления.Продажи(ДатаНачала, ДатаОкончания, Новый Структура("Клиент", Клиент),"Клиент","Выручка");
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

Запрос надо переделать.
Вы перебираете все элементы справочника ради одного единственного значения...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

И зачем вам

ТЗ = Результат.Выгрузить(); ?

абсолютно лишняя строка!
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

SoulPower

Цитата: cska-fanat-kz от 04 июн 2011, 14:39
РегистрыНакопления.Продажи(ДатаНачала, ДатаОкончания, Новый Структура("Клиент", Клиент),"Клиент","Выручка");
Функция параметром получает значения клиента, то есть нужен определённый клиент, Иванов там или ещё кто.
И нужно для этого клиента посмотреть обороты за определённый период(в данном случае за месяц), наверно нужно воспользоваться методом Обороты? Или можно вот так обратиться, как в цитате? И как туда засунуть параметром клиента?
Цитата: cska-fanat-kz от 04 июн 2011, 14:40
Запрос надо переделать.
Вы перебираете все элементы справочника ради одного единственного значения...
А как не перебирая найти нужное значение скидки? Справочник Скидки у меня такой:
Объём закупки          Процент скидки
          1000                            2
          3000                            5
          5000                           10
Цитата: cska-fanat-kz от 04 июн 2011, 14:41
И зачем вам

ТЗ = Результат.Выгрузить(); ?

абсолютно лишняя строка!
Она просто для того чтоб посмотреть, что выбралось. А так да, она лишняя.

п.с. Я почти ничего не знаю, разбираюсь 5й день, так что извините за глупые вопросы, если что.

SoulPower

а как прочитать элемент таблицы?
ОборотКлиента = РегистрыНакопления.Продажи.Обороты(ДатаНачала, ДатаОкончания, Новый Структура("Клиент", Клиент),"Клиент","Выручка");
тут ОборотКлиента это таблица, в ней одна строка в которой есть Клиент и Выручка.
И я чёт туплю и не могу эту Выручку прочитать.
чтоб потом подставить в сравнение.

cska-fanat-kz

Сорри, очепятка. надо так:

РегистрыНакопления.Продажи.Обороты(ДатаНачала, ДатаОкончания, Новый Структура("Клиент", Клиент),"Клиент","Выручка");
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ОЗ",ОборотКлиента);
   Запрос.Текст ="ВЫБРАТЬ ПЕРВЫЕ 1
                 |   Скидки.ОбъемЗакупки КАК ОбъемЗакупки,
                 |   Скидки.ПроцентСкидки
                 |ИЗ
                 |   Справочник.Скидки КАК Скидки
                 |ГДЕ Скидки.ОбъемЗакупки >= &ОЗ
                 |УПОРЯДОЧИТЬ ПО
                 |   ОбъемЗакупки";
   Результат = Запрос.Выполнить();
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

SoulPower

Спасибо ещё раз.
Ваш вариант действительно короче и изящней.

Поясните пожалуйста ещё коечто.
ОборотКлиента, это таблица. Как мне проверить, что там есть значения?
Ведь если клиент ничего не покупал, то РегистрыНакопления.Продажи.Обороты() ничего не вернёт и будет пустая таблица, тогда надо вернуть значение скидки 0.
И ещё.
Как мне прочитать значение ПроцентаСкидки?
   Запрос.УстановитьПараметр("ОЗ",ОборотКлиента[0].Выручка);
   Результат = Запрос.Выполнить();
   СкидкаТаб = Результат.Выбрать();
СкидкаТаб имеет тип ВыборкаИзРезультатаЗапроса, Но значения там не определены. Как мне правильно обратиться к этой выборке, прочитать и вернуть ПроцентСкидки?

И ещё.
В форме документа я делаю следующее:
&НаКлиенте
Процедура КлиентПриИзменении(Элемент)
   СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
   Скидка = РаботаСоСправочниками.ВычислениеСкидки(Объект.Клиент);
   Если Скидка <> 0 тогда
      Сообщить("Клиент обладает скидкой " + Строка(Скидка) + "%");
      //Если НЕ СтрокаТабличнойЧасти.Номенклатура.Пустая() тогда
         СтрокаТабличнойЧасти.Цена =
РаботаСоСправочниками.РозничнаяЦенаСоСкидкой(Объект.Дата,СтрокаТабличнойЧасти.Номенклатура, Скидка)
      //КонецЕсли;   
   КонецЕсли;
КонецПроцедуры

Вот эта строчка - СтрокаТабличнойЧасти.Номенклатура.Пустая()
Неправильная.
А как мне проверить заполнена ли номенклатура табличной части в форме?
Чтоб если заполнени вычислить цену со скидкой, а если нет, то просто сказать что скидка есть.



Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск