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

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

  1. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Да я, как бы, и бить-то никого не хотел :)
    Мы все здесь просто ищем Истину :)
  2. nomad_irk
    Online

    nomad_irk Гуру в 1С

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

    В рамках 8.1

    Код:
    Функция Округлить(Число, Разрядность = 0, ВидОкругления = 0) <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/экспорт')">Экспорт	</span>
    
    //Разрядность определяет число знаков дробной части, до которых производится округление. 
    //Если параметр отрицательный, то число округляется до соответствующего 
    //разряда в целой части, начиная с младших разрядов
    //Вид округления:0 - математически, 1 - вниз, 2 - вверх
    ВрЗначение = Число;
    ОтрицательноеЗначение = ВрЗначение < 0;
    
    Если Разрядность = 0 Тогда
    ВрЗначение = ВрЗначение * Pow(10, Разрядность);		
    Если ВидОкругления = 1 <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда			</span>
    ВрЗначение = Цел(ВрЗначение);
    ВрЗначениеСтрока = Формат(ВрЗначение, "ЧДЦ=0; ЧРД=.; ЧН=; ЧГ=0");			
    Возврат Число(ВрЗначение) * Pow(10, Разрядность);
    ИначеЕсли ВидОкругления = 2 Тогда
    ВрЗначение = Цел(ВрЗначение);
    ВрЗначениеСтрока = Формат(ВрЗначение, "ЧДЦ=0; ЧРД=.; ЧН=; ЧГ=0");
    Возврат (Число(ВрЗначениеСтрока) + ?(ОтрицательноеЗначение, -1, 1)) * Pow(10, Разрядность);
    Иначе
    ВрЗначениеСтрока = Формат(ВрЗначение, "ЧДЦ=0; ЧРД=.; ЧН=; ЧГ=0");
    Возврат Число(ВрЗначениеСтрока) * Pow(10, Разрядность);
    КонецЕсли;
    КонецЕсли;
    
    Если Разрядность < 0 Тогда
    ВрЗначение = ВрЗначение * Pow(10, Разрядность + 1);		
    Если ВидОкругления = 1 <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда			</span>
    ВрЗначение = Цел(ВрЗначение);
    ВрЗначениеСтрока = Формат(ВрЗначение, "ЧДЦ=0; ЧРД=.; ЧГ=0");			
    Возврат Число(ВрЗначение) * Pow(10, -Разрядность - 1);
    ИначеЕсли ВидОкругления = 2 Тогда
    ВрЗначение = Цел(ВрЗначение);
    ВрЗначениеСтрока = Формат(ВрЗначение, "ЧДЦ=0; ЧРД=.; ЧГ=0");
    Возврат (Число(ВрЗначениеСтрока) + ?(ОтрицательноеЗначение, -1, 1)) * Pow(10, -Разрядность - 1);
    Иначе
    ВрЗначениеСтрока = Формат(ВрЗначение, "ЧДЦ=0; ЧРД=.; ЧГ=0");
    Возврат Число(ВрЗначениеСтрока) * Pow(10, -Разрядность - 1);
    КонецЕсли;
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/иначе')">	Иначе		</span>
    Если ВидОкругления = 1 <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда		</span>
    ДробнаяЧасть = ВрЗначение%1;
    ДробнаяЧасть = ДробнаяЧасть * Pow(10, Разрядность);
    ДробнаяЧасть = Цел(ДробнаяЧасть);
    ДробнаяЧасть = ДробнаяЧасть / Pow(10, Разрядность);			
    Возврат Цел(ВрЗначение) + ДробнаяЧасть;
    ИначеЕсли ВидОкругления = 2 Тогда
    ДробнаяЧасть = ВрЗначение%1;
    ВрЗначениеСтрока = Формат(ВрЗначение + Pow(10, -Разрядность - 1), "ЧДЦ=" + (Разрядность) + "; ЧРД=.; ЧГ=0");			
    Возврат Число(ВрЗначениеСтрока);
    Иначе
    ВрЗначениеСтрока = Формат(ВрЗначение, "ЧДЦ=" + Разрядность + "; ЧРД=.; ЧГ=0");
    Возврат Число(ВрЗначениеСтрока);
    КонецЕсли;		
    КонецЕсли;
    
    КонецФункции
    
    
  3. Gulnaz
    Offline

    Gulnaz Опытный в 1С

    Регистрация:
    20 сен 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Как узнать количество знаков после запятой?
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Код:
    Зн=Строка(МоеЧисло);
    Поз=Найти(Зн,",");
    Сообщить(?(Поз=0,"Число целое", СтрДлина(Зн)-Поз));
    
    
    
  5. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    Я думал тут у нас еще один извращенец появился по поводу округления... Х)
  6. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    Stack_G, в приведенной вами функции Формат(ЗначениеПеременной, "ЧЦ=12; ЧДЦ=2"), у меня ячейка в таблице осталась пустая, т.к. значение переменной было нулевым, то передалось значение "" вместо 0,00!
    Это не есть хорошо, похоже прийдется использовать свою процедуру (которую уже выкладывал), она передает значение как Строка и ничего не теряется... =)

    Код:
    КЧ = Новый КвалификаторыЧисла(12,2);
    Массив = Новый Массив;
    Массив.Добавить(Тип("Число"));
    ОписаниеТиповКЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
    Массив.Очистить();
    // Создание таблицы значений 
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("Приход",ОписаниеТиповКЧ,"Приход");
    ЗапВып = МойЗапрос.Выполнить().Выбрать();
    Пока ЗапВып.Следующий() Цикл
    // добавим строку
    НовСтр=ТаблицаЗначений.Добавить();
    НовСтр.Приход=Формат(ЗапВып.Приход, "ЧЦ=12; ЧДЦ=2");
    КонецЦикла;
    
    
    ЗЫ - результат: НовСтр.Приход = ""; :angry:
    ЗЫ2 - или быть может есть какой-то другой выход?
  7. nomad_irk
    Online

    nomad_irk Гуру в 1С

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

    "ЧЦ=12; ЧДЦ=2; ЧН=0,00"

    или

    "ЧЦ=12; ЧДЦ=2; ЧРД =.; ЧН=0.00"
  8. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    Заработало, но мне пришлось ОписаниеТипов сделать тип "Строка", иначе получалось нулевое значение такое: "". Мне вот интересно, я ведь указал КвалификаторыЧисла(12,2);, почему не хочет нормально выводить ноль? В общем пока сохраняю в строке, грубой ошибки думаю нет... =)
  9. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    На будущее: на форматной строке, кликам правой кнопкой "Конструктор форматной строки..."
  10. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Вообще функция Формат переводит числовое значение в строковое, а когда вы его запихиваете в колонку, то оно обратно преобразуется в число. По умолчанию представление всех нулевых чисел пустая строка.
    Что Вы потом делаете с сформированной таблицей?
  11. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    Вывожу её:
    Код:
    ЭлементыФормы.КнигаПриходаРасхода.Значение = ТаблицаЗначений;
    ЭлементыФормы.КнигаПриходаРасхода.СоздатьКолонки(); 
    ЭлементыФормы.КнигаПриходаРасхода.Колонки[0].Ширина = 5;
    
  12. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Тогда достаточно задать формат вывода для колонки и не городить с преобразованием значения в ТЗ
    Код:
    ЭлементыФормы.КнигаПриходаРасхода.Колонки[0].Формат = "ЧЦ=12; ЧДЦ=2; ЧРД =.; ЧН=0.00";
    
  13. DrBlack
    Offline

    DrBlack Опытный в 1С

    Регистрация:
    8 янв 2010
    Сообщения:
    79
    Симпатии:
    1
    Баллы:
    29
    Я данные таблицы присваиваю программно, тем самым я не имею возможности кликать правой кнопкой мышки... =)
    Спасибо, код помог.
  14. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Правой кнопкой мыши на форматной строке в модуле.... :)

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