Как из таблицы значений получить минимальное значение относительно заданного?

1. ivnik 585 26.03.24 10:59 Сейчас в теме
Всем доброго дня!
Не могу сообразить: как из таблицы значений получить минимальное значение относительно заданного? Например: имеется количество = 32, из ТЗ (скрин приложен) из колонки Процент нужно получить % = 19, т.е. по нижней границы диапазона. А если, например, количество будет больше 40, т.е. больше предельной величины, то % = 25.
Прикрепленные файлы:
Вознаграждение за ответ
Показать полностью
Найденные решения
39. laperuz 46 27.03.24 07:58 Сейчас в теме +1 $m
(38)Соединения тоже лишние тут, достаточно выборки из одной таблицы.

ТЗ = Таблица.Выгрузить();        
	НужныйПроцент = 0;
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	Таблица.КоличествоУчеников КАК КоличествоУчеников,
	               |	Таблица.ПроцентОплаты КАК ПроцентОплаты
	               |ПОМЕСТИТЬ ВТ_Таблица
	               |ИЗ
	               |	&Таблица КАК Таблица
				   |ГДЕ Таблица.КоличествоУчеников <= &КолУчеников
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ ПЕРВЫЕ 1
	               |	ВТ_Таблица.ПроцентОплаты КАК ПроцентОплаты
	               |ИЗ
	               |	ВТ_Таблица КАК ВТ_Таблица
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	ВТ_Таблица.КоличествоУчеников УБЫВ";
	Запрос.УстановитьПараметр("Таблица", ТЗ);    
	Запрос.УстановитьПараметр("КолУчеников", КолУчеников);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		НужныйПроцент = Выборка.ПроцентОплаты;
	КонецЕсли;
Показать
ivnik; user1671936; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. newlogin1 26.03.24 11:09 Сейчас в теме
(1)Через цикл можно, обходить все и сравнивать.

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

Надо замеры провести какой вариант быстрее будет и выбрать его
3. Vadim-SH 26.03.24 11:28 Сейчас в теме

ВЫБРАТЬ
	МАКСИМУМ(Таблица.Количество) КАК Количество
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
	Таблица КАК Таблица
ГДЕ
	Таблица.Количество <= &Количество
;

ВЫБРАТЬ
	Таблица.Процент КАК Процент
ИЗ
	Таблица КАК Таблица
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица
		ПО (Таблица.Количество = ВременнаяТаблица.Количество)

Показать
4. Said-We 26.03.24 12:07 Сейчас в теме
(3) А почему через соединение и ПОМЕСТИТЬ? Можно же как-то так:
ВЫБРАТЬ
     Таблица.Количество as Количество
    ,Таблица.Процент КАК Процент
ИЗ
    Таблица КАК Таблица
where Таблица.Процент in (ВЫБРАТЬ
                            МАКСИМУМ(t.Процент) КАК Процент
                      ИЗ Таблица КАК t
                      ГДЕ t.Количество <= &Количество)
Показать
или так:
ВЫБРАТЬ
     Таблица.Количество as Количество
    ,Таблица.Процент КАК Процент
ИЗ
    Таблица КАК Таблица
where Таблица.Процент in (ВЫБРАТЬ первые 1
                         t.Процент КАК Процент
                   ИЗ Таблица КАК t
                   ГДЕ t.Количество <= &Количество
                   order by t.Процент desc)
Показать
5. nomad_irk 76 26.03.24 12:17 Сейчас в теме
(4)Потому что из ТЗ можно выбрать только в ВТ
user1671936; +1 Ответить
6. Said-We 26.03.24 12:22 Сейчас в теме
(5)
Потому что из ТЗ можно выбрать только в ВТ
Временная таблица с именем "ВременнаяТаблица" лишняя. В вашем примере ТЗ уже помещена с именем "Таблица".
7. nomad_irk 76 26.03.24 12:26 Сейчас в теме
(6)я примеров не писАл :)
Из написанного примера этого не следует, т.к. есть ПОМЕСТИТЬ, значит именно этот запрос к ТЗ.
Про соединение - не знаю зачем оно.
8. Vadim-SH 26.03.24 13:04 Сейчас в теме
(6) Ни чего подобного, "ВременнаяТаблица" выполняет те же функции, что и вложенный запрос в вашем примере.
По моему, так читабельность лучше.
9. Said-We 26.03.24 13:30 Сейчас в теме
(8) А максимум почему ищется по количеству, а не по проценту? Если читабельность выше. :-)
10. Vadim-SH 26.03.24 13:42 Сейчас в теме
(9)Я так задачу понял. Если Процент рассчитан от Количества, то это не имеет значения.
11. Said-We 26.03.24 14:01 Сейчас в теме
(10) Сумма % в примере явно не 100. Примерно, 4 по 20 - это 80.
Явно какой-то другой процент.
13. Vadim-SH 26.03.24 14:25 Сейчас в теме
(11)Я имел ввиду, что зависимость у них прямая.
если Количество1 > Количество2, то Процент1 > Процент2.

Входной параметр задачи - это Количество. Значит и сравнивать нужно с Количеством.
12. SlavaKron 26.03.24 14:15 Сейчас в теме
И вновь секта свидетелей отправки ТЗ в запрос оживилась.
user1671936; nomad_irk; user1880116; +3 Ответить
14. nomad_irk 76 26.03.24 14:27 Сейчас в теме
(12)так без запроса думать надо, алгоритмы придумывать......
user1880116; user1671936; +2 Ответить
15. user1880116 26.03.24 14:39 Сейчас в теме
(14)
без запроса думать надо
Судя по истории постов, сектанты кроме SQL ничего не знают, но мнение имеют.
16. ivnik 585 26.03.24 14:54 Сейчас в теме
У меня почему-то в обоих предложенных вариантах выскакивает ошибка, хотя "Таблица" заполнена?
Прикрепленные файлы:
17. user1671936 1 26.03.24 14:55 Сейчас в теме
25. user1880116 26.03.24 15:55 Сейчас в теме
(16) Потому что приведенный пример - это всего лишь описание направления решения, а не само готовое решение. Для его применения необходимы дополнительные знания.
18. ivnik 585 26.03.24 14:59 Сейчас в теме
Таблица = ТипОбучения.ПроцентыОплаты.Выгрузить();
		Таблица.Сортировать("КоличествоУчеников");
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|    МАКСИМУМ(Таблица.КоличествоУчеников) КАК КоличествоУчеников
		|ПОМЕСТИТЬ ВременнаяТаблица
		|ИЗ
		|    Таблица КАК Таблица
		|ГДЕ
		|    Таблица.КоличествоУчеников <= &КоличествоУчеников
		|;
        |
		|ВЫБРАТЬ
		|    Таблица.ПроцентОплатыОплаты КАК ПроцентОплатыОплаты
		|ИЗ
		|    Таблица КАК Таблица
		|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица
		|        ПО (Таблица.КоличествоУчеников = ВременнаяТаблица.КоличествоУчеников)";
		
		Запрос.УстановитьПараметр("КоличествоУчеников", КолУчеников);
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
			ПроцентОплаты = Выборка.ПроцентОплаты;
	КонецЦикла;
Показать
19. user1671936 1 26.03.24 15:02 Сейчас в теме
(18) Вы не установили и не задали параметр Таблица. И пытаетесь брать данные из неоткуда.
Таблица = ТипОбучения.ПроцентыОплаты.Выгрузить();
        Таблица.Сортировать("КоличествоУчеников");
        
        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("Таблица", Таблица);
        Запрос.Текст = 
        "ВЫБРАТЬ
        |    МАКСИМУМ(Таблица.КоличествоУчеников) КАК КоличествоУчеников
        |ПОМЕСТИТЬ ВременнаяТаблица
        |ИЗ
        |    &Таблица КАК Таблица
        |ГДЕ
        |    Таблица.КоличествоУчеников <= &КоличествоУчеников
        |;
        |
        |ВЫБРАТЬ
        |    Таблица.ПроцентОплатыОплаты КАК ПроцентОплатыОплаты
        |ИЗ
        |    Таблица КАК Таблица
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица
        |        ПО (Таблица.КоличествоУчеников = ВременнаяТаблица.КоличествоУчеников)";
        
        Запрос.УстановитьПараметр("КоличествоУчеников", КолУчеников);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
            ПроцентОплаты = Выборка.ПроцентОплаты;
    КонецЦикла;
Показать
20. ivnik 585 26.03.24 15:12 Сейчас в теме
(19) Я добавил строку Запрос.УстановитьПараметр("Таблица", Таблица); но та же ошибка

Таблица = ТипОбучения.ПроцентыОплаты.Выгрузить();
Таблица.Сортировать("КоличествоУчеников");

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(Таблица.КоличествоУчеников) КАК КоличествоУчеников
|ПОМЕСТИТЬ ВременнаяТаблица
|ИЗ
| Таблица КАК Таблица
|ГДЕ
| Таблица.КоличествоУчеников <= &КоличествоУчеников
|;
|
|ВЫБРАТЬ
| Таблица.ПроцентОплаты КАК ПроцентОплаты
|ИЗ
| Таблица КАК Таблица
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица
| ПО (Таблица.КоличествоУчеников = ВременнаяТаблица.КоличествоУчеников)";

Запрос.УстановитьПараметр("Таблица", Таблица);
Запрос.УстановитьПараметр("КоличествоУчеников", КолУчеников);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
21. user1671936 1 26.03.24 15:14 Сейчас в теме
(20) во второй части запроса так же нужно сделать
"ВЫБРАТЬ
| МАКСИМУМ(Таблица.КоличествоУчеников) КАК КоличествоУчеников
|ПОМЕСТИТЬ ВременнаяТаблица
|ИЗ
| &Таблица КАК Таблица
|ГДЕ
| Таблица.КоличествоУчеников <= &КоличествоУчеников
|;
|
|ВЫБРАТЬ
| Таблица.ПроцентОплаты КАК ПроцентОплаты
|ИЗ
| &Таблица КАК Таблица
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица
| ПО (Таблица.КоличествоУчеников = ВременнаяТаблица.КоличествоУчеников)";
Показать
22. Said-We 26.03.24 15:22 Сейчас в теме
(20)
Я добавил строку Запрос.УстановитьПараметр("Таблица", Таблица); но та же ошибка
Вы издеваетесь? Где в тексте запроса учитывается ваш переданный параметр "ИЗ &Таблица"? Если нет, то какая разница сколько и каких параметров вы передали в запрос?
23. ivnik 585 26.03.24 15:28 Сейчас в теме
(22) Я не издеваюсь, я не программист-профессионал, я самоучка, иногда на "запросах" заклиниваю. Лучше бы написали кодом: какой параметр и куда вставить?
Я пробовал конкретно и Ваш код, тоже не работает, чего-то не хватает.
24. user1671936 1 26.03.24 15:41 Сейчас в теме
(23)я же вам написал выше. Код ниже скопируйте и вместо своего кода из вставьте (18)
Таблица = ТипОбучения.ПроцентыОплаты.Выгрузить();
        Таблица.Сортировать("КоличествоУчеников");
        
        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("Таблица", Таблица);
        Запрос.Текст = 
        "ВЫБРАТЬ
|	Таблица.КоличествоУчеников КАК КоличествоУчеников
|ПОМЕСТИТЬ ВременнаяТаблица
|ИЗ
|	&Таблица КАК Таблица
|ГДЕ
|	Таблица.КоличествоУчеников <= &КоличествоУчеников
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	МАКСИМУМ(ВременнаяТаблица.КоличествоУчеников) КАК КоличествоУчеников
|ПОМЕСТИТЬ ВТМаксимум
|ИЗ
|	ВременнаяТаблица КАК ВременнаяТаблица
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	Таблица.ПроцентОплаты КАК ПроцентОплаты
|ПОМЕСТИТЬ ВТИтоговая
|ИЗ
|	&Таблица КАК Таблица
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
|		ПО Таблица.КоличествоУчеников = ВТМаксимум.КоличествоУчеников
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТИтоговая.ПроцентОплаты КАК ПроцентОплаты
|ИЗ
|	ВТИтоговая КАК ВТИтоговая";
        
        Запрос.УстановитьПараметр("КоличествоУчеников", КолУчеников);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
            ПроцентОплаты = Выборка.ПроцентОплаты;
    КонецЦикла;
Показать
26. user1880116 26.03.24 16:02 Сейчас в теме
(24)
Таблица.Сортировать("КоличествоУчеников");
Сильно.
27. ivnik 585 26.03.24 16:02 Сейчас в теме
(24) Я сделал вот так:
Таблица = ТипОбучения.ПроцентыОплаты.Выгрузить(); //это таблица значений

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Таблица", Таблица);
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.КоличествоУчеников КАК КоличествоУчеников
|ПОМЕСТИТЬ ВременнаяТаблица
|ИЗ
| &Таблица КАК Таблица
|ГДЕ
| Таблица.КоличествоУчеников <= &КоличествоУчеников
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| МАКСИМУМ(ВременнаяТаблица.КоличествоУчеников) КАК КоличествоУчеников
|ПОМЕСТИТЬ ВТМаксимум
|ИЗ
| ВременнаяТаблица КАК ВременнаяТаблица
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| Таблица.ПроцентОплаты КАК ПроцентОплаты
|ПОМЕСТИТЬ ВТИтоговая
|ИЗ
| &Таблица КАК Таблица
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
| ПО Таблица.КоличествоУчеников = ВТМаксимум.КоличествоУчеников
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| ВТИтоговая.ПроцентОплаты КАК ПроцентОплаты
|ИЗ
| ВТИтоговая КАК ВТИтоговая";

Запрос.УстановитьПараметр("КоличествоУчеников", КолУчеников);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
ПроцентОплаты = Выборка.ПроцентОплаты;
КонецЦикла;
Показать


Теперь ошибка:
Прикрепленные файлы:
28. user1671936 1 26.03.24 16:06 Сейчас в теме
(27)
"ВЫБРАТЬ
|	Таблица.КоличествоУчеников КАК КоличествоУчеников
|ПОМЕСТИТЬ ВременнаяТаблица
|ИЗ
|	&Таблица КАК Таблица
|ГДЕ
|	Таблица.КоличествоУчеников <= &КоличествоУчеников
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	МАКСИМУМ(ВременнаяТаблица.КоличествоУчеников) КАК КоличествоУчеников
|ПОМЕСТИТЬ ВТМаксимум
|ИЗ
|	ВременнаяТаблица КАК ВременнаяТаблица
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	Таблица.ПроцентОплаты КАК ПроцентОплаты,
|	Таблица.КоличествоУчеников КАК КоличествоУчеников
|ПОМЕСТИТЬ ВТПроценты
|ИЗ
|	&Таблица КАК Таблица
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТПроценты.ПроцентОплаты КАК ПроцентОплаты
|ПОМЕСТИТЬ ВТИтоговая
|ИЗ
|	ВТПроценты КАК ВТПроценты
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
|		ПО ВТПроценты.КоличествоУчеников = ВТМаксимум.КоличествоУчеников
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТИтоговая.ПроцентОплаты КАК ПроцентОплаты
|ИЗ
|	ВТИтоговая КАК ВТИтоговая";
Показать
29. ivnik 585 26.03.24 16:26 Сейчас в теме
(28) Теперь другая ошибка, все засунул в обработку.
Прикрепленные файлы:
ПолучитьПроцент.epf
30. user1671936 1 26.03.24 16:29 Сейчас в теме
(29) Если у Вас в таблице количество во всех строках разное, то можно через такую конструкцию нужное значение получить
Таблица = ТипОбучения.ПроцентыОплаты.Выгрузить();
ИскомаяСтрока = Таблица.Найти(КолУчеников, "КоличествоУчеников");
Если Не ИскомаяСтрока = Неопределено Тогда
      ПроцентОплаты = ИскомаяСтрока .ПроцентОплаты;
КонецЕсли;
. Если есть строки с одинаковым количеством то
ИскомаяСтрока = Таблица.НайтиСтроки(Новый Структура("КоличествоУчеников, Ученик", КолУчеников, "Иванов Петров");
Если Не ИскомаяСтрока.Количество() = 0 Тогда
      ПроцентОплаты = ИскомаяСтрока[0].ПроцентОплаты;
КонецЕсли;
. Попробуйте так, может проще окажется чем с запросами.
34. ivnik 585 26.03.24 16:45 Сейчас в теме
(30) Вся проблема именно в том, что здесь используется "вилка", т.е. вводимое кол-во может быть между значениями колонки в таблице и % нужно получить по нижней границе.
31. user1671936 1 26.03.24 16:34 Сейчас в теме
(29) Так Вы в обработке передаете в качестве параметра &Таблица значение, имеющее тип ДанныеФормыКоллекция. Нужно передавать тип ТаблицаЗначений.
Прикрепленные файлы:
ПолучитьПроцент.epf
32. ivnik 585 26.03.24 16:41 Сейчас в теме
(31) Исправил.
Прикрепленные файлы:
33. ivnik 585 26.03.24 16:42 Сейчас в теме
(29)
Прикрепленные файлы:
35. Said-We 26.03.24 17:33 Сейчас в теме
(33)Написано же почему ругается:
ВЫБРАТЬ
| Таблица.ПроцентОплаты КАК ПроцентОплаты
|ПОМЕСТИТЬ ВТИтоговая
|ИЗ
| &Таблица КАК Таблица
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
| ПО Таблица.КоличествоУчеников = ВТМаксимум.КоличествоУчеников
ТЗ в качестве параметра передали один раз и во временную таблицу засунули один раз. Далее уже работайте с временной таблицей и забудьте про ТЗ.
В момент помещения данных из ТЗ во временную таблицу нельзя использовать соединения.
36. ivnik 585 26.03.24 23:21 Сейчас в теме
Да, я бестолковый! Безмозглому мозги вставлять - только напрасно время тратить, не получается у меня. Вот обработка, с заполненной таблицей, без кода, мне нужно чтобы она работала. Вознаграждение: 1 $m. Заранее спасибо!
Прикрепленные файлы:
ПолучитьПроцент.epf
37. laperuz 46 27.03.24 04:20 Сейчас в теме
(36)С учетом ограничения в 30 строк в таблице максимально, смысла тащить в запрос нет. Обычный цикл.
Прикрепленные файлы:
ПолучитьПроцент.epf
38. Vadim-SH 27.03.24 06:27 Сейчас в теме
(37)Согласен, но метод нужно осваивать.


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



Показать
39. laperuz 46 27.03.24 07:58 Сейчас в теме +1 $m
(38)Соединения тоже лишние тут, достаточно выборки из одной таблицы.

ТЗ = Таблица.Выгрузить();        
	НужныйПроцент = 0;
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	Таблица.КоличествоУчеников КАК КоличествоУчеников,
	               |	Таблица.ПроцентОплаты КАК ПроцентОплаты
	               |ПОМЕСТИТЬ ВТ_Таблица
	               |ИЗ
	               |	&Таблица КАК Таблица
				   |ГДЕ Таблица.КоличествоУчеников <= &КолУчеников
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ ПЕРВЫЕ 1
	               |	ВТ_Таблица.ПроцентОплаты КАК ПроцентОплаты
	               |ИЗ
	               |	ВТ_Таблица КАК ВТ_Таблица
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	ВТ_Таблица.КоличествоУчеников УБЫВ";
	Запрос.УстановитьПараметр("Таблица", ТЗ);    
	Запрос.УстановитьПараметр("КолУчеников", КолУчеников);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		НужныйПроцент = Выборка.ПроцентОплаты;
	КонецЕсли;
Показать
ivnik; user1671936; +2 Ответить
40. ivnik 585 27.03.24 08:12 Сейчас в теме
41. Said-We 27.03.24 11:16 Сейчас в теме
(39) (40) По условию ищется не максимальное количество, а максимальный процент.
Если с максимальным процентом будет две и более строчки?
42. laperuz 46 27.03.24 11:40 Сейчас в теме
(41)Это где такое условие? По условию нужно из всех количеств найти максимальное, не превышающее заданное. И для этого найденного количества вывести процент.
43. nomad_irk 76 27.03.24 11:41 Сейчас в теме
(41)
Если с максимальным процентом будет две и более строчки?

Так важно ж значение процентов, а не количество таких значений, не?
44. Said-We 27.03.24 12:58 Сейчас в теме
(42), (43) Тогда зачем тут запрос городить, если нужно только значение. За один проход ТЗ находится это значение.
Если строки не нужны, то и запрос не нужен.
45. nomad_irk 76 27.03.24 13:58 Сейчас в теме
(44)Об этом уже в (2) и (12) было сказано :)
Да даже если и нужны сами строки, то это решается циклами.
Если уж прям совсем заморочится, то самостоятельно организовать сортировку можно.
47. laperuz 46 27.03.24 14:57 Сейчас в теме
(44)В (37) я привел решение без запроса, собственно об этом и написал, что запрос тут не нужен. Потом в ответ на вариант с запросом ответил, что если уж решать запросом, то можно без всяких соединений и привел вариант с запросом:)
46. karamazoff 96 27.03.24 14:17 Сейчас в теме
Сортировать по колонке "Количество"

затем
нашечисло = 32;

Пока не нашечисло = 0 цикл
нашечисло = нашечисло -1;
стр = ТЗ.Найти(нашечисло , "Количество");
Если не стр = неопределено тогда //нашли! данные в стр
прервать;
КонецЕсли;
КонецЦикла;
48. ivnik 585 27.03.24 16:25 Сейчас в теме
(46) Ваш вариант не рабочий, т.к. в таблице нет количества = 32!!! В таблице "вилка", где минимальное 30, максимальное 35, а если наше значение = 32, то нужно получить % из строки с количеством 30.
50. Said-We 27.03.24 16:36 Сейчас в теме
(48)
В таблице "вилка"
Так ищем процент скидки по шкале от количества, что ли?
52. karamazoff 96 27.03.24 17:13 Сейчас в теме
(48)И? цикл выполнится 2 раза, нашечисло станет равно 30 и найдется в таблице.А вилка в картошке
49. Said-We 27.03.24 16:35 Сейчас в теме
(46) Поиск в цикле? Зачем?
А если условно так:
МаксКоличество = 32;
МаксПроцент = -1;
Для каждого СтрокаТЗ Из ТЗ Цикл
    Если СтрокаТЗ.Количество > МаксКоличество Тогда
         Продолжить;
    КонецЕсли;
    МаксПроцент = Макс(МаксПроцент, СтрокаТЗ.Процент);
КонецЦикла;
Сообщить("Максимальный процент: "+ ?(МаксПроцент = -1, "не найден", МаксПроцент));
Показать
51. karamazoff 96 27.03.24 17:11 Сейчас в теме
(49)затем, что если в тз 1000 строк, то ваш цикл будет выполнен 1000 раз (в худшем случае), а с поиском, до 1-го ближайшего числа
53. Said-We 27.03.24 17:15 Сейчас в теме
(51) У меня один цикл, а не 1000 и алгоритм найдет результат за один проход по не сортированной ТЗ.
Сортировка ТЗ и поиск в ТЗ по вашему выполняется мгновенно?
54. karamazoff 96 27.03.24 17:27 Сейчас в теме
(53)Зависит от размера ТЗ, если десятки тысяч записей, а искомое в конце, с поиском наверно быстрее будет, надо сравнивать, и, конечно, отталкиваться от здравого смысла, работать будет и так и так, кода примерно одинаково
55. Said-We 27.03.24 17:55 Сейчас в теме
(54) Если количество с точностью до третьего знака, то весело будет в цикле искать....
(1) Необходимо просто одно значение по вилке найти или для какой-то табличной части и поиск для каждой строки?
Если для табличной части, то это классический запрос SQL, только в 1С через одно место пишется, но результат будет такой же.
https://onecompiler.com/postgresql/428hhxrku
Прикрепленные файлы:
56. ivnik 585 27.03.24 20:33 Сейчас в теме
(55) Во-первых: количество Целое (людей считаем поштучно), во-вторых: учащихся в группе больше 50 не бывает, поэтому в таблице максимум 30 строк.
57. Said-We 28.03.24 00:25 Сейчас в теме
(56) А о какой тогда вилке шла речь? Уже просто интересно, что за задача.
58. ivnik 585 28.03.24 07:07 Сейчас в теме
(57) В таблице есть значения: 26, 30,35, 40 и соответствующие им проценты: 15, 19, 21, 25. Наше кол-во равно 32, нужно получить процент по нижней границе, т.е. "вилка" между 30 и 35. Т.е. наше любое число от 30 по 34 должно получить 19%.
P.S. Задача аналогичная, когда нужно получить процент на доплату за стаж по шкале стажа.
59. Said-We 28.03.24 11:19 Сейчас в теме
(58) У вас одно единственное значение или некая таблица со значениями и для каждого такого значения, необходимо получить %?
60. ivnik 585 28.03.24 11:47 Сейчас в теме
(59) Одно значение, для которого нужно получить % из таблицы.
61. ivnik 585 29.03.24 20:32 Сейчас в теме
Если вдруг кому-то придется решать подобную задачу, вот готовый образец-шаблон.
Прикрепленные файлы:
ПолучитьПроцент.epf
62. karamazoff 96 30.03.24 00:03 Сейчас в теме
(61)С таким рейтингом такие задачи решать... Да... это для 3-го класса на бейсике, еще и код читать не умеете... Вот кому придется решать ТАКИЕ задачи???
63. ivnik 585 30.03.24 08:45 Сейчас в теме
(62) Иногда бывает "короткое замыкание" и именно на мелочи, даже зная, что элементарное решение в несколько строчек кода, но.... А рейтинг тут совершенно ни при чем.
Эту задачу так же можно решить элементарным циклом в 5 строчек кода, просто в тот день произошло "кз".
Оставьте свое сообщение

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