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

Задача с регистром накопления

Автор olin sim, 15 июл 2022, 16:28

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

olin sim

Решал задачки и наткнулся на вот такую вот
Необходимо доработать конфигурацию так, чтобы обеспечить расчет вознаграждения мастеру за оказанные им услуги при проведении документа «Оказание услуг». Вознаграждение высчитывается как процент от общей суммы, предоставленных по данному документу услуг (без учёта проданных товаров) и составляет:
5% сумма меньше 1 000 руб.
10% сумма от 1 000 до 5 000 руб.
15% сумма больше 5 000 руб.
Требуется разработать структуру данных для хранения накопленного вознаграждения.
Разработать отчет, позволяющий получить общие суммы вознаграждений по каждому мастеру за произвольно выбранный период.
Пример отчета:
Период: 01.01.2013 – 15.05.2013
Мастер Сумма
Иванов Иван 1000
Петров Пётр 1500

Есть несколько проблем, не могу заставить (не знаю как это правильно написать) его (регистр) посчитать процент от всей суммы оказанных услуг, у меня получилось добиться только того что он считает процент от каждой строчки с услугой но не от самой суммы.
И вторая проблема выводит он этот процент отдельными строчками не смотря на то что это один документ, пытался через конструктор запросов сгруппировать (используя обработку консоль запросов) по Регистратору или Дате проведения но не получилось. 
Выгрузка - 1Cv888.dt
Вид регистра

изображение_2022-07-15_162152452.png

Код движения и запроса

изображение_2022-07-15_162418132.png   
 

LexaK

olin sim, запись в вознаграждения вынесите из цикла, в цикле оставьте только подсчет суммы,
примерно так

Вознаграждение = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

...

  Если
    ВыборкаДетальныеЗаписи.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуги Тогда
    Вознаграждение = Вознаграждение + ВыборкаДетальныеЗаписи.СуммаВДокументе;
  КонецЕсли;

КонецЦикла;

//+++ вот эта часть вынесена из цикла
  Если Вознаграждение < 1000 Тогда
   Сумма = Вознаграждение * 0.05;
  ИначеЕсли Вознаграждение >= 1000 И Вознаграждение <= 5000 Тогда
   Сумма = Вознаграждение * 0.1;
  Иначе
   Сумма= Вознаграждение*0.15; 
КонецЕсли;                     

Движение = Движения.Вознаграждения.Добавить();
Движение.Период = Дата;
Движение.Мастер = Мастер;
Движение.Сумма =Сумма;
//--- вот эта часть вынесена из цикла



если помогло нажмите: Спасибо!

olin sim

LexaK, Вообще перестал считать и выводить

LexaK

olin sim, странно, по вашему коду выложил пример,
есть вероятность что вы что-то не правильно исправили!
но есть замечательный инструмент - Отладка!
поставьте точку остановки  в коде программы, выполните перепроведение документа
пройдите по шагам код, сразу все станет ясно (должно стать), что где почему не работает.
если помогло нажмите: Спасибо!

Yotram

Как сказано было  ранее, расчет регистра надо вынести из цикла. Но, помимо этого пересмотреть логику получения суммы документа. К примеру вариант

// Расчет регистра "Вознаграждения" удален из цикла
КонецЦикла;

// Регистр "Вознаграждения"
СуммаПоНоменклатуре = ПереченьНоменклатуры.Итог("Сумма");
Если СуммаПоНоменклатуре < 1000 Тогда
Вознаграждение = СуммаПоНоменклатуре * 0.05;
ИначеЕсли СуммаПоНоменклатуре >= 1000 И СуммаПоНоменклатуре <= 5000 Тогда
Вознаграждение = СуммаПоНоменклатуре * 0.1;
Иначе
Вознаграждение = СуммаПоНоменклатуре*0.15; 
КонецЕсли;   

Движение = Движения.Вознаграждения.Добавить();
Движение.Период = Дата;
Движение.Мастер = Мастер;
Движение.Сумма = Вознаграждение;

Движения.Записать();
// Конец регистр "Возаграждения"

1Cv888.dt
"Дай человеку рыбу, и ты накормишь его на один день, научи его рыбачить, и он будет сыт всю жизнь"

Эдуард54

olin sim, если еще нужно наберите меня помогу разобраться (89161768023)

Теги:

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

Рейтинг@Mail.ru

Поиск