Имя: Пароль:
1C
1С v8
Упростить выражение для оценки показателя
0 pavelprk
 
26.04.19
08:14
Небольшой брейнтренинг!
Дано: есть какой-то показатель, назовем его К
Необходимо рассчитать другой показатель, назовем его П, по правилам:
1) если К >= 1, то П = 1
2) если К >= 0.5 И К < 1, то П = К
3) если К < 0.5, то П = 0
Задача: написать выражение вычисления показателя П на языке 1С
Одно условие! Показатель К в выражении должен встречаться ТОЛЬКО ОДИН РАЗ
1 Кирпич
 
26.04.19
08:34
Не понятно в чем подвох. Только К и П можно использовать что ли?
2 dmt
 
26.04.19
08:37
п = макс(?(к>=0.5, п, 0), 1)
3 pavelprk
 
26.04.19
08:47
(2) П через П?
4 dmt
 
26.04.19
08:47
чето я херню сморозил
(0), выражение одно?
5 pavelprk
 
26.04.19
08:48
(1) Подвоха нет
Выражение должно быть вида:
П = f(К)
где в выражении f(К), можно использовать любые функции и операции, но К встречаться только один раз
6 pavelprk
 
26.04.19
08:49
(4) Да, конечно одно
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) Можно два вычисляемых выражения для ввода в режиме предприятия.
Причем второе только после первого выполняется и его конечный результат использует уже вычисленный.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший