Добрый вечер! Только учусь, не судите строго. Есть задача : Получите скидку запросом из виртуальной таблицы "СрезПоследних" регистра сведений "Скидки"(регистр переодический по позиции регистратора, в измерении составной тип данных - СправочникСсылка.НоменклатурныеГруппы, СправочникСсылка.Номенклатура), установленную для конкретной номенклатуры. Если же нет скидки для конкретной номенклатуры, тогда получите скидку для номенклатурной группы. На скриншоте сама функция, есть ли вариант как-то оптимизировать решение, например в самом запросе или же вне него? Спасибо
---
```1c
    Функция СкидкаНаДату(НоменклатураИлиНоменклатурнаяГруппа, НаДату)

    Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
    | СкидкиСрезПоследних.Скидка КАК Скидка
    |ИЗ
    | РегистрСведений.Скидки.СрезПоследних(&НаДату, НоменклатураНоменклатурнаяГруппа = &Номенклатура) КАК СкидкиСрезПоследних
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | СкидкиСрезПоследних.Скидка
    |ИЗ
    | РегистрСведений.Скидки.СрезПоследних(&НаДату, НоменклатураНоменклатурнаяГруппа = &НоменклатурнаяГруппа) КАК СкидкиСрезПоследних");

    Запрос.УстановитьПараметр("НаДату", КонецДня(НаДату));
    Запрос.УстановитьПараметр("Номенклатура", НоменклатураИлиНоменклатурнаяГруппа);

    Если ТипЗнч(НоменклатураИлиНоменклатурнаяГруппа) = Тип("СправочникСсылка.Номенклатура") Тогда
    Запрос.УстановитьПараметр("НоменклатурнаяГруппа", НоменклатураИлиНоменклатурнаяГруппа.НоменклатурнаяГруппа);
    Иначе
    Запрос.УстановитьПараметр("НоменклатурнаяГруппа", НоменклатураИлиНоменклатурнаяГруппа);
    КонецЕсли;

    Выборка = Запрос.Выполнить().Выбрать();

    Возврат ?(Выборка.Следующий(), Выборка.Скидка, 0);

    КонецФункции
```
---
По итогу сделал такое решение, чтобы всех удовлетворить хахаха, спасибо еще раз
---
Используйте объединение таблиц:
 - в первой таблице условие по номенклатуре
 - во второй таблице условие по номенклатурной группе.

Соответственно первая строка результата такого запроса и будет ваша скидка
---
```1c
    Функция СкидкаНаДату(НоменклатураИлиНоменклатурнаяГруппа, НаДату)

    Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
    | СкидкиСрезПоследних.Скидка КАК Скидка
    |ИЗ
    | РегистрСведений.Скидки.СрезПоследних(&НаДату, НоменклатураНоменклатурнаяГруппа = &Номенклатура) КАК СкидкиСрезПоследних
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | СкидкиСрезПоследних.Скидка
    |ИЗ
    | РегистрСведений.Скидки.СрезПоследних(&НаДату, НоменклатураНоменклатурнаяГруппа = &НоменклатурнаяГруппа) КАК СкидкиСрезПоследних");

    Запрос.УстановитьПараметр("НаДату", КонецДня(НаДату));
    Запрос.УстановитьПараметр("Номенклатура", НоменклатураИлиНоменклатурнаяГруппа);

    Если ТипЗнч(НоменклатураИлиНоменклатурнаяГруппа) = Тип("СправочникСсылка.Номенклатура") Тогда
    Запрос.УстановитьПараметр("НоменклатурнаяГруппа", НоменклатураИлиНоменклатурнаяГруппа.НоменклатурнаяГруппа);
    Иначе
    Запрос.УстановитьПараметр("НоменклатурнаяГруппа", НоменклатураИлиНоменклатурнаяГруппа);
    КонецЕсли;

    Выборка = Запрос.Выполнить().Выбрать();

    Возврат ?(Выборка.Следующий(), Выборка.Скидка, 0);

    КонецФункции
```
---
"Если же нет скидки для конкретной номенклатуры, тогда получите скидку для номенклатурной группы." - где?
---
Не понял, две таблицы же: первая с условием на номенклатуру, вторая с условием на номенклатурную группу. Если в первой таблицы ничего не будет, то при объединении попадет запись как раз из второй таблицы.
---
А если будет и там и там?
---
Ну для этого и ПЕРВЫЕ 1, а раз первая таблица в объединении с условием на номенклатуру, то по номенклатуре значение и вернет, я полагаю. Я не уверен, что так работает, но в моем тесте сработало именно так. Если же это совпадение, то можно добавить в обе таблицы поле "Приоритет", в первой таблице задать значение 1, а во второй 0, затем результат отсортировать по убыванию приоритета.
---
я полагаю. Я не уверенНо в обучение падавана ввязался.

Спасибо за подтверждение тезисов "неучи обучают неучей" и "самоучки традиционно презирают документацию".
---
Так и где здесь утверждение о том, что после "ОБЪЕДИНИТЬ" строки могут изменить свой порядок? Здесь описан общий случай того, что нужно использовать "УПОРЯДОЧИТЬ", если результат зависит от порядка записей.
---
Браво!

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

Ты прекрасен.
---
Спасибо! В следующий раз, пожалуйста, подготовьтесь получше, а то грустно осознавать, что старое поколение 1С сначала пишет, а потом думает =(
И не нужно отчаиваться, я верю, вы обязательно найдете поддержку! Вероятно даже, что не только от таких же дядянек на форуме, у которых руки чешутся поблестать умом.
---
Спасибо за уточнение тезисов. Пожалуй, более удачными формулировками будут:
- Воинствующие невежды обучают неучей.
- Бестолковые самоучки презирают документацию, потому что не могут понять что в ней написано.
---
Сообщение было скрыто модератором.
---
об отсутствии этого пункта в документацииЭто поведение SQL хорошо описано здесь
---
И в чем смысл диалога был - неясно.
---
Что ты понял для себя из данных по ссылке?
---
Что ОБЪЕДИНИТЬ ВСЕ не сохраняет порядок в соответствии с последовательностью таблиц
---
Умничка!
Будешь продолжать обучать падаванов тому, чего сам не знаешь?
---
Я не обучаю, а пытаюсь помочь. Здесь я не прав в том, что ответил на вопрос "вернет ли запрос приоритетно скидку номенклатуры" - "на сколько я знаю, да". Однако в ситуации, когда вы прикопались к тому, что я не посоветовал человеку, который код не может вытащить, залезть в конструктор, я считаю, что прав. Я сам еще "вчера" студент, формулировка "Правильно поля в запросе, запрос в цикле плохо, а обращение через точку = запрос!" даже не отложится, потому что на таком этапе вся информация накладывается друг на друга. Тонкости приходят с опытом, а с самого начала никто "как надо" код не напишет. С таким успехом можно было просить его на будущее в отдельную процедуру все переносить, переменные переименовать, табуляцию настроить, комментарии написать.
И не просто так я приводил в пример SlavaKron в том комментарии, потому что здесь человек в 2 строки укладывает ответ, а не тратит свое и чужое время (и я не про себя, это мое решение отвечать на подобный срам. Я про ответы другим людям на их вопросы) на попытку доказать, что он умнее.
Мне то не тяжело признать ошибку, а вот вам (кто там еще в бан отлетел и плюсики ставит, скрипя зубами, что не может ответить), кому на каждый второй комментарий отвечают тем, что они пишут бесполезную ересь, по всей видимости, это очень тяжело дается) Ну тут, я думаю, не ваша проблема. Кому то явно родители в детстве не хотели слушать.
---
Сообщение было скрыто модератором.
---
"Соглашусь, я оказался не прав здесь..., потому что ..., но считаю что прав был тогда..., потому что ..." - оправдания. Ладно. Слишком тяжелый случай.
---
ОБЪЕДИНИТЬ ВСЕ не сохраняет порядок в соответствии с последовательностью таблиц Не сохраняет. В справке об этом не написано. На практике это можно наблюдать, когда СУБД на постгри.
---
Понятно, буду знать. Про документацию обидно - я тоже не нашел, пришлось ссылаться на обсуждения на форумах, да и там мнения разнились: один пишет, что не сохраняет, а другой пишет, что конкретно при "ОБЪЕДИНИТЬ ВСЕ" сохраняется. В итоге решил узнать на практике: заполнил регистр, прогнал тестовые данные, затем поменял объединяемые таблицы местами - результат один, порядок сохранялся. Так и не получилось выяснить самостоятельно)
---
и на MSSQL - тоже. Про Oracle пока не в курсях, возможно так же.
---
(3) то есть если у нас будет скидка и на номенклатуру и на ее группу, данный запрос приоритетно вернет скидку на номенклатуру?
---
На сколько я знаю, да, раз в объединении первой таблицей стоит та, что с условием на номенклатуру. В тестах проверил тоже норм:
---
спасибо большое, как буду дома посмотрю
---
По итогу сделал такое решение, чтобы всех удовлетворить хахаха, спасибо еще раз
---
Предусмотри еще случай, когда регистр пуст и тебе не вернется ни одной строки.