Получение скидки

1. junikDEV 26.09.24 23:21 Сейчас в теме
Добрый вечер! Только учусь, не судите строго. Есть задача : Получите скидку запросом из виртуальной таблицы "СрезПоследних" регистра сведений "Скидки"(регистр переодический по позиции регистратора, в измерении составной тип данных - СправочникСсылка.НоменклатурныеГруппы, СправочникСсылка.Номенклатура), установленную для конкретной номенклатуры. Если же нет скидки для конкретной номенклатуры, тогда получите скидку для номенклатурной группы. На скриншоте сама функция, есть ли вариант как-то оптимизировать решение, например в самом запросе или же вне него? Спасибо
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
3. scarl1n 12 27.09.24 09:25 Сейчас в теме
Функция СкидкаНаДату(НоменклатураИлиНоменклатурнаяГруппа, НаДату)
	
	Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
	|	СкидкиСрезПоследних.Скидка КАК Скидка
	|ИЗ
	|	РегистрСведений.Скидки.СрезПоследних(&НаДату, НоменклатураНоменклатурнаяГруппа = &Номенклатура) КАК СкидкиСрезПоследних
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	СкидкиСрезПоследних.Скидка
	|ИЗ
	|	РегистрСведений.Скидки.СрезПоследних(&НаДату, НоменклатураНоменклатурнаяГруппа = &НоменклатурнаяГруппа) КАК СкидкиСрезПоследних");
	
	Запрос.УстановитьПараметр("НаДату", КонецДня(НаДату));
	Запрос.УстановитьПараметр("Номенклатура", НоменклатураИлиНоменклатурнаяГруппа);
	
	Если ТипЗнч(НоменклатураИлиНоменклатурнаяГруппа) = Тип("СправочникСсылка.Номенклатура") Тогда 
		Запрос.УстановитьПараметр("НоменклатурнаяГруппа", НоменклатураИлиНоменклатурнаяГруппа.НоменклатурнаяГруппа); 
	Иначе
		Запрос.УстановитьПараметр("НоменклатурнаяГруппа", НоменклатураИлиНоменклатурнаяГруппа);		
	КонецЕсли;
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Возврат ?(Выборка.Следующий(), Выборка.Скидка, 0);
	
КонецФункции
Показать
16. junikDEV 27.09.24 10:58 Сейчас в теме
(7) По итогу сделал такое решение, чтобы всех удовлетворить хахаха, спасибо еще раз
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Oldsad 27.09.24 05:20 Сейчас в теме
Используйте объединение таблиц:
- в первой таблице условие по номенклатуре
- во второй таблице условие по номенклатурной группе.

Соответственно первая строка результата такого запроса и будет ваша скидка
3. scarl1n 12 27.09.24 09:25 Сейчас в теме
Функция СкидкаНаДату(НоменклатураИлиНоменклатурнаяГруппа, НаДату)
	
	Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
	|	СкидкиСрезПоследних.Скидка КАК Скидка
	|ИЗ
	|	РегистрСведений.Скидки.СрезПоследних(&НаДату, НоменклатураНоменклатурнаяГруппа = &Номенклатура) КАК СкидкиСрезПоследних
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	СкидкиСрезПоследних.Скидка
	|ИЗ
	|	РегистрСведений.Скидки.СрезПоследних(&НаДату, НоменклатураНоменклатурнаяГруппа = &НоменклатурнаяГруппа) КАК СкидкиСрезПоследних");
	
	Запрос.УстановитьПараметр("НаДату", КонецДня(НаДату));
	Запрос.УстановитьПараметр("Номенклатура", НоменклатураИлиНоменклатурнаяГруппа);
	
	Если ТипЗнч(НоменклатураИлиНоменклатурнаяГруппа) = Тип("СправочникСсылка.Номенклатура") Тогда 
		Запрос.УстановитьПараметр("НоменклатурнаяГруппа", НоменклатураИлиНоменклатурнаяГруппа.НоменклатурнаяГруппа); 
	Иначе
		Запрос.УстановитьПараметр("НоменклатурнаяГруппа", НоменклатураИлиНоменклатурнаяГруппа);		
	КонецЕсли;
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Возврат ?(Выборка.Следующий(), Выборка.Скидка, 0);
	
КонецФункции
Показать
4. 1234su 27.09.24 09:33 Сейчас в теме
(3) "Если же нет скидки для конкретной номенклатуры, тогда получите скидку для номенклатурной группы." - где?
5. scarl1n 12 27.09.24 09:37 Сейчас в теме
(4) Не понял, две таблицы же: первая с условием на номенклатуру, вторая с условием на номенклатурную группу. Если в первой таблицы ничего не будет, то при объединении попадет запись как раз из второй таблицы.
9. 1234su 27.09.24 09:54 Сейчас в теме
(5) А если будет и там и там?
10. scarl1n 12 27.09.24 09:56 Сейчас в теме
(9) Ну для этого и ПЕРВЫЕ 1, а раз первая таблица в объединении с условием на номенклатуру, то по номенклатуре значение и вернет, я полагаю. Я не уверен, что так работает, но в моем тесте сработало именно так. Если же это совпадение, то можно добавить в обе таблицы поле "Приоритет", в первой таблице задать значение 1, а во второй 0, затем результат отсортировать по убыванию приоритета.
11. 1234su 27.09.24 10:03 Сейчас в теме
(10)
я полагаю. Я не уверен
Но в обучение падавана ввязался.

Спасибо за подтверждение тезисов "неучи обучают неучей" и "самоучки традиционно презирают документацию".
Прикрепленные файлы:
user2033930; +1 Ответить
12. scarl1n 12 27.09.24 10:06 Сейчас в теме
(11) Так и где здесь утверждение о том, что после "ОБЪЕДИНИТЬ" строки могут изменить свой порядок? Здесь описан общий случай того, что нужно использовать "УПОРЯДОЧИТЬ", если результат зависит от порядка записей.
13. 1234su 27.09.24 10:28 Сейчас в теме
(12) Браво!

Спишем, пожалуй, на то, что русский язык документации - не твой родной.
14. scarl1n 12 27.09.24 10:32 Сейчас в теме
(13) Пол часа искали доказательство вашим словам, но ничего не нашли и решили отмахнуться?) Вы, что, не можете с уверенностью сказать, что ОБЪЕДИНИТЬ ВСЕ не сохраняет порядок в соответствии с последовательностью таблиц? Неуч... В принципе, оно и понятно, с самого начала не видите запрос с объединением и задаете вопрос о том где же скидка по номенклатурной группе... Меньше по клавишам тыкайте, семью заведите, время с ними проведите что ли... Извините, если уж на больное. Пока вас только такие же форумные псевдоинтеллектуальные дяди поддерживают плюсиками под комментариями =(
15. 1234su 27.09.24 10:55 Сейчас в теме
(14)
Вы, что, не можете с уверенностью сказать, что ОБЪЕДИНИТЬ ВСЕ не сохраняет порядок в соответствии с последовательностью таблиц?


Ты прекрасен.
17. scarl1n 12 27.09.24 11:03 Сейчас в теме
(15) Спасибо! В следующий раз, пожалуйста, подготовьтесь получше, а то грустно осознавать, что старое поколение 1С сначала пишет, а потом думает =(
И не нужно отчаиваться, я верю, вы обязательно найдете поддержку! Вероятно даже, что не только от таких же дядянек на форуме, у которых руки чешутся поблестать умом.
20. 1234su 27.09.24 12:00 Сейчас в теме
(17) Спасибо за уточнение тезисов. Пожалуй, более удачными формулировками будут:
- Воинствующие невежды обучают неучей.
- Бестолковые самоучки презирают документацию, потому что не могут понять что в ней написано.
22. пользователь 27.09.24 12:26
Сообщение было скрыто модератором.
...
23. 1234su 27.09.24 12:46 Сейчас в теме
(22)
об отсутствии этого пункта в документации
Это поведение SQL хорошо описано здесь
24. scarl1n 12 27.09.24 12:47 Сейчас в теме
(23) И в чем смысл диалога был - неясно.
25. 1234su 27.09.24 13:06 Сейчас в теме
(24) Что ты понял для себя из данных по ссылке?
26. scarl1n 12 27.09.24 13:12 Сейчас в теме
(25) Что
ОБЪЕДИНИТЬ ВСЕ не сохраняет порядок в соответствии с последовательностью таблиц
27. 1234su 27.09.24 13:29 Сейчас в теме
(26) Умничка!
Будешь продолжать обучать падаванов тому, чего сам не знаешь?
28. scarl1n 12 27.09.24 13:56 Сейчас в теме
(27) Я не обучаю, а пытаюсь помочь. Здесь я не прав в том, что ответил на вопрос "вернет ли запрос приоритетно скидку номенклатуры" - "на сколько я знаю, да". Однако в ситуации, когда вы прикопались к тому, что я не посоветовал человеку, который код не может вытащить, залезть в конструктор, я считаю, что прав. Я сам еще "вчера" студент, формулировка "Правильно поля в запросе, запрос в цикле плохо, а обращение через точку = запрос!" даже не отложится, потому что на таком этапе вся информация накладывается друг на друга. Тонкости приходят с опытом, а с самого начала никто "как надо" код не напишет. С таким успехом можно было просить его на будущее в отдельную процедуру все переносить, переменные переименовать, табуляцию настроить, комментарии написать.
И не просто так я приводил в пример SlavaKron в том комментарии, потому что здесь человек в 2 строки укладывает ответ, а не тратит свое и чужое время (и я не про себя, это мое решение отвечать на подобный срам. Я про ответы другим людям на их вопросы) на попытку доказать, что он умнее.
Мне то не тяжело признать ошибку, а вот вам (кто там еще в бан отлетел и плюсики ставит, скрипя зубами, что не может ответить), кому на каждый второй комментарий отвечают тем, что они пишут бесполезную ересь, по всей видимости, это очень тяжело дается) Ну тут, я думаю, не ваша проблема. Кому то явно родители в детстве не хотели слушать.
30. пользователь 27.09.24 15:04
Сообщение было скрыто модератором.
...
31. scarl1n 12 27.09.24 15:07 Сейчас в теме
(30) "Соглашусь, я оказался не прав здесь..., потому что ..., но считаю что прав был тогда..., потому что ..." - оправдания. Ладно. Слишком тяжелый случай.
19. SlavaKron 27.09.24 11:09 Сейчас в теме
(14)
ОБЪЕДИНИТЬ ВСЕ не сохраняет порядок в соответствии с последовательностью таблиц
Не сохраняет. В справке об этом не написано. На практике это можно наблюдать, когда СУБД на постгри.
scarl1n; 1234su; user2033930; +3 Ответить
21. scarl1n 12 27.09.24 12:06 Сейчас в теме
(19) Понятно, буду знать. Про документацию обидно - я тоже не нашел, пришлось ссылаться на обсуждения на форумах, да и там мнения разнились: один пишет, что не сохраняет, а другой пишет, что конкретно при "ОБЪЕДИНИТЬ ВСЕ" сохраняется. В итоге решил узнать на практике: заполнил регистр, прогнал тестовые данные, затем поменял объединяемые таблицы местами - результат один, порядок сохранялся. Так и не получилось выяснить самостоятельно)
29. nomad_irk 80 27.09.24 14:15 Сейчас в теме
(19) и на MSSQL - тоже. Про Oracle пока не в курсях, возможно так же.
SlavaKron; +1 Ответить
6. junikDEV 27.09.24 09:40 Сейчас в теме
(3)
(3) то есть если у нас будет скидка и на номенклатуру и на ее группу, данный запрос приоритетно вернет скидку на номенклатуру?
7. scarl1n 12 27.09.24 09:45 Сейчас в теме
(6) На сколько я знаю, да, раз в объединении первой таблицей стоит та, что с условием на номенклатуру. В тестах проверил тоже норм:
Прикрепленные файлы:
8. junikDEV 27.09.24 09:47 Сейчас в теме
(7) спасибо большое, как буду дома посмотрю
16. junikDEV 27.09.24 10:58 Сейчас в теме
(7) По итогу сделал такое решение, чтобы всех удовлетворить хахаха, спасибо еще раз
Прикрепленные файлы:
18. 1234su 27.09.24 11:07 Сейчас в теме
(16) Предусмотри еще случай, когда регистр пуст и тебе не вернется ни одной строки.
junikDEV; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот