|
Упростить выражение для оценки показателя | ☑ | ||
---|---|---|---|---|
0
pavelprk
26.04.19
✎
08:14
|
Небольшой брейнтренинг!
Дано: есть какой-то показатель, назовем его К Необходимо рассчитать другой показатель, назовем его П, по правилам: 1) если К >= 1, то П = 1 2) если К >= 0.5 И К < 1, то П = К 3) если К < 0.5, то П = 0 Задача: написать выражение вычисления показателя П на языке 1С Одно условие! Показатель К в выражении должен встречаться ТОЛЬКО ОДИН РАЗ |
|||
7
pavelprk
26.04.19
✎
08:52
|
(5) Ошибся, не любые функции, а только встроенные платформы, иначе смысл теряется
|
|||
8
quest
26.04.19
✎
08:58
|
(0) какой в этом смысл?
|
|||
9
pavelprk
26.04.19
✎
09:00
|
(8) Речь не о смысле, а о решении конкретно данной задачи, на практике такое иногда необходимо
|
|||
10
НЕА123
26.04.19
✎
09:05
|
п=Макс( Мин(Цел(к/2),1)*к, 1)
|
|||
11
Asmody
26.04.19
✎
09:08
|
(0) Точно разрыв должен быть?
|
|||
12
pavelprk
26.04.19
✎
09:08
|
(10) К - два раза встречается
|
|||
13
pavelprk
26.04.19
✎
09:09
|
(11) Не понял какой разрыв, результат вычисления должен быть по правилам
|
|||
14
Asmody
26.04.19
✎
09:10
|
(13) Нужно объяснять что такое разрыв функции?
|
|||
15
pavelprk
26.04.19
✎
09:11
|
(14) А, если речь про это, то да
|
|||
16
Кирпич
26.04.19
✎
09:13
|
(9) про практику не гони. использовать переменную один раз в одном выражении на практике никто не запретит :)
|
|||
17
Asmody
26.04.19
✎
09:18
|
(16) Может у него там вычисляемое поле в СКД, а k - это вызов какой-нибудь функции ОМ?
|
|||
18
pavelprk
26.04.19
✎
09:19
|
(16) Я бы не стал создавать тему, если такое действительно не нужно. Речь не идет о достижении результата П, речь идет об упрощении выражения. Например К, в свою очередь, это другое выражение, при чем очень громоздкое, и не хотелось бы в формуле одно и тоже повторять.
|
|||
19
pavelprk
26.04.19
✎
09:20
|
(17) Это не СКД, хотя и в СКД может пригодиться
|
|||
20
Кирпич
26.04.19
✎
09:26
|
(18) я думал это типа головоломка и у тебя есть готовый ответ :))
|
|||
21
pavelprk
26.04.19
✎
09:30
|
(20) Мне интересны варианты решения
|
|||
22
Кирпич
26.04.19
✎
09:31
|
А Вычислить() туда нельзя пристроить никак?
|
|||
23
trad
26.04.19
✎
09:32
|
(21) у тебя есть хотя бы один вариант решения (0) ?
|
|||
24
pavelprk
26.04.19
✎
09:32
|
(22) Если есть такое решение, то почему нет
|
|||
25
pavelprk
26.04.19
✎
09:32
|
(23) Пока нет
|
|||
26
pavelprk
26.04.19
✎
09:39
|
В выражении точно нельзя использовать конструкцию ?(,,), т.к. в этом случает К встретиться минимум 2 раза
|
|||
27
SSSSS_AAAAA
26.04.19
✎
09:40
|
(5) П = Справочники.Показатели.НайтиПоРеквизиту("К", К).П
|
|||
28
pavelprk
26.04.19
✎
09:42
|
(27) Оригинально, но не подойдет, т.к. К - вещественное число
|
|||
29
seevkik
26.04.19
✎
09:42
|
n = К
Если n >= 1 тогда П = 1 ИначеЕсли n >= 0.5 И n < 1 тогда П = К ИначеЕсли n < 0.5 тогда П = 0 КонецЕсли |
|||
30
catena
26.04.19
✎
09:42
|
(27)А если К рациональное?
|
|||
31
catena
26.04.19
✎
09:43
|
+(28)В смысле да, вещественное)))
|
|||
32
seevkik
26.04.19
✎
09:43
|
(29) ну, второе условие недописал)
|
|||
33
pavelprk
26.04.19
✎
09:43
|
(29) читаем условие задачи (0)
|
|||
34
pavelprk
26.04.19
✎
09:45
|
(29) - (5)
|
|||
35
seevkik
26.04.19
✎
09:46
|
(33) Прочитал, переделал
n = К Если n >= 1 тогда П = 1 ИначеЕсли n >= 0.5 И n < 1 тогда П = n ИначеЕсли n < 0.5 тогда П = 0 КонецЕсли |
|||
36
pavelprk
26.04.19
✎
09:47
|
(35) Нет, где здесь f() ?
|
|||
37
seevkik
26.04.19
✎
09:48
|
(36) окок, я (5) не видел
|
|||
38
SSSSS_AAAAA
26.04.19
✎
09:48
|
(28) И что мешает его округлить до некоторого значения?
Кстати, какие еще условия задачи не оглашены? |
|||
39
trad
26.04.19
✎
09:49
|
вся проблема в разрыве. я думаю решения (0) - нет
|
|||
40
trad
26.04.19
✎
09:51
|
(38) задача описана достаточно пОлно и понятно
(37) в (0) сказано "написать выражение", (35) - не выражение |
|||
41
pavelprk
26.04.19
✎
09:51
|
(39) Возможно, нужно найти решение, или показать, что решения нет
|
|||
42
SSSSS_AAAAA
26.04.19
✎
09:52
|
(18) И что мешает таки результат этого громоздкого выражения присвоить переменной и не трахать мозги себе и другим идиотскими требованиями по количеству использования этого выражения?
|
|||
43
pavelprk
26.04.19
✎
09:55
|
(42) Например такое дополнительное условие: П = Вычислить("f(К)")
никаких дополнительных переменных |
|||
44
catena
26.04.19
✎
09:57
|
формула показателя в ЗУП?
|
|||
45
pavelprk
26.04.19
✎
10:00
|
(44) Ну если сравнить, то типа того
|
|||
46
dmt
26.04.19
✎
10:04
|
(41) Какие у тебя есть мысли по этому поводу?
|
|||
47
pavelprk
26.04.19
✎
10:06
|
(46) Думаю все таки решение есть, я копаю в сторону замены К на другое выражение вида Х(К), и преобразовать к условиям задачи
|
|||
48
pavelprk
26.04.19
✎
10:07
|
На бумаге начертите график функции, станет понятно
|
|||
49
Garykom
гуру
26.04.19
✎
10:10
|
||||
50
Garykom
гуру
26.04.19
✎
10:10
|
(49) Специально для любителей все делать через ж...запросы
|
|||
51
Lama12
26.04.19
✎
10:11
|
Что-то мне подсказывает, что меньше чем 2 раза использовать "К" в выражении, не получится.
|
|||
52
pavelprk
26.04.19
✎
10:11
|
(49) По условию задачи - это не запрос, а выражение на языке 1с
|
|||
53
Garykom
гуру
26.04.19
✎
10:12
|
(52) Ты выражением не можешь Новый Запрос("ТекстЗапроса").Выполинть() ?
|
|||
54
pavelprk
26.04.19
✎
10:16
|
(53) Повторюсь, ответ не соответствует условию задачи
|
|||
55
hhhh
26.04.19
✎
10:19
|
(54) П = Макс(0, Мин(0.5, К - 0.5) + 0.5);
не благодари. |
|||
56
pavelprk
26.04.19
✎
10:21
|
(55) К = 0.25, ответ неверный
|
|||
57
dmt
26.04.19
✎
10:21
|
(55) она непрерывна
|
|||
58
pavelprk
26.04.19
✎
10:22
|
Если бы все так просто было...
|
|||
59
dmt
26.04.19
✎
10:22
|
(47) Как ты думаешь, какие вообще есть способы сделать "разорванную" функцию из двух кусков? Не считая ?(,,)
|
|||
60
pavelprk
26.04.19
✎
10:24
|
(59) Вот я об этом и думаю, хотя пока на данном этапе, соглашусь с тобой об отсутствии решения
|
|||
61
Garykom
гуру
26.04.19
✎
10:27
|
(56) Оберни в условие <0.25 = 0 и все
|
|||
62
pavelprk
26.04.19
✎
10:27
|
Хотя, с другой стороны, не каждую непрерывную функцию тоже можно описать выражением с одним аргументом
|
|||
63
Garykom
гуру
26.04.19
✎
10:28
|
П = ?((Макс(0, Мин(0.5, К - 0.5) + 0.5))<0.5;0;Макс(0, Мин(0.5, К - 0.5) + 0.5))
|
|||
64
Garykom
гуру
26.04.19
✎
10:29
|
(63) Блин тогда К два раза
|
|||
65
pavelprk
26.04.19
✎
10:30
|
(64) да я уже упоминал об этом (26)
|
|||
66
Garykom
гуру
26.04.19
✎
10:33
|
Внутри Вычислить можно использовать второе Вычислить ?
|
|||
67
Asmody
26.04.19
✎
10:34
|
Разрыв первого рода линейными преобразованиями сделать не получится
|
|||
68
НЕА123
26.04.19
✎
10:34
|
ISменьшеНольПять() какой-то нужен.
|
|||
69
pavelprk
26.04.19
✎
10:35
|
(66) да
|
|||
70
pavelprk
26.04.19
✎
10:35
|
(67) Получается решения нет?
|
|||
71
pavelprk
26.04.19
✎
10:37
|
(68) надо будет написать разработчикам )
|
|||
72
pavelprk
26.04.19
✎
10:38
|
(67) возможно ли свести к нелинейному преобразованию?
|
|||
73
catena
26.04.19
✎
10:40
|
(68) или соответствия по диапазонам
|
|||
74
SSSSS_AAAAA
26.04.19
✎
10:46
|
(73) Собственно в своих ответах я на это и намекал. Но товарисч никак не хочет думать дальше...
|
|||
75
pavelprk
26.04.19
✎
10:51
|
(27) (38) используя округление, думаю это пока единственное решение, хотя и оригинальное
|
|||
76
seevkik
26.04.19
✎
10:52
|
а обрезать до десятых и уже с ним работать не вариант?
|
|||
77
pavelprk
26.04.19
✎
10:53
|
Спасибо SSSSS_AAAAA, пока других решений не вижу
|
|||
78
pavelprk
26.04.19
✎
10:56
|
Но результат между 0.5 и 1 будет не точен, округлен
|
|||
79
pavelprk
26.04.19
✎
10:57
|
Получается это не совсем точное решение задачи
|
|||
80
bolobol
26.04.19
✎
11:54
|
(79) Дискретное решение, цифровое)
|
|||
81
bolobol
26.04.19
✎
11:54
|
модное-молодёжное!
|
|||
82
pavelprk
26.04.19
✎
12:24
|
Но хотелось бы найти решение, используя только примитивные операции, типа Мин, Макс и других, а не привязываться к объектным данным
|
|||
83
pavelprk
26.04.19
✎
12:24
|
Например, требуется вычисление f(К) в цикле, где не одна тысяча записей
|
|||
84
bolobol
26.04.19
✎
12:28
|
(83) Ну и запросы у вас: "в цикле"!
|
|||
85
Михаил Козлов
26.04.19
✎
12:39
|
1/2*(ТетаФункцияХевисайда(К)+1).
|
|||
86
Garykom
гуру
26.04.19
✎
12:53
|
Функция Ф(К)
Возврат ?((Макс(0, Мин(0.5, К - 0.5) + 0.5))<0.5;0;Макс(0, Мин(0.5, К - 0.5) + 0.5)); КонецФункции; К = 0.5; П = Вычислить("Ф(К)"); так пойдет? |
|||
87
pavelprk
26.04.19
✎
13:15
|
(86) Нет, уточню еще условия: расчет производится в контексте П = Вычислить(Строка), при чем Строка - это выражение, задаваемое в пользовательском режиме, т.е. у нас нет возможности создать функцию, у нас только шанс на одно, законченное выражение. Строка - это и есть f(К)
|
|||
88
pavelprk
26.04.19
✎
13:17
|
Прицип такой же как в формулах видов расчета ЗУП
|
|||
89
pavelprk
26.04.19
✎
13:20
|
Еще раз, можно не замарачиваться, сделать через ?(,,), используя хоть сколько раз К, но теперь представьте, что К - это результат вложенного выражения, при чем это выражение в несколько десятков строк кода, вот тогда и неудобства возникают
|
|||
90
pavelprk
26.04.19
✎
13:21
|
(89) Поправлю себя, К - это не результат выражения, а само выражение
|
|||
91
pavelprk
26.04.19
✎
13:32
|
В конфигураторе, в модуле:
Для Каждого Строка Из ОченьМногоСтрок Цикл // код до ... П = Вычислить(Выражение); // код после ... КонецЦикла; Выражение - задается в пользовательском режиме, например вида: "?(_ГромоздкоеВыражениеПоВычислению_К_ < 0.5, 0, Мин(_ГромоздкоеВыражениеПоВычислению_К_, 1))" |
|||
92
pavelprk
26.04.19
✎
13:33
|
Как избавиться от повторения _ГромоздкоеВыражениеПоВычислению_К_ ?
|
|||
93
НЕА123
26.04.19
✎
13:41
|
Попытка
П=мин(sin(asin(мин(К,1)-1.5))+1.5; Исключение П=0; КонецПопытки |
|||
94
НЕА123
26.04.19
✎
13:42
|
*
П=sin(asin(мин(К,1)-1.5)+1.5; первый мин() лишнее. |
|||
95
pavelprk
26.04.19
✎
13:42
|
(93) Супер, но это нельзя запихать в Вычислить()
|
|||
96
ptiz
26.04.19
✎
13:44
|
(95) Запихни в Выполнить()
|
|||
97
pavelprk
26.04.19
✎
13:46
|
(94) Будет исключение при К < 0.5
|
|||
98
Кирпич
26.04.19
✎
13:47
|
(91) Ну добавь там в конфигураторе, что надо и не парься.
вместо Вычислить() Выполнить() Для Каждого Строка Из ОченьМногоСтрок Цикл // код до ... П = 0; Выполнить(Выражение); // код после ... КонецЦикла; а в формуле пиши типа "К=ЧоХошь;П=ЧоХошь" |
|||
99
pavelprk
26.04.19
✎
13:48
|
(94) Думаю уже близко к решению, молодец
|
|||
100
pavelprk
26.04.19
✎
13:49
|
(98) Выполнить() - это дырка, но и вопрос не в этом, Вычислить() - использовать принципиально
|
|||
101
Garykom
гуру
26.04.19
✎
13:50
|
(91)
Для Каждого Строка Из ОченьМногоСтрок Цикл // код до ... ГромоздкоеВыражениеПоВычислению_К = Вычислить(ГромоздкоеВыражениеПоВычислению_К); П = Вычислить(Выражение); // код после ... КонецЦикла; Короче код до поправь |
|||
102
pavelprk
26.04.19
✎
13:51
|
(101) Нет, все выражение задается только в режиме предприятия
|
|||
103
Garykom
гуру
26.04.19
✎
13:54
|
(102) Код до Вычислить поправь а не выражение
|
|||
104
Garykom
гуру
26.04.19
✎
13:54
|
Короче вы херней заняты сэр
|
|||
105
Bober
26.04.19
✎
15:12
|
(0) в режиме предприятие вписать расчет ?(К >= 1, 1, ?(К >= 0.5, К, 0)) в режиме конфигуратора реализовать кеширование расчета показателя к, чтобы не ломать голову.
|
|||
106
Garykom
гуру
26.04.19
✎
15:15
|
(105) Можно два вычисляемых выражения для ввода в режиме предприятия.
Причем второе только после первого выполняется и его конечный результат использует уже вычисленный. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |