8.х Округление в 1С

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем girl-friend, 19 апр 2010.

  1. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    кстати глюк имеет место быть :)

    реально, если в 1С попытаться округлить скажем 1.2 до единиц с параметром округления 15как2, то в итоге получим 1, а не 2.
    Приходится извращатся.....
  2. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Извращаются тут пока только двое, а остальные после своруют результат, не забыв поблагодарить извращенцев.

    Кстати, ОкрВниз тоже отсутствует, как класс.

    Причина в чём? В том, что оба стиля округления отличаются только тем, как будет округляться спорная "пятёрка". Остальные варианты остаются нетронутыми.
  3. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Это не глюк - все верно работает.
    Параметр указывает, как округлять значение 1.5
    А вот 1.2 всегда будет 1 в таком случае, чтобы получить 2 - надо делать +0.5
  4. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Как никогда понимаю мудрость рассказа, "как программисты строили дом". Мне восьмёра нравится больше семёрки, но, подери их Дьявол, зачем сужать функционал в новой версии? "ОкрВверх" не такая уж и бесполезная функция.
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Хм, если округлять по правилам математики, то ближайшим целым при округлении в большую сторону можно считать, если округляемое значение больше .(4). Смысл тогда догонять его до .5?

    Если человек хочет округлить, скажем, 1.2 до 2, то наверно не просто так и естетсвенно шибко удивляется тому, что нужно догонять округляемое значение до 1.5.....

    .....НИПАНЯТНА (с).......
  6. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Код:
    2 = Цел(1.2) + 1;
    
    :)))) Самый простой вариант для таких случаев.
  7. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Спорим, что

    Код:
    2 = ОкрВверх(1.2);
    
    
    проще, чем

    Код:
    2 = Цел(1.2) + 1;
    
    
  8. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Даже спорить не надо :)
    Просто, как вариант.
  9. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    кхм....а если неизвестно, будет ли округляемое значение больше целого или нет? :)
    вариант с условием - это из серии извращений в этом топике :)
  10. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    Чтож, посмотрел на ваши примеры, искал в интернете халявный (уже написанный) метод установки разрядов и решил, что прийдется (да и походу быстрее) написать его самому.
    У меня дела обстоят немного иначе, мне надо в Надпись1 вставить некоторое число, например 1 968,1, но с разрядом 2, т.е. в перспективе должно быть 1 968,10. Как бы не так! Нифига не происходит в установке разряда! Похоже что эта функция не подходит для установки разрядов, чую разряды используются толька для указания места округления. Так вот, следующий программный текст позволяет четко зафиксировать разряды и округлить так как вам надо, используя 4-ре параметра:
    1. Само число
    2. Разряд = 0
    3. Округлить в верх = 1
    4. Округлить 15-ть как 20-ть
    Зацените! :angry:
    Код:
    Процедура УстановкаРазряда(МоеЧисло, РазмерРазряда)
    Н = 0;
    Пока Н < РазмерРазряда Цикл
    Н = Н + 1;
    МоеЧисло = МоеЧисло + "0";
    КонецЦикла;
    КонецПроцедуры
    
    Функция Округл(МоеЧисло, Разряд = 0, ОкруглВверх = 1, Окр15как20 = 1)
    М3 = 0;
    Если Разряд = 0 Тогда
    М3 = 1;
    Разряд = 1;
    КонецЕсли;	
    Н = 0; М1 = СтрДлина(МоеЧисло);
    Пока Н < СтрДлина(МоеЧисло) Цикл
    Н = Н + 1;
    //ищим запятую
    Если сред(МоеЧисло, Н, 1) = "," Тогда
    М1 = Н - 1;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    НачЧисла = сред(МоеЧисло, 1, М1);
    Если М1 < СтрДлина(МоеЧисло) Тогда 
    М2 = 0;
    //устанавливаем разряд в соответствии с требованиями
    КонЧисла = сред(МоеЧисло, М1 + 2, СтрДлина(МоеЧисло)); 
    Если СтрДлина(КонЧисла) < Разряд Тогда
    УстановкаРазряда(КонЧисла, Разряд - СтрДлина(КонЧисла));
    КонецЕсли;
    //вычисляем наращивание КонЧисла
    Если СтрДлина(КонЧисла) > Разряд Тогда
    М2 = Число(сред(КонЧисла, Разряд + 1, 1));
    Если ((ОкруглВверх = 1) и (Окр15как20 = 1)) или ((ОкруглВверх = 0) и (Окр15как20 = 1)) Тогда
    Если М2 > 4 Тогда
    Наращивание = "";
    УстановкаРазряда(Наращивание, Разряд - 1);
    Наращивание = "0," + Наращивание + "1"; 
    КонецЕсли;
    ИначеЕсли (ОкруглВверх = 1) и (Окр15как20 = 0) Тогда
    Если М2 <> 0 Тогда
    Наращивание = "";
    УстановкаРазряда(Наращивание, Разряд - 1);
    Наращивание = "0," + Наращивание + "1";
    КонецЕсли;
    ИначеЕсли (ОкруглВверх = 0) и (Окр15как20 = 0) Тогда
    Если М2 <> 0 Тогда
    Наращивание = "";
    УстановкаРазряда(Наращивание, Разряд - 1);
    Наращивание = "-0," + Наращивание + "1";
    КонецЕсли;
    КонецЕсли;	
    КонЧисла = "0," + КонЧисла;
    КонЧисла = Строка(Число(КонЧисла)+Число(Наращивание));
    КонЧисла = Сред(КонЧисла, 3, Разряд);
    КонецЕсли;  		
    Иначе
    //в случае если число целое, потом просто дописываем нули
    КонЧисла = "";
    КонецЕсли;
    УстановкаРазряда(КонЧисла, Разряд - СтрДлина(КонЧисла));
    Если М3 = 1 Тогда
    Попытка
    Если ((ОкруглВверх = 1) и (Окр15как20 = 1)) или ((ОкруглВверх = 0) и (Окр15как20 = 1)) Тогда
    Если Число(сред(МоеЧисло, М1 + 2, 1)) > 5 Тогда
    НачЧисла = Строка(Число(НачЧисла) + 1);
    КонецЕсли;
    ИначеЕсли ((ОкруглВверх = 1) и (Окр15как20 = 0)) Тогда
    Если Число(сред(МоеЧисло, М1 + 2, 1)) > 0 Тогда
    НачЧисла = Строка(Число(НачЧисла) + 1);
    КонецЕсли;
    КонецЕсли; 
    Исключение
    
    КонецПопытки;
    Разряд = 0;
    КонецЕсли;		
    Возврат ?(Разряд = 0, НачЧисла, НачЧисла + "," + КонЧисла);
    КонецФункции
    
    ЗЫ - код написан на скорую руку, но он работает, если есть желающие по оптимизации кода, я только за, продолжаем вопрос... =)
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    ИПАНУЦЦА! :)

    прошу прощения....
  12. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    Ну так для этого и нужны миру кодеры... :angry:

    ЗЫ - кодер, это узко направленный программист на написание сложного кода/логики программы...
    ЗЫ2 - люблю сложные алгоритмы, а особые извращения у меня на Delphi... ;)
  13. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    Исправил ошибку, если значение являлось нулевым, выдавал ",00" вместо "0,00" (в зависимости от кол-ва разрядов). Теперь код является полностью рабочим.
    Код:
    Процедура УстановкаРазряда(МоеЧисло, РазмерРазряда)
    Н = 0;
    Пока Н < РазмерРазряда Цикл
    Н = Н + 1;
    МоеЧисло = МоеЧисло + "0";
    КонецЦикла;
    КонецПроцедуры
    
    Функция Округл(МоеЧисло, Разряд = 0, ОкруглВверх = 1, Окр15как20 = 1)
    М3 = 0;
    Если Разряд = 0 Тогда
    М3 = 1;
    Разряд = 1;
    КонецЕсли;	
    Н = 0; М1 = СтрДлина(МоеЧисло);
    Пока Н < СтрДлина(МоеЧисло) Цикл
    Н = Н + 1;
    //ищим запятую
    Если сред(МоеЧисло, Н, 1) = "," Тогда
    М1 = Н - 1;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    НачЧисла = сред(МоеЧисло, 1, М1);
    Если М1 < СтрДлина(МоеЧисло) Тогда 
    М2 = 0;
    //устанавливаем разряд в соответствии с требованиями
    КонЧисла = сред(МоеЧисло, М1 + 2, СтрДлина(МоеЧисло)); 
    Если СтрДлина(КонЧисла) < Разряд Тогда
    УстановкаРазряда(КонЧисла, Разряд - СтрДлина(КонЧисла));
    КонецЕсли;
    //вычисляем наращивание КонЧисла
    Если СтрДлина(КонЧисла) > Разряд Тогда
    М2 = Число(сред(КонЧисла, Разряд + 1, 1));
    Если ((ОкруглВверх = 1) и (Окр15как20 = 1)) или ((ОкруглВверх = 0) и (Окр15как20 = 1)) Тогда
    Если М2 > 4 Тогда
    Наращивание = "";
    УстановкаРазряда(Наращивание, Разряд - 1);
    Наращивание = "0," + Наращивание + "1"; 
    КонецЕсли;
    ИначеЕсли (ОкруглВверх = 1) и (Окр15как20 = 0) Тогда
    Если М2 <> 0 Тогда
    Наращивание = "";
    УстановкаРазряда(Наращивание, Разряд - 1);
    Наращивание = "0," + Наращивание + "1";
    КонецЕсли;
    ИначеЕсли (ОкруглВверх = 0) и (Окр15как20 = 0) Тогда
    Если М2 <> 0 Тогда
    Наращивание = "";
    УстановкаРазряда(Наращивание, Разряд - 1);
    Наращивание = "-0," + Наращивание + "1";
    КонецЕсли;
    КонецЕсли;	
    КонЧисла = "0," + КонЧисла;
    КонЧисла = Строка(Число(КонЧисла)+Число(Наращивание));
    КонЧисла = Сред(КонЧисла, 3, Разряд);
    КонецЕсли;  		
    Иначе
    //в случае если число целое, потом просто дописываем нули
    КонЧисла = "";
    КонецЕсли;
    УстановкаРазряда(КонЧисла, Разряд - СтрДлина(КонЧисла));
    Если М3 = 1 Тогда
    Попытка
    Если ((ОкруглВверх = 1) и (Окр15как20 = 1)) или ((ОкруглВверх = 0) и (Окр15как20 = 1)) Тогда
    Если Число(сред(МоеЧисло, М1 + 2, 1)) > 5 Тогда
    НачЧисла = Строка(Число(НачЧисла) + 1);
    КонецЕсли;
    ИначеЕсли ((ОкруглВверх = 1) и (Окр15как20 = 0)) Тогда
    Если Число(сред(МоеЧисло, М1 + 2, 1)) > 0 Тогда
    НачЧисла = Строка(Число(НачЧисла) + 1);
    КонецЕсли;
    КонецЕсли; 
    Исключение
    
    КонецПопытки;
    Разряд = 0;
    КонецЕсли;		
    Возврат ?(Разряд = 0, ?(НачЧисла = "", "0", НачЧисла), ?(НачЧисла = "", "0", НачЧисла) + "," + КонЧисла);
    КонецФункции
    
    Конечно в большинстве случаев в 1С настраиваются компоненты для отображения разрядности чисел, но всеже не везде можно обойтись средствами 1С, этот код специально для таких случаев...
  14. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Жесть :)
  15. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    ммм... а как же встроеная функция "Формат"?
    Код:
    А = Формат(123456.789, "ЧЦ=10; ЧДЦ=4");
    
    // А = "123 456,7890"
  16. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Здраствуйте!
    Чёт тут из мухи слона создали, надо просто изучить доп. параметры функций 1С и не надо тормозящий код писать, всё украдено до нас (BabySG, сорри у тебя украл :D ), так давайте же этим пользоваться :angry:
  17. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    хм, странно, я попробовал ей воспользоваться так:
    Код:
    Текст = Формат(Строка(МойИтогЗапроса.ПродИтого), "ЧЦ=10; ЧДЦ=2");
    
    Никаких разрядов я не обнаружил, числа вышли целые...
    Вы пробовали применить этот код?

    mialord, какой код вы предлагаете, я бы срадостью заменил столь громоздкий код! =)
  18. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    А зачем функция Строка здесь? Мы же форматируем число.
  19. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    Да, спасибо, работает! =))))
    Почему интересно я найти не мог в инете такой элементарной вещи? Столько кодить впустую пришлось... Х)
    Ладно, Stack_G, признаю, ты побил тут всех! ;)
  20. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Ну чтож, вроде все разобрались, и все довольны. В интернете этого нету, так как функционал давно обкатанный и довольно таки прост, вот сильно и неюзается. А вообще в дальнейшем синтаксис-помощник Вам в помощь, думаю тему можно больше не юзать :angry:

Поделиться этой страницей