Имя: Пароль:
1C
1С v8
Минимальное значение
0 lirt82
 
14.03.12
13:35
всем привет.
Не могу понять как в Таблице значений найти минимальное значение,
тоесть :
Таблица значений 3 на 3 к примеру
4 6 9
5 2 3
8 7 10

Вот что бы цифру 2 найти.
Спасибо всем заранее)))
1 hhhh
 
14.03.12
13:37
ну как в других местах ищете, так и здесь. В чем прикол?
2 vmv
 
14.03.12
13:39
(1) тебе запросом чтобы все была крута или как ребитищки - поиском?
3 lirt82
 
14.03.12
13:39
ТаблицаЗначений называется ТЗ

Работаю с табличной частью, и функиция  МинимальноеЧисло мин (ТЗ); не проходит)
4 vmv
 
14.03.12
13:40
даю новодку

ПОМЕСТИТЬ ТЗ

МИНИМУМ
5 Галахад
 
гуру
14.03.12
13:40
Цикл по колонкам.
В цикле.
Сортировка.
Запомнить минимум.
6 Rebelx
 
14.03.12
13:41
сортировать
взять первую строку
7 lirt82
 
14.03.12
13:43
Спасибо)) поробую)
8 vmv
 
14.03.12
13:44
я вот сваяло запросец, пользуйтесь, как поместить Тз во временную не проблемо

"ВЫБРАТЬ
|    МИНИМУМ(Тз.ЗначениеЧисло) КАК МинимальноеЧисло
|ИЗ
|    Тз КАК Тз
|
|СГРУППИРОВАТЬ ПО
|    Тз.ЗначениеЧисло"
9 vmv
 
14.03.12
13:47
так кручи

ВЫБРАТЬ
|    МИНИМУМ(Тз.*) КАК МинимальноеЧисло
|ИЗ
|    Тз КАК Тз
|
|СГРУППИРОВАТЬ ПО
|    Тз.ЗначениеЧисло"
10 vmv
 
14.03.12
13:48
конечный вариант

"ВЫБРАТЬ
|    МИНИМУМ(Тз.*) КАК МинимальноеЧисло
|ИЗ
|    Тз КАК Тз"
11 lirt82
 
14.03.12
14:27
круто)) пасибо) ну а без запроса? мне вариант без запроса нужен)
12 ShoGUN
 
14.03.12
14:31
(11) Отсортировать по очереди по каждой колонке, взять на каждом шаге значение из первой строки и запихать его в список значений. Список значений тоже отсортировать и взять первое значение.
13 ShoGUN
 
14.03.12
14:32
+(12) Хотя не факт, что перечисленное будет сильно быстрее перебора...
14 Kreont
 
14.03.12
14:36
+ еще один самый быстрый вариант :)
Во время внесения/заполнения ТЗ сразу запоминать минимальное значение в отдельной переменной.
15 marvak
 
14.03.12
14:39
(11) по очереди выгружаешь колонки в список значений, полученный список сортируешь по убыванию, берешь первый элемент, его заносишь в отдельный список.

потом отдельный список сортируешь по убыванию, и вуаля.
16 marvak
 
14.03.12
14:39
(12)
:)
одинаково думаем
17 lirt82
 
14.03.12
14:44
а можно если не сложно обозначить небольшим наглядным примером ?:-)
18 ShoGUN
 
14.03.12
14:55
(17) СписокМинимальных = Новый СписокЗначений;
Для Каждого КолонкаТЗ Из ТЗ.Колонки Цикл
ТЗ.Сортировать(КолонкаТЗ.Имя);
СписокМинимальных.Добавить(ТЗ[0][ТЗ.Колонки.Индекс(КолонкаТЗ)]);
КонецЦикла;
СписокМинимальных.СортироватьПоЗначению();
МинимальноеЗначение = СписокМинимальных[0].Значение;

Это по-моему, с сортировкой ТЗ в целом. Можно выгружать каждую колонку в свой список, а список уже сортировать, но имхо особой разницы в производительности не будет.
19 Omskdizel
 
14.03.12
14:57
(18) Кстати не факт, что тупой перебор всех значений будет не быстрее. Ибо проход то один будет.
20 ShoGUN
 
14.03.12
14:58
(19) Я о том же в (13).
21 Omskdizel
 
14.03.12
14:59
(20) Пардон, пропустил
22 marvak
 
14.03.12
15:00
(17)
ВремСписок = Новый СписокЗначений();
ВремСписок1 = Новый СписокЗначений();

Для каждого Колонка Из ТЗ.Колонки Цикл
  ВремСписок.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку(Колонка.Имя));
  ВремСписок.СортироватьПоЗначению();
  ВремСписок1.ДобавитьЗначение(ВремСписок[0]);
КонецЦикла

ВремСписок1.СортироватьПоЗначению();

//ВремСписок1[0] тут минимальное значение
23 Omskdizel
 
14.03.12
15:01
А интересно прогнать на большом массиве и сравнить по скорости...
Если еще и количество колонок фиксированное, то можно через Мин() замутить
24 marvak
 
14.03.12
15:01
(22)+
пардон, ВремСписок1.ДобавитьЗначение(ВремСписок[0].Значение);
25 Kreont
 
14.03.12
15:07
Мин = ТЗ[0][0];
Для каждого а из ТЗ Цикл
Для каждого б из а Цикл
 Мин = Мин(б,Мин);
КонецЦикла;    
КонецЦикла;
26 Kreont
 
14.03.12
15:09
+(25) Сообщить(Мин); //:)))
27 ShoGUN
 
14.03.12
15:31
Ща выясним, я уже код накатал. Нашел у (22) две синтаксические ошибки :)
28 lirt82
 
14.03.12
15:36
ВСЕМ СПАСИБО ЗА ПРОДЕЛАННУЮ РАБОТУ) пробую
29 vmv
 
14.03.12
15:43
запрос на больших Тз все-равно вздует
30 ShoGUN
 
14.03.12
15:44
Таблица значений - реквизит формы, 1000 строк на 1000 колонок, заранее заполнена случайными значениями от 0 до 1000000

Способ 1, сортировка ТЗ с последующей сортировкой списка полученных минимальных значений.
Способ 2, выгрузка каждой колонки в список значений с последующей сортировкой и далее как в способе 1.
Способ 3, Тупой полный перебор.

Результаты стандартным замером производительности у меня получились такие:
Способ 1: 6,620962
Способ 2: 10,857994
Способ 3: 15,501282

Правда в способе 2 в реализации (22) тормозит  
ВремСписок.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку(Колонка.Имя));
Правильней наверное:
ВремСписок = ТЗ.ВыгрузитьКолонку(Колонка.Имя);
Ща проверю.
31 ShoGUN
 
14.03.12
15:46
(29) Напиши готовую процедуру, я померяю.
32 ShoGUN
 
14.03.12
15:48
Тьфу ты, ТЗ.ВыгрузитьКолонку(Колонка.Имя); массив возвращает...
Значит пока таблица значений рулит, список значений очень тормозной на создании элементов.
33 lirt82
 
14.03.12
16:00
Мин = ТЗ[0][0];
Для каждого а из ТЗ Цикл
Для каждого б из а Цикл
 Мин = Мин(б,Мин);
КонецЦикла;    
КонецЦикла;

постоянно пишет 1, даже  если ТЗ [2][1] укажешь где вбиваешь цирфу точно не 1)
34 Галахад
 
гуру
14.03.12
16:04
МинЗн = Мин(б,МинЗн)
35 lirt82
 
14.03.12
16:10
всё рвоно 1 пишет)
36 lirt82
 
14.03.12
16:12
Конечно я понимаю что ТЗ[0][0] это номер строки, и она там постоянно 1 стоит)ну если поменять к примеру на ТЗ [0][1] то всё ровно 1 даёт, иль я чего не понимаю?)
37 Галахад
 
гуру
14.03.12
16:15
Для каждого а из ТЗ.колонки Цикл
38 lirt82
 
14.03.12
16:23
{Форма.Форма.Форма(39)}: Итератор для значения не определен
Для каждого б из а Цикл
39 lirt82
 
14.03.12
16:25
ещё есть  вещь у меня выгружена

ТЗ = Цифры.Выгрузить(); что бы много не прописывать)
40 lirt82
 
14.03.12
16:27
ну это так)) просто
41 Галахад
 
гуру
14.03.12
16:27
(39) Не парься. Скопируй (18)
42 lirt82
 
14.03.12
16:30
я с сортировкой ещё плохо знаком) не работал практически
43 МихаилМ
 
14.03.12
16:34
на больших тз запрос и скд проиграют
тк они исползуеют сохранение в промежуточный файл.
проверялось на 8.1
44 lirt82
 
14.03.12
16:34
(18)
там ошибка


{Форма.Форма.Форма(56)}: Метод объекта не обнаружен (ДобавитьЗначение)
  ВремСписок1.ДобавитьЗначение(ВремСписок[0]);
45 ShoGUN
 
14.03.12
16:35
(44) У меня в (18) нет такой строчки.
46 lirt82
 
14.03.12
16:37
уже уидел поправку
47 Kreont
 
14.03.12
16:39
Код в (25) рабочий 100%, а насчет (33) может 1 и есть минимум
48 Reset
 
14.03.12
16:42
(25) рабочий, подтверждю ;)
49 Kreont
 
14.03.12
16:44
(36) ТЗ[0][0] - это получение значения из первой строки первой колонки
50 lirt82
 
14.03.12
16:45
код 25 выдаёт постоянно  1!
33 тот же код, 1 выдаёт)
51 Reset
 
14.03.12
16:45
(50) А если руки помыть, а потом копипастить? ;)
52 Kreont
 
14.03.12
16:49
(50) в таблице 100% только числа?
53 lirt82
 
14.03.12
16:54
да, толко чилса
54 lirt82
 
14.03.12
16:58
Цифры это табличная часть в три столба ну а строк по желаению)

ТЗ = Цифры.Выгрузить();
Мин = ТЗ[0][0];
Для каждого а из ТЗ Цикл
Для каждого б из а Цикл
Мин = Мин(б,Мин);
КонецЦикла;    
КонецЦикла;
55 lirt82
 
14.03.12
16:58
и постоянно 1
56 КМ155
 
14.03.12
17:00
(55) поставить точку останова и посмотреть в цикле а и б слабо ?
57 Reset
 
14.03.12
17:05
(56) Он даже еще не опроверг версию в (47). Поди есть "1" в его табличной части. Все просто поди)
58 lirt82
 
14.03.12
17:07
Просто я чего то не догоняю))
59 lirt82
 
14.03.12
17:59
НЕт КМI55 не слабо. Как обойти 1ку, кторая как я понимаю в номере строки сидит) 1ый номер строки иль не прав?
60 Kreont
 
14.03.12
18:05
нет(59)
Добавь всередину:
...
Мин = Мин(б,Мин);
Если б = 1 Тогда
Сообщить("Обана, а 1-ца есть");
КонецЕсли;
...

или просто визуально, посмотреть нет ли там 1-ки:
ТЗ.ВыбратьСтроку()
61 Reset
 
14.03.12
18:08
ТЗ = Цифры.Выгрузить();
ТЗ.Колонки.Удалить(0); // <--- Это добавить
62 Reset
 
14.03.12
18:08
(61) к (59) Прав, чертяка
63 hhhh
 
14.03.12
18:10
(59) вот это что за фигня?   Для каждого б из а Цикл
64 Reset
 
14.03.12
18:11
Или внутренний цикл (по б) несколько усложнить на вид:

Для Индекс=1 по ТЗ.Колонки.Количество()-1 цикл
Мин=мин(а[Индекс],Мин);
65 Reset
 
14.03.12
18:18
Вообще, если в ТЧ _фиксировано_ три колонки, я б не стал выделываться с универсальностью и выгрузками.
Т.е.
Мин=ТЧ[0].Имя1;
Для каждого СтрокаТЧ из ТЦ цикл
Мин=Мин(Мин,СтрокаТЧ.Имя1,СтрокаТЧ.Имя2,СтрокаТЧ.Имя3);
КонецЦикла;
66 Kreont
 
14.03.12
18:28
(62) ЧЯДНТ?
Написал обработку, почему у меня 1-ца не пащет?
Процедура КнопкаВыполнитьНажатие(Кнопка)
   ТЗ = Новый ТаблицаЗначений;
   ТЗ.Колонки.Добавить("Сум");
   ТЗ.Колонки.Добавить("Сум2");
   Нов = ТЗ.Добавить();
   Нов.Сум = 5;
   Нов.Сум2 = 3;
   Нов = ТЗ.Добавить();
   Нов.Сум = 7;
   Нов.Сум2 = 9;
   Нов = ТЗ.Добавить();
   Нов.Сум = 9;
   Нов.Сум2 = 6;
   
   Мин = ТЗ[0][0];
   Для каждого а из ТЗ Цикл
       Для каждого б из а Цикл
           Мин = Мин(б,Мин);
       КонецЦикла;    
   КонецЦикла;
   
   Сообщить(Мин);
   
КонецПроцедуры
67 Kreont
 
14.03.12
18:29
+(66) ответ = 3, как и должно
68 Kreont
 
14.03.12
18:31
(63) Обход СтрокаТаблицыЗначений
69 ShoGUN
 
14.03.12
19:25
Факинг шит, в (18) рабочий код без всяких переборов, а они тут перебор ковыряют...
70 Reset
 
14.03.12
20:57
(66) Ты обходишь свою созданную ТЗ, а автор выгружает ее из ТЧ, т.е. кроме своих колонок получает внагрузку колонку с номером строки.
71 Reset
 
14.03.12
21:11
(69) см (13) :)
На маленьких таблицах перебор, имхо, шустрее(об заклад биться не буду). На больших - хз, проверять лень, ибо задача какая-то надуманная. Если бы вдруг дошло до больших таблиц на практике, я наверняка решал бы запросом (не передавая таблицу в параметр, а прямо по бд).
А так - почему бы не пописать в форум простенькие циклы для развлечения? Я, может, так расслабляюсь :)
72 hhhh
 
14.03.12
23:14
(69) всё-таки сортировка в цикле это как запрос в цикле.
73 lirt82
 
15.03.12
09:34
Всем спасибо)) всё работает)
74 Omskdizel
 
15.03.12
09:48
Если кому не лень - прогоните через Мин(), если учесть, что количество колонок в ТЗ например строго 5. Т.е. когда один цикл достаточно.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший