Содержание:
1. Решение задачи нахождения максимального значения в 1С
Исходными условиями является то, что в платформе системе 1С есть некоторая таблица, из столбца которой нужно найти наибольшее значение и вывести его.
Это означает, что программно необходимо «обойти» все строки заданного столбца таблицы документа, после чего, сделать выборку и вывести наибольшее число (или тип значения), этот реквизит должен быть выведен в форму.
При помощи синтаксис-помощника 1С можно сгенерировать такой код программы 1С для этих целей (пример основан на сортировке по цене):
Внутри задачи данное программное решение будет выглядеть так – выполнение цикла с заполнением таблицы, проведение сортировки нужного столбца по убыванию и вывод индекса столбца с максимальным значением 1С:
2. Программное решение 1С, распознающее и выводящее наибольшее и наименьшее значение из таблицы
Рассмотрим схожее программное решение 1С, которое будет распознавать и выводить и наибольшее, и наименьшее значение из таблицы, возвращаться будет структура с наименьшим и наибольшим значениями из заданной таблицы.
Отличие этого способа от предыдущих в том, что он основывается на запросах и находит также минимум, что является более универсальным способом.
Рассмотрим также ситуацию, когда задана таблица значений (количество столбцов и строк в ней задаёт юзер 1С) и нужно получить наибольшие значения для каждого столбца, в этом случае будет работать следующий программный код 1С:
Специалист компании “Кодерлайн”
Айдар Фархутдинов
0
1С 8.x : Поиск максимума и минимума в таблице значений
// Возвращает структуру с минимальное и максимальное значение в таблице значений
// Структура содержит поля Макс,Мин
// тзДанные - таблица значений
// ПолеМакс, ПолеМин - строка с именем максимального и минимального поля
// Если поле ПолеМакс неуказанно то минимум ищеться по ПолеМин
Функция МаксМинВТаблицеЗначений(тзДанные, ПолеМин, ПолеМакс = Неопределено)
Результат = Новый Структура("Макс,Мин");
ЗапросМакМин = Новый Запрос;
ЗапросМакМин.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ЗапросМакМин.Текст = "ВЫБРАТЬ
| РабТаблица._ПолеМакс КАК Макс,
| РабТаблица._ПолеМин КАК Мин
|ПОМЕСТИТЬ РабочаяТаблица
|ИЗ
| &РабТаблица КАК РабТаблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| МАКСИМУМ(РабочаяТаблица.Макс) КАК Макс,
| МИНИМУМ(РабочаяТаблица.Мин) КАК Мин
|ИЗ
| РабочаяТаблица КАК РабочаяТаблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|УНИЧТОЖИТЬ РабочаяТаблица";
ЗапросМакМин.Текст = СтрЗаменить(ЗапросМакМин.Текст, "_ПолеМакс" , ПолеМакс);
ЗапросМакМин.Текст = СтрЗаменить(ЗапросМакМин.Текст, "_ПолеМин" , ПолеМин);
ЗапросМакМин.УстановитьПараметр("РабТаблица", тзДанные);
РезМаксМин = ЗапросМакМин.Выполнить().Выгрузить();
Результат["Макс"]= РезМаксМин[0].Макс;
Результат["Мин"] = РезМаксМин[0].Мин;
Возврат Результат;
КонецФункции
Как вы получите максимальное значение в таблице в данном случае? |
Я |
27.05.11 – 13:43
1. Пакетным запросом | 0% (0) | |
2. Упордочить и взять значение из первой строки | 0% (0) | |
3. Перебор в цикле | 0% (0) | |
4. Другое | 0% (0) |
Всего мнений: 0
Вопрос такой – представим себе – используется клиент-серверная база 1С,есть таблица значений – к примеру, в ней 30 колонок и 100 000 строк
Нужно взять максимальное значений из определенной колонки, вам нужно сделать наиболее оптимально.
Чем вы воспользуетесь?
1 – 27.05.11 – 13:43
Получу при формировании таблицы
2 – 27.05.11 – 13:44
3 – 27.05.11 – 13:44
(1) Условие – получить можно только после формирования
4 – 27.05.11 – 13:44
Голосую
5 – 27.05.11 – 13:45
либо запрос, либо перебор… по обстоятельствам…
6 – 27.05.11 – 13:46
(5) смотри “в ней 30 колонок и 100 000 строк”
7 – 27.05.11 – 13:49
Уточню, что ищщетца. Если максимум ссылочного типа – сначало уточню, как он ищется (по UID, по Представлению).
Если по UID – перебор, если представление – Пакет.
Если примитивный тип – перебор.
8 – 27.05.11 – 13:49
Произведу замер производительности и выберу оптимальный вариант.
9 – 27.05.11 – 13:51
(7) Максимальное числовое значение
10 – 27.05.11 – 13:52
“”в ней 30 колонок и 100 000 строк””
Что-то подсказывает мне, что перебор здесь сработает как минимум раз в 100 медленнее, чем через пакетный запрос
11 – 27.05.11 – 13:54
Получу при формировании таблицы. Если же навяжут условие из (3) – тогда постараюсь провести серию замеров всеми способами.
12 – 27.05.11 – 14:03
за запросы надо кастрировать.это не симптом. это диагноз программиста-халтурщика.
упорядочить – халтура.
упорядочить не получится тк 30 колонок
(я понял искать нужно по всем колонам)
проверю до первого удовлетворительного с учетом прогноза
возможного роста инфо потока.
переберу
выгружу в одномерный массив переберу.
если на сервере выгружу в массивЫ переберу в N фоновых заданий , где N число доступных ядер.
попробую использовать скд, как быстрый итератор .
либо выгружу в safe array и обработаю в оле объекте (если виндоус ). подойдет мс скрипт контрол.
напишу ВК.
13 – 27.05.11 – 14:06
(0)
Построителем запроса с источником данных
14 – 27.05.11 – 14:06
(12) ахренеть… особенно N фоновых заданий, оле и ВК…
15 – 27.05.11 – 14:11
(12) “за запросы надо кастрировать.это не симптом. это диагноз программиста-халтурщика.” – За такие слова надо предавать анафеме от БГ прямо по центральному каналу !!! Чтоб вообще никто не подпускал к конфигуратору
16 – 27.05.11 – 14:12
Как левая пятка подскажет =)
17 – 27.05.11 – 14:13
я бы кастрировал за вк
18 – 27.05.11 – 14:16
Замер рулит, чо… не удивлюсь, если сортировка отработает быстрее перебора
19 – 27.05.11 – 14:18
(12) супер мастер г0внокода…
20 – 27.05.11 – 14:19
Получу при формировании таблицы.
за условие (3) плюну в рожу, тому кто его поставил..ибо он не компетентен
21 – 27.05.11 – 14:21
(20) как вариант – таблица приходит из закрытого модуля (инкапсуляция реализации типа) или модифицировать код формирования таблицы дольше/сложнее…
22 – 27.05.11 – 14:21
(20) вот .. плевать не надо только 🙂
А то далеко, не попадешь 🙂
23 – 27.05.11 – 14:22
Условие – есть исходная таблица, нужно получить из нее максимальные значения, а как она сформирована, не интересует 🙂 Нужно взять из формированной таблицы
24 – 27.05.11 – 14:23
(12) Много букав и все не по делу. Научись читать сначала, пейсатель буквами.
>Нужно взять максимальное значений из ОПРЕДЕЛЁННОЙ колонки.
Стотыщь это не цифра для скуля, что бы я такой фигнёй себе голову забивал.
25 – 27.05.11 – 14:23
(23) вернее – максимальное значение из 1 колонки
26 – 27.05.11 – 14:24
(21) извраты по необходимости не обсуждает
если нельзя, но сильно надо, то можно (цы)
27 – 27.05.11 – 14:24
(12) смотри (0)
28 – 27.05.11 – 14:24
*обсуждаем
29 – 27.05.11 – 14:24
(25) на остальные колонки положить?
30 – 27.05.11 – 14:24
31 – 27.05.11 – 14:25
вообще может так лучше –
ТЗ1 = ТЗ.Скопировать(,”НужнаяКолонка”)
и запрос уже к ТЗ1
32 – 27.05.11 – 14:27
(31) окстись…
33 – 27.05.11 – 14:27
тогда в замер еще б включил ВыгрузитьКолонку( с последующим перебором массива и Скопировать()->Свернуть()… но все это только в том случае, если это реально узкое место, иначе сделал бы как понятнее
34 – 27.05.11 – 14:28
(31) Смотря, что в результате получить надо, мож там строку целиком вернуть надо, а не только одно значение.
35 – 27.05.11 – 14:28
(31) ТЗ.Сортировать(“НужнаяКолонка”) тогда уж и запрос не нужен что сортировка, что копирование одинаково долгоиграющие
36 – 27.05.11 – 14:28
(34) судя по условию нужно значение получить тока
37 – 27.05.11 – 14:30
А воспримет ли система такой запрос и будет ли такое оптимальным?
ВЫБРАТЬ
МАКСИМУМ(ЕСТЬNULL(ТЗ.НужнаяКолонка,0)) КАК МаксЗначение
ПОМЕСТИТЬ МаксимальноеЗначение
ИЗ &ТЗ КАК ТЗ;
ВЫБРАТЬ
МаксимальноеЗначение.МаксЗначение
ИЗ МаксимальноеЗначение КАК МаксимальноеЗначение
38 – 27.05.11 – 14:32
(35) тз оперативку жрет, присем такая тз много сожрет
39 – 27.05.11 – 14:35
Все больше склоняюсь к мнение что в общем случае перебор, с учетом задачи.
40 – 27.05.11 – 14:36
А нафига сортировать то? Сортировка быстрее перебора сработает? Сильно сомневаюсь чего то.
41 – 27.05.11 – 14:40
Сверну таблицу только по этому столбцу (без суммирования).
После отсортирую то что получится и выберу первое значение.
И набор данных уменьшится, и читабельность кода повысится.
На скорость плевать.
Главное читабельность кода и возможность его поддержки.
42 – 27.05.11 – 14:41
(26) Это мега тч документа… его создали юзеры вручную и поняли что хотят получить максимальное значение.
43 – 27.05.11 – 14:42
(0)
Нужно так:
МаксЧисло = 42;
Сообщить(МаксЧисло)
44 – 27.05.11 – 14:42
(42) а вот почему 100 000 строк. в тч документа больше быть не может. понятно.
45 – 27.05.11 – 14:42
(41)Мы не на заре эпохи ЭВМ.
На производительность смотрю только в крайних случаях (проведение документов), и портить читабельность кода за скорость… “нафиг” “нафиг”…
46 – 27.05.11 – 14:42
А как вы поступите при такой вот задаче?
Дано: модуль проведения “тяжелого” документа, необходимо найти максимальное значение в большой ТЗ. Замеры показывают:
– поиск перебором занимает 0,07 сек;
– поиск построителем занимает 0,11 сек;
– поиск сортировкой занимает 0,14 сек;
– поиск запросом к ТЗ занимает 0,15 сек;
– запись движений в регистры занимает 50 сек.
Варианты решения:
а) сделаю оптимально, по замеру;
б) сделаю как удобнее мне, быстрее и читабельнее;
в) перестану страдать херней, сделаю как придется и займусь оптимизацией записи движений в регистры.
47 – 27.05.11 – 14:43
(43) с получением случайного значения не путаешь?
48 – 27.05.11 – 14:45
(46) взял и весь кайф обломал 🙁
нафига?
49 – 27.05.11 – 14:46
(48) Надоели=)
50 – 27.05.11 – 14:47
сделаю оптимально, по замеру;
сделаю как удобнее мне, быстрее и читабельнее;
т.е запросом к тз.
вот так правдоподобней выглядит
– поиск перебором занимает 0,15 сек;
– поиск запросом к ТЗ занимает 0,07 сек;
51 – 27.05.11 – 14:47
(47) Нет конечно!!!
wiki:Ответ_на_главный_вопрос_жизни,_вселенной_и_всего_такого
42 – отвечает на главный вопрос!
(46) Буду сидеть с умным лицом и делать вид что работаю =)
52 – 27.05.11 – 14:48
(46) а где вариант “сделаю оптимально как мне кажется правильным (без замера)” ?
и да, “Premature optimization is the root of all evil” (с) Кнут вроде б
53 – 27.05.11 – 14:53
(50) Проверь. Помещение в запрос будет самым медленным, перебор самым быстрым.
54 – 27.05.11 – 14:55
(46) Реально мерял?
55 – 27.05.11 – 14:59
Получать такую большую таблицу для такого тупого использования? Перебор… ВК…
Про индексы кто-нить слышол?
56 – 27.05.11 – 15:01
(55) ты про это?
ИндексыКоллекции.Добавить (CollectionIndexes.Add)
ИндексыКоллекции (CollectionIndexes)
Добавить (Add)
Синтаксис:
Добавить(<Колонки>)
Параметры:
<Колонки> (обязательный)
Тип: Строка. Строковое описание колонок индекса в виде: “Колонка1, Колонка2…”.
Возвращаемое значение:
Тип: ИндексКоллекции.
Описание:
Добавляет индекс в список индексов коллекции.
57 – 27.05.11 – 15:02
(55) а как в данном случае можно использовать индекс?
58 – 27.05.11 – 15:03
никак они нужны для поиска по тз
59 – 27.05.11 – 15:04
(56) Я в принципе про индексы, не в ТЗ так во временной или невременной таблице… вообще странно что такая большая таблица получается “в просто ТЗ”
(46) Значение поиска всегда было в 3-ей строке ТЗ из 100000? 🙂
Тогда перебор рулит конечно
60 – 27.05.11 – 15:08
(59) Не ПОИСК, а МАКСИМУМ.
61 – 27.05.11 – 15:09
Поскольку индексов нет, перебор будет в любом случае.
Поэтому – (46) выглядит вполне логично.
62 – 27.05.11 – 15:10
(54) Нет, наобум цифры взял.
Делать мне нечего – специально мерить, своей работы хватает.
63 – 27.05.11 – 15:14
(0)
Ваш вопрос показывает, что Вы весьма туго понимаете
как происходит выполнение запроса или реализация алгоритма.
В поставленной Вами задаче – SQL будет искать тем же перебором
Так же непонятен смысл формирования ТЗ из 100 000, да еще без индексов
Советую изучать матчасть, а не плодить глупые опросы
64 – 27.05.11 – 15:16
(59) Тут немного не поняли мою мысль.
Во-первых, все зависит от конкретной задачи.
Во-вторых, оптимизацией подобного рода имеет смысл заниматься, если выигрыш по времени сопоставим по порядку с временем работы ВСЕЙ процедуры (задачи, транзакции, etc).
В третьих, устраивать религиозные споры из таких вещей – глупо, избыточный перфекционизм до добра не доводит. Чреват как минимум срывом сроков по основной задаче, которую выполняешь.
Все ИМХО.
65 – 27.05.11 – 15:17
(63) я не писал, что без индексов
Просто перебор – выполняется на клиенте, запрос – на сервер (клиент-серверная база)
Смысл – понять, что будет работать быстрее по времени
66 – 27.05.11 – 15:19
(63) + если бы был глупый вопрос, я бы давным давно получил на него ответ 🙂
67 – 27.05.11 – 15:53
(66) вот ответ, попробуй прогони пустой цикл 100 000 раз
для а =1 по 100 000 цикл
конеццикла
и посмотри сколько он у тебя работать будет.
68 – 27.05.11 – 15:55
А что … Сейчас попробую прогнать вот такой кусок ради интереса
Сообщить(ТекущаяДата());
для а =1 по 100000 цикл
Состояние(а);
конеццикла;
Сообщить(ТекущаяДата());
69 – 27.05.11 – 15:56
вернее даже так …
Сообщить(ТекущаяДата());
для а =1 по 100000 цикл
Состояние(а);
ОбработкаПрерыванияПользователя();
конеццикла;
Сообщить(ТекущаяДата());
Для подстраховки …
70 – 27.05.11 – 15:56
Убери вот это: Состояние(а);
Вон из профессии!
71 – 27.05.11 – 15:57
да пошутил я … Строка(а) конечно же
72 – 27.05.11 – 15:57
На Состояние у тебя уйдет 95% времени выполнения.
Бить табуреткой по пальцам таких замерщиков.
73 – 27.05.11 – 15:58
пошла
74 – 27.05.11 – 15:58
(71) *facepalm
75 – 27.05.11 – 15:58
(72) на сравнение – не меньше
76 – 27.05.11 – 15:58
И этот человек поднимает такие темы? Мва-ха-ха
77 – 27.05.11 – 15:59
после того как прогонишь попробуй поместить тз со 100 000 строк можно даже с одной колонкой в запрос и тоже замерь.
78 – 27.05.11 – 15:59
(75) Открой для себя “Замер производительности”.
А лучше закрой конфигуратор, напиши по собственному и иди в менеджеры.
79 – 27.05.11 – 15:59
1 мин. 25 сек – прогон цикла
80 – 27.05.11 – 16:00
а помешение в запрос?
81 – 27.05.11 – 16:00
(78) Я это уже лет как 8 знаю – “Замер производительности”, я еще 7.5 видел, а ты говоришь 🙂
82 – 27.05.11 – 16:01
(81) не отвлекайся замеряй
83 – 27.05.11 – 16:01
(80) Сейчас что-нибудь придумаю ради эксперемента 🙂
84 – 27.05.11 – 16:01
(81) И меряешь таймером с квантом в секунду?
85 – 27.05.11 – 16:13
(81) Ааа, семерочник? (** сплевывая цигарку). Ручки свои к нежной восьмерке тянешь? НукаИдикаСюдаНа :-).
86 – 27.05.11 – 16:15
(80) код написать?
87 – 27.05.11 – 16:17
(85) 8.1 занимаюсь уже почти 3 года, 8.2 – полгода
88 – 27.05.11 – 16:17
Так что я универсал 🙂
89 – 27.05.11 – 16:17
(80) сейчас новая ветка появится
“Как поместить Тз в запрос?”
90 – 27.05.11 – 16:18
(88) ВАЗ 2104?
91 – 27.05.11 – 16:18
Вот набацал небольшой код в УАТе
Процедура КнопкаВыполнитьНажатие(Кнопка)
ЗапросЗ = Новый Запрос;
ЗапросЗ.Текст =
“ВЫБРАТЬ
| уатЗаправкаГСМЗаправки.Ссылка,
| уатЗаправкаГСМЗаправки.НомерСтроки,
| уатЗаправкаГСМЗаправки.Дата,
| уатЗаправкаГСМЗаправки.ТС,
| уатЗаправкаГСМЗаправки.ГСМ,
| уатЗаправкаГСМЗаправки.Водитель,
| уатЗаправкаГСМЗаправки.ПластиковаяКарта,
| ЕСТЬNULL(уатЗаправкаГСМЗаправки.Количество, 0) КАК Количество,
| уатЗаправкаГСМЗаправки.Сумма,
| уатЗаправкаГСМЗаправки.Валюта,
| уатЗаправкаГСМЗаправки.СтавкаНДС,
| уатЗаправкаГСМЗаправки.СуммаНДС,
| уатЗаправкаГСМЗаправки.ПутевойЛист,
| уатЗаправкаГСМЗаправки.Плотность,
| уатЗаправкаГСМЗаправки.НомераТалонов
|ИЗ
| Документ.уатЗаправкаГСМ.Заправки КАК уатЗаправкаГСМЗаправки”;
РезЗ = ЗапросЗ.Выполнить().Выгрузить();
Сообщить(“Записей – “+Строка(РезЗ.Количество()));
Сообщить(“Через запрос начало – “+ТекущаяДата());
ЗапросЗ1 = Новый Запрос;
ЗапросЗ1.Текст =
“ВЫБРАТЬ
| ЕСТЬNULL(ТЗ.Количество, 0) КАК Количество
|ПОМЕСТИТЬ МаксимальноеЗначение
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| МАКСИМУМ(МаксимальноеЗначение.Количество) КАК МаксЗначение
|ИЗ
| МаксимальноеЗначение КАК МаксимальноеЗначение”;
ЗапросЗ1.УстановитьПараметр(“ТЗ”,РезЗ);
РезЗ1 = ЗапросЗ1.Выполнить().Выбрать();
Сообщить(“Через запрос окончание – “+ТекущаяДата());
Если РезЗ1.Следующий() Тогда
Сообщить(РезЗ1.МаксЗначение);
КонецЕсли;
Сообщить(“Через перебор начало – “+ТекущаяДата());
МаксЗначение = РезЗ[0].Количество;
Для Каждого СТР_З ИЗ РезЗ Цикл
МаксЗначение = ?(СТР_З.Количество>МаксЗначение,СТР_З.Количество,МаксЗначение);
КонецЦикла;
Сообщить(“Через перебор окончание – “+ТекущаяДата());
Сообщить(МаксЗначение);
КонецПроцедуры
92 – 27.05.11 – 16:19
Вот результат
Записей – 45 742
Через запрос начало – 27.05.2011 16:14:46
Через запрос окончание – 27.05.2011 16:14:50
300
Через перебор начало – 27.05.2011 16:14:50
Через перебор окончание – 27.05.2011 16:14:51
300
93 – 27.05.11 – 16:19
(69) теперь замерь вот так и удивись:
Сообщить(ТекущаяДата());для а =1 по 100000 цикл Состояние(а); ОбработкаПрерыванияПользователя(); конеццикла; Сообщить(ТекущаяДата());
94 – 27.05.11 – 16:20
95 – 27.05.11 – 16:21
По моему примеру, те, кто сказал, что перебор будет быстрее – правы. Признаю свою ошибку 🙂
96 – 27.05.11 – 16:21
(94) ты не тупи, напиши (93) как есть – в одну строку и замерь.
97 – 27.05.11 – 16:22
(96) 2 сек
98 – 27.05.11 – 16:23
(95) Попробуй Построителем.
99 – 27.05.11 – 16:25
как так пустой цикл минуту бежал а с условием
Через перебор начало – 27.05.2011 16:14:50
Через перебор оконч – 27.05.2011 16:14:51
секунду чета ты неправильно мерииш.
100 – 27.05.11 – 16:27
(96) время увеличилось
27.05.2011 16:20:48
27.05.2011 16:22:35
Было 1 мин. 25 сек, стало 1 мин. 47 сек
Вывод максимума из столбца таблицы
Автор b1ackjke, 03 дек 2012, 15:12
0 Пользователей и 1 гость просматривают эту тему.
есть таблица в которой есть значения состоящая из столбцов M1,M2,M3,M4 и J. Столбец J – это сумма элементов M1-m4*1/4. Вопрос в том как вывести максимальный элемент из столбца J в поле “ответ”? В 1С написании модулей практически ничего не понимаю, помогите пожалуйста Хотя бы общие наводки, как это сделать…
Можно отсортировать таблицу по этой колонке по убыванию. Первая строка – будет ответ.
Можно перебором строк со сравнением значений функцией МАКС()
Можно сделать запрос и в нем вычислить максимальное значение.
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Процедура Поиск_Максимального_Значение_В_Колонках_Заполняемая_ТаблицаНажатие(Элемент)
Для Колоноки=0 По Заполняемая_Таблица.Колонки.Количество()-1 Цикл
Сообщить("В колонке "+Заполняемая_Таблица.Колонки[Колоноки].Заголовок+" максимальное значение = "+Максимольное_Значение_Колонки_Вернуть(Колоноки,Заполняемая_Таблица));
КонецЦикла;
КонецПроцедуры
расскажите пожалуйста немного про синтаксис? В данном случае название процедуры может быть любым? И откуда берется значение “Заполняемая_Таблица”? Это название Табличной части?
Добавлено: 03 дек 2012, 21:17
Функция ВернутьМаксимольноеЗначениеКолонки(Знач ИмяКолонки="",таблица)
Если ПустаяСтрока(ИмяКолонки) Тогда
Возврат 0;
КонецЕсли;
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(таблица.ВыгрузитьКолонку(ИмяКолонки));
Если Список.Количество() = 0 Тогда
Возврат 0;
КонецЕсли;
Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Возврат Список[0].Значение;
КонецФункции // ВернутьМаксимольноеЗначениеКолонки()
Нашел функцию нахождения максимума (она описана выше). Что передавать в качестве параметров(В качестве ИмяКолонки видимо “J”)? и как передать параметр таблица, из формы документа.
Процедура КнопкаВыполнитьНажатие(Кнопка)
//Переменная ТП - реквизит формы с типом Табличное поле (таблица значений)
//Пример1
Для Сч=0 ПО ТП.Колонки.Количество()-1 Цикл
Сообщить("В колонке <"+ТП.Колонки[Сч].Заголовок+"> максимальное значение = "+ВернутьМаксимольноеЗначениеКолонки(Сч,ТП));
КонецЦикла;
//Пример2
Сообщить("В колонке <МояКолонка> максимальное значение = "+ВернутьМаксимольноеЗначениеКолонки("МояКолонка",ТП));
//Пример3
Сообщить("В первой колонке максимальное значение = "+ВернутьМаксимольноеЗначениеКолонки(0,ТП));
КонецПроцедуры
//Описание
//Применимо только для числовых значений
//------------------------------
//Параметры
//Индекс - тип:Число,строка - Индекс колонки, Имя колонки
//таблица - тип: ТаблицаЗначений - Таблица значений или табличное поле с типом таблица значений
Функция ВернутьМаксимольноеЗначениеКолонки(Знач Индекс="",таблица)
Если ПустаяСтрока(Индекс) Тогда
Возврат "Не задан индекс";
КонецЕсли;
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(таблица.ВыгрузитьКолонку(Индекс));
Если Список.Количество() = 0 Тогда
Возврат "В колонке отсутствуют значения";
КонецЕсли;
Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Возврат Список[0].Значение;
КонецФункции // ВернутьМаксимольноеЗначениеКолонки()
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
У меня есть документ, в нем присутствует Табличная Часть Материалы, она же является реквизитом формы. Как передать её в качестве параметра? пробовал вот так, но что то не вышло(
ТП = Элементы.Материалы;
За счет того, что не занимался раньше 1C туплю ужасно ( Может не так табличную часть создаю?
Вот так
ТП = Материалы.Выгрузить();
Сообщить("В колонке количество максимальное значение = "+ВернутьМаксимольноеЗначениеКолонки("Количество",ТП));
Если управляемое приложение то
ТП = Объект.Материалы.Выгрузить();
Сообщить("В колонке количество максимальное значение = "+ВернутьМаксимольноеЗначениеКолонки("Количество",ТП));
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Попробовал, вот что пишет:
{Документ.МетодЛапласа.Форма.ФормаДокумента.Форма(60)}: Ошибка при вызове метода контекста (Выгрузить)
ТП = Объект.Материалы.Выгрузить();
по причине:
Метод недоступен на клиенте
А если выполнять &НаСервере, то как вывести сообщение о максимуме?
Цитата: b1ackjke от 05 дек 2012, 13:20
Попробовал, вот что пишет:
{Документ.МетодЛапласа.Форма.ФормаДокумента.Форма(60)}: Ошибка при вызове метода контекста (Выгрузить)
ТП = Объект.Материалы.Выгрузить();
по причине:
Метод недоступен на клиентеА если выполнять &НаСервере, то как вывести сообщение о максимуме?
в серверной функции получаете ваше максимальное значение
на клиенте ее вызываете и сообщаете результат функции.
Получил помощь – скажи СПАСИБО.
Разобрался сам – расскажи другим.
Наконец то разобрался! Спасибо всем огромное!
0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
|
1 |
|
1C 8.x Поиск максимального значения в колонках02.12.2012, 21:06. Показов 21111. Ответов 20
Есть таблица значений заполненная числами, количество колонок и строк задается пользователем. Как сделать что бы в сообщении выводилось максимальное значение в каждой колонке ?
0 |
Dethmontt Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
||||
02.12.2012, 22:44 |
2 |
|||
0 |
0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
|
03.12.2012, 00:57 [ТС] |
3 |
Везде 0 возвращает (
0 |
Dethmontt Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
||||
03.12.2012, 01:27 |
4 |
|||
ну ты посмотри почему ноль! Добавлено через 2 минуты
1 |
MonoLog 0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
||||
03.12.2012, 09:11 [ТС] |
5 |
|||
Может окинешь код своим взглядом и скажешь где можно было сделать более короче/ проще. Число_Строк и Число_Колонок это поля ввода которые соответственно вводит пользователь.
0 |
Dethmontt Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
||||
03.12.2012, 13:11 |
6 |
|||
Да нормально вроде, только вот тут лишнее
0 |
0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
|
03.12.2012, 13:16 [ТС] |
7 |
У меня тут проблемы с поиском макс числа.
0 |
Dethmontt Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
||||||||
03.12.2012, 13:23 |
8 |
|||||||
Конкретнее Добавлено через 6 минут
И при поиске можно использовать заголовок
1 |
MonoLog 0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
||||||||
04.12.2012, 15:32 [ТС] |
9 |
|||||||
Теперь вопрос не по теме, но всё таки достаточно интересующий меня. Сделал следующим образом.
В Модуле Объекта
Пишет ошибку что не может найти функции.
0 |
Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
|
04.12.2012, 15:49 |
10 |
Полный текст ошибки дай Добавлено через 1 минуту
0 |
0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
|
04.12.2012, 15:53 [ТС] |
11 |
{Форма.Заполнение_Таблицы_Числами.Форма(2,2)}: Процедура или функция с указанным именем не определена (Колонки_Добавить)
0 |
Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
|
04.12.2012, 15:59 |
12 |
Фиг знает что у тебя там вообще =))) Скинь обработку сюда, попробую подсказать….
0 |
0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
|
04.12.2012, 16:10 [ТС] |
13 |
0 |
Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
|
04.12.2012, 16:25 |
14 |
У тебя какой то косяк со связкой формы и объекта…
0 |
Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
|
04.12.2012, 16:34 |
15 |
Ты при создании формы указал что это “Произвольная форма” а произвольная форма никак не связанна с объектом обработки соответственно и с модулем объекта обработки!
0 |
0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
|
04.12.2012, 16:57 [ТС] |
16 |
{ВнешняяОбработка.Заполнение_Таблицы_Умножения.Мод ульОбъекта(15)}: Метод объекта не обнаружен (Количество)
0 |
Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
|
04.12.2012, 17:31 |
17 |
0 |
MonoLog 0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
||||||||
05.12.2012, 23:39 [ТС] |
18 |
|||||||
Получилось как то так. Все рабочее. Но в первой функции и в последней ошибка. Найти как обычно не могу. Кликните здесь для просмотра всего текста
Форма Объекта: Кликните здесь для просмотра всего текста
0 |
Модератор 3720 / 2915 / 574 Регистрация: 10.03.2011 Сообщений: 11,481 Записей в блоге: 1 |
|
06.12.2012, 01:05 |
19 |
Какая ошибка то? =))
0 |
MonoLog 0 / 0 / 0 Регистрация: 28.11.2012 Сообщений: 30 |
||||
06.12.2012, 10:21 [ТС] |
20 |
|||
ну как я понимаю Добавлено через 1 час 44 минуты
0 |