|   |   | 
| 
 | Упростить выражение для оценки показателя | ☑ | ||
|---|---|---|---|---|
| 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) Можно два вычисляемых выражения для ввода в режиме предприятия.
 Причем второе только после первого выполняется и его конечный результат использует уже вычисленный. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |