Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 окт 2024, 19:07

Округление чисел

Автор ADRENALIN1986, 18 мая 2011, 01:28

0 Пользователей и 1 гость просматривают эту тему.

ADRENALIN1986

Проблема в округлении в счете то есть цену округляет правильно по математике до целых чисел, а вот когда считается сумма и сумма с ндс то стоимость товара считается с дробной частью то есть 247,56 а должно брать с округлением . пробовал везде в коде менять так и не нашел прилагаю код и снимок рассчета. ПОМОГИТЕ ПЛИЗ

На изображении сумма 47277 а должна быть 47255 так как 5*9455=47255, и сумма с ндс так считает не с округлением

Код имеется при невозможности вставки отдельным фалом  вставляю его сюда.((

ТекКолонка = ?(Подбор=0,Форма.ТекущаяКолонка(),"Товар");
   КонецЕсли;
   //Сообщить("Пересчет..."+Форма.ТекущаяКолонка()+"  "+ТекКолонка);
   Если (ТекКолонка = "Товар") тогда //или (Подбор = 1) Тогда                          Перем НачальнаяДатаДокумента,Новый;
Перем БухИтоги;
Перем КонтекстФормыПодбора;
Перем ЗнОкр,ВалютаНакладной,сФормат,сПропись,сФорматНДС;
Перем ПриИзмЦеныРеализацииПересчитыватьТолькоСкидку;
Перем Склад;
//___________________________________________________________________________

Процедура СоздатьЛистОплат()
   ФлагЛ = 0;
   Если Выбран() = 1 Тогда
      Док = СоздатьОбъект("Документ");
      Если Док.ВыбратьПодчиненныеДокументы(,,ТекущийДокумент()) = 1 Тогда
         Пока Док.ПолучитьДокумент() > 0 Цикл
            Если (Док.Вид() = "ЛистОплат") Тогда
               ОткрытьФормуМодально(Док.ТекущийДокумент(),Контекст,0);
               ФлагЛ = 1;
            КонецЕсли;
         КонецЦикла;
         Если ФлагЛ = 0 Тогда
            ОткрытьФормуМодально("Документ.ЛистОплат",Контекст,0);
         КонецЕсли;
      Иначе
         ОткрытьФормуМодально("Документ.ЛистОплат",Контекст,0);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

//_____________________________________________________________________________

Функция ИтоговаяСтрока()

   ПартияДост = 0;
   Если Товар.Вид()        = "Номенклатура" Тогда
      ПартияДост = 1;
   ИначеЕсли Товар.Вид()   = "Материалы"       Тогда
      ПартияДост = 1;
   Иначеесли   Товар.Вид() = "ОсновныеСредства"  Тогда
      ПартияДост = 0;
   Иначеесли   Товар.Вид() = "НематериальныеАктивы" Тогда
      ПартияДост = 0;
   КонецЕсли;

   д = Партия.Выбран();
   Форма.ПерваяЦена.Доступность(1-д);
   Форма.Партия.Доступность(ПартияДост);
   Форма.СостояниеСчета.Доступность(РучноеЗакрытие);

   ИтСтр = "Всего к оплате: " + СокрЛ(Формат(Итог("СуммаСНДС"),"Ч20.0-,")) + " "+ВалютаНакладной + ","+
   "в т.ч. НДС: " + СокрЛ(Формат(Итог("НДС"),"Ч20.0-,"));
   Возврат ИтСтр;

КонецФункции //ИтоговаяСтрока

// -----------------------------------------------------------------------------

Функция ДатыПоЧеловечески(ДД, ТолькоМесИГод = 0)
   Д= Формат(ДД ,"Д (0)ДДММММГГГГ");
   Д=Нрег(Прав(Д, СтрДлина(Д)-3));
   Ч=Формат(ДатаЧисло(ДД),"Ч(0)2");

   Если ТолькоМесИГод=0 Тогда
      Дпч="""" + Ч +""""+ "  " + Д;
   Иначе
        Дпч="""" + "       " +""""+ "  " + Д;
   КонецЕсли;
   Возврат Дпч;
КонецФункции

//_____________________________________________________________________________

Процедура ДобРекв(Стр,Рекв,Подск1,Подск2)

   Если ПустаяСтрока(Стр)=0 Тогда
      Подск=Подск1+Подск2;
   Иначе
      Подск=Подск2;
   КонецЕсли;
   Если ПустаяСтрока(Рекв)=0 Тогда
      Стр=Стр+Подск+СокрП(Рекв);
   КонецЕсли;

КонецПроцедуры

// -----------------------------------------------------------------------------

Процедура ПечатьДоговора(Парам = 1)
   стрр="";
   Лицо        = договор.ЛицоПокупателя;
   НаОсновании = договор.НаОсновании;
   ОплатаПроцент = договор.ОплатаПроцент;
   Пеня          = договор.Пеня;

   Пост0=СокрП(Константа.НазваниеОрганизации)+", "+СокрП(Константа.АдресОрганизации);
   Пост1="р/с "+СокрП(РасчетныйСчет.Номер)+" в " +сокрп(РасчетныйСчет.БанкОрганизации.Наименование)+", "
      +сокрп(РасчетныйСчет.БанкОрганизации.Город)+", код банка "+РасчетныйСчет.БанкОрганизации.Код
      +"; УНП "+СокрП(Константа.УННОрганизации);
   Покуп0="";
   Покуп1="";
   Покупатель="";
   Если плательщик.Выбран()=1 Тогда
     Покуп0=СокрП(глПолноеНаименование(Плательщик))+", "+СокрП(Плательщик.ПочтовыйАдрес);
     Покупатель=СокрП(глПолноеНаименование(Плательщик));
     ДобРекв(Покуп1,КонтрРасчетныйСЧет.Номер," ","р/с ");
     ДобРекв(Покуп1,КонтрРасчетныйСчет.БанкОрганизации.Наименование," ","в ");
     ДобРекв(Покуп1,КонтрРасчетныйСчет.БанкОрганизации.Код," ",", код банка ");
     ДобРекв(Покуп1,Плательщик.УНН," ","; УНП ");
КонецЕсли;                

СтрПервыйПроизводитель= " цена сформирована первым импортером РБ "+СокрЛП(Константа.НазваниеОрганизации);


   сФормат  = "Ч010.0, ";
   Спропись = "ЧП";

   СрокПлатежа   = СокрЛП(Формат(договор.СрокПлатежаДней,сФормат)+" (" + Формат(договор.СрокПлатежаДней,Спропись)+")");
   СрокПоставки  = СокрЛП(Формат(договор.ПостСрок,сФормат)+" (" + Формат(договор.ПостСрок,спропись)+")");

   юВалНакладной(Договор,ВалютаНакладной,сФормат,Спропись,ЗнОкр);


   Таб=СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Договор");
   Если КонтролироватьФорматЦены=0 Тогда
      сФорматЦены = сФормат;
   КонецЕсли;

   // Спецификация
   ДатаДогМ = ДатыПоЧеловечески(ДатаДок, 1);
   ДатаДог  = ДатыПоЧеловечески(ДатаДок);

   Таб.ВывестиСекцию("Шапка");
   ВыбратьСтроки();
   Ном=1;
   Есть1="";
   Пока ПолучитьСтроку()=1 Цикл
      ВидТовара = Товар.Вид();
      ТМЦ = глПолноеНаименование(Товар)
      +?(ПустоеЗначение(Товар.СтранаПроисхождения.Наименование)=1,"",", "+СокрЛП(Товар.СтранаПроисхождения.Наименование))
      +?(ПустоеЗначение(Товар.Артикул)=1,"",". Артикул "+СокрЛП(Товар.Артикул)+" ");
      //ТМЦ =глПолноеНаименование(Товар)+?(Товар.ФлПервыйИмпортер = 1,СокрЛП(СтрПервыйПроизводитель),"");
      Если (ВидТовара = "Номенклатура") или (ВидТовара = "Материалы") Тогда
         ЕдИзм = СокрЛП(Товар.ЕдиницаИзмерения);
         Артикул = СокрЛП(Товар.Артикул);
      Иначе
         ЕдИзм = "";
         Артикул = СокрЛП(Товар.Код); //"";
      КонецЕсли;
      Если (ВидТовара = "Номенклатура") Тогда
          ТМЦ = глПолноеНаименование(Товар)
      +?(ПустоеЗначение(Товар.СтранаПроисхождения.Наименование)=1,"",", "+СокрЛП(Товар.СтранаПроисхождения.Наименование))
      +?(ПустоеЗначение(Товар.Артикул)=1,"",". Артикул "+СокрЛП(Товар.Артикул)+" ");
         //   ТМЦ =глПолноеНаименование(Товар)+?(Товар.ФлПервыйИмпортер = 1,СокрЛП(СтрПервыйПроизводитель),"");
         Если Товар.ТипНоменклатуры=Перечисление.ТипыНоменклатуры.Товар Тогда
            Если ПерваяЦена=0 тогда
               Процент=ОптНадбавка;
               Цена1=?(100+Процент=0,Цена,Цена/(1+Процент*0.01));
                  //Цена1=?(100+Процент=0,Цена,Окр(Цена/(1+Процент*0.01),ЗнОкр));
            Иначе
               Процент=ОптНадбавка;
               Цена1=ПерваяЦена;
            КонецЕсли;
         Иначе
            Процент="-";
            Цена1=Цена;
         КонецЕсли;
      Иначе
         Процент=ОптНадбавка;
         Цена1=?(100+Процент=0,Цена,Цена/(1+Процент*0.01));
         //Цена1=?(100+Процент=0,Цена,Окр(Цена/(1+Процент*0.01),ЗнОкр));
      КонецЕсли;
      СтрСтавкаНДС = юСтрокаСтавкаНДС(СтавкаНДСспр);
      Если (КонтролироватьФорматЦены=1) Тогда
         Если (ЗнОкр=0) И (Окр(Окр(Цена1,0)*Количество*(100+ОптНадбавка)/100,ЗнОкр)<>Сумма)// И (ПриИзмЦеныРеализацииПересчитыватьТолькоСкидку=0)
         Тогда
             сФорматЦены = "Ч019.2"
         Иначе
            сФорматЦены = сФормат;
         КонецЕсли;
      КонецЕсли;
      Таб.ВывестиСекцию("Строка");
      Ном=Ном+1;
   КонецЦикла;
   ИтогоНДС  = СокрЛП(Формат(Итог("НДС"),сФормат)+" (" + Формат(Итог("НДС"),спропись)+")");
   ИтогоСНДС = СокрЛП(Формат(Итог("СуммаСНДС"),сФормат)+" (" + Формат(Итог("СуммаСНДС"),спропись)+")");
   Таб.ВывестиСекцию("Подвал");

   Если Парам=1 Тогда  // договор
      Таб.НоваяСтраница();
      Таб.ВывестиСекцию("Договор");
   КонецЕсли;

   Таб.Опции(0,0,0,0,"ОпцииПечатиСчета");
   Таб.ПараметрыСтраницы(1,,,,3);
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Печать " +  ?(Парам=1,"договора","спецификации"));
КонецПроцедуры

//__________________________________________________________________________________________

Процедура Пересчет(Подбор=0)
   
   Перем ВидТовара,ЭтоТовар;
   
   Если Товар.Выбран() = 0 Тогда
      Возврат;
   Иначе
      ВидТовара = Товар.Вид();
      Если ВидТовара = "Номенклатура" Тогда
         ЭтоТовар =?((Товар.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Товар),1,0); // 0 - продукция 1 - товар
      ИначеЕсли ВидТовара = "Материалы" Тогда
         ЭтоТовар = 2; // материалы
      Иначе
         ЭтоТовар = 3; // ос или нма
      КонецЕсли;
   КонецЕсли;
   Если (Договор.Выбран()=1) Тогда
      ЗнОкр=?(Договор.Валютный=1,2,0);
   Иначе
      ЗнОкр=0;
   КонецЕсли;

   Если Партия.Выбран() = 1 Тогда
      ТекКолонка = ?(Подбор=0,Форма.ТекущаяКолонка(),"Партия");
   Иначе

      Если ВидТовара = "Номенклатура" Тогда
         Если Товар.СтавкаНДС.Выбран() = 1 Тогда
            СтавкаНДСспр = Товар.СтавкаНДС; //.Ставка;
         Иначе
            СтавкаНДСспр = Константа.ОсновнаяСтавкаНДС; //.Ставка;
         КонецЕсли;
         Если СтавкаНДС<>СтавкаНДСспр.Ставка Тогда
            СтавкаНДС = СтавкаНДСспр.Ставка;
         КонецЕсли;
         

         ПерваяЦена = Товар.ПервыйИмпортер; // в рублях (основной валюте)
         Если (Договор.Валюта.Выбран()=1) и (Договор.Валюта<>Константа.ОсновнаяВалюта) И (ПерваяЦена<>0) тогда
            // в спр. номенклатура 1-я цена в основной валюте, пересчитываем в валюту накладной
            Попытка
               ПерваяЦена=ПересчетВалюты(ПерваяЦена,Договор.Валюта,Константа.ОсновнаяВалюта,ДатаДок,
                        Константа.НеПересчитыватьЦенуНоменклатуры);
            Исключение
               ПерваяЦена=ПересчетВалюты(ПерваяЦена,Договор.Валюта,Константа.ОсновнаяВалюта,ДатаДок);
            КонецПопытки;
         КонецЕсли;
         УчетнаяЦена=Товар.Себестоимость;
         ВалютаСравнения = Константа.ОсновнаяВалюта;
         Если (ЭтоТовар = 1) И
              (Товар.Валюта.Выбран()=1) и (Товар.Валюта<>ВалютаСравнения)
               Тогда
            // уч. цена должна быть в основной валюте (может использоваться при проведении)
            УчетнаяЦена = ПересчетВалюты(УчетнаяЦена,ВалютаСравнения,Товар.Валюта,ДатаДок);
         КонецЕсли;
         Цена=Товар.Цена;
         Если (Договор.валюта.Выбран()=1) и (Договор.Валюта<>ВалютаСравнения) тогда
            // в спр. номенклатура отпускная цена в основной валюте, пересчитываем в валюту накладной
            Попытка
               Цена=ПересчетВалюты(Цена,Договор.Валюта,ВалютаСравнения,ДатаДок,
                        Константа.НеПересчитыватьЦенуНоменклатуры);
            Исключение
               Цена=ПересчетВалюты(Цена,Договор.Валюта,ВалютаСравнения,ДатаДок);
            КонецПопытки;
         КонецЕсли;
         ОптНадбавка = 0;
         Если (ЭтоТовар>=1) И (Цена=0) И (ПерваяЦена<>0) Тогда
            ОптНадбавка=Товар.Процент;
            Если (ПриИзмЦеныРеализацииПересчитыватьТолькоСкидку=0) Тогда
               Цена=Окр(ПерваяЦена*(100+ОптНадбавка)/100,0,2);
            КонецЕсли;
         КонецЕсли;
      ИначеЕсли (ВидТовара = "Материалы") Тогда
         Цена = Товар.Цена;
         ПерваяЦена = Товар.Цена;
         СтавкаНДСспр = Константа.ОсновнаяСтавкаНДС;
         СтавкаНДС = СтавкаНДСспр.Ставка;
      КонецЕсли;
      Количество=?(Количество=0,1,Количество);
      юРассчитатьСуммы(Контекст,?(ПриИзмЦеныРеализацииПересчитыватьТолькоСкидку=1,0,ЭтоТовар),,ЗнОкр);

   ИначеЕсли (ТекКолонка = "Партия") тогда //или (Подбор = 1) Тогда

      Если ВидТовара = "Номенклатура" Тогда
         Если Товар.СтавкаНДС.Выбран() = 1 Тогда
            СтавкаНДСспр = Товар.СтавкаНДС; //.Ставка;
         Иначе
            СтавкаНДСспр = Константа.ОсновнаяСтавкаНДС; //.Ставка;
         КонецЕсли;
         Если СтавкаНДС<>СтавкаНДСспр.Ставка Тогда
            СтавкаНДС = СтавкаНДСспр.Ставка;
         КонецЕсли;

         ПерваяЦена = Партия.ЦенаПост;
         Если (Договор.Валюта.Выбран()=1) и (Договор.Валюта<>Константа.ОсновнаяВалюта) И (ПерваяЦена<>0) тогда
            // в спр. номенклатура 1-я цена в основной валюте, пересчитываем в валюту накладной
            Попытка
               ПерваяЦена=ПересчетВалюты(ПерваяЦена,Договор.Валюта,Константа.ОсновнаяВалюта,ДатаДок,
                        Константа.НеПересчитыватьЦенуНоменклатуры);
            Исключение
               ПерваяЦена=ПересчетВалюты(ПерваяЦена,Договор.Валюта,Константа.ОсновнаяВалюта,ДатаДок);
            КонецПопытки;
         КонецЕсли;

         УчетнаяЦена = Партия.УчЦена;
         ВалютаСравнения = Константа.ОсновнаяВалюта;
         Если (ЭтоТовар = 1) И
              (Товар.Валюта.Выбран()=1) и (Товар.Валюта<>ВалютаСравнения)
               Тогда
            // уч. цена должна быть в основной валюте (может использоваться при проведении)
            УчетнаяЦена = ПересчетВалюты(УчетнаяЦена,ВалютаСравнения,Товар.Валюта,ДатаДок);
         КонецЕсли;
         //Цена  = Окр((100+Партия.Наценка)/100*Партия.ЦенаПост,ЗнОкр);
         Цена = Товар.Цена;
         Если (Договор.валюта.Выбран()=1) и (Договор.Валюта<>ВалютаСравнения) тогда
            // в спр. номенклатура отпускная цена в основной валюте, пересчитываем в валюту накладной
            Попытка
               Цена=ПересчетВалюты(Цена,Договор.Валюта,ВалютаСравнения,ДатаДок,
                        Константа.НеПересчитыватьЦенуНоменклатуры);
            Исключение
               Цена=ПересчетВалюты(Цена,Договор.Валюта,ВалютаСравнения,ДатаДок);
            КонецПопытки;
         КонецЕсли;
         ОптНадбавка = 0;

         Если (ЭтоТовар=1) И (ПерваяЦена<>0) Тогда
            ОптНадбавка=Товар.Процент;
            Если (ПриИзмЦеныРеализацииПересчитыватьТолькоСкидку = 0) Тогда // 5.09.1
               Цена = Окр(ПерваяЦена*(100+ОптНадбавка)/100,0,2);
            КонецЕсли;
         КонецЕсли;

         Если (ЭтоТовар=1) И (Цена <> 0) И (ПерваяЦена<>0) Тогда
            Сумма = Окр(Количество*ПерваяЦена*(100+ОптНадбавка)/100,ЗнОкр);
         Иначе //Если ЭтоТовар=0 тогда
            Сумма = Окр(Количество*Цена,ЗнОкр); // было только так до 01 июн 05
         КонецЕсли;
         НДС       = Окр(Сумма*СтавкаНДС/100,ЗнОкр);
         СуммаСНДС = Окр(Сумма + НДС,ЗнОкр);



      ИначеЕсли (ВидТовара = "Материалы") Тогда
         //Цена = Товар.Цена;
         //ПерваяЦена = Товар.Цена;
         //СтавкаНДСспр = Константа.ОсновнаяСтавкаНДС;
         //СтавкаНДС = СтавкаНДСспр.Ставка;
         Цена         = Товар.Цена;
         ПерваяЦена   = Партия.ЦенаПост;
         СтавкаНДСспр = Константа.ОсновнаяСтавкаНДС;
         СтавкаНДС    = СтавкаНДСспр.Ставка;
      КонецЕсли;
      Количество=?(Количество=0,1,Количество);
      юРассчитатьСуммы(Контекст,?(ПриИзмЦеныРеализацииПересчитыватьТолькоСкидку=1,0,ЭтоТовар),,ЗнОкр);

   Иначе  //  текущая колонка - не товар
      Если СтавкаНДСспр.Выбран()=0 Тогда
         СтавкаНДСспр = юПолучитьНДСпоСумме(НДС,Сумма);
      КонецЕсли;
      Если СтавкаНДС<>СтавкаНДСспр.Ставка Тогда
         СтавкаНДС = СтавкаНДСспр.Ставка;
      КонецЕсли;
      Если (ТекКолонка = "Количество") Тогда
         юРассчитатьСуммы(Контекст,ЭтоТовар,,ЗнОкр);

      ИначеЕсли (ТекКолонка = "ЦенаНДС") И (ЦенаНДС<>0) Тогда
         СуммаСНДС = Окр(Количество*ЦенаНДС,ЗнОкр);
         НДС = Окр(СуммаСНДС*СтавкаНДС/(100+СтавкаНДС),ЗнОкр);
         Сумма = СуммаСНДС-НДС;
         Цена = ?(Количество = 0,0,Окр(Сумма/Количество,0,2));
         ОптНадбавка = ?((ПерваяЦена=0),0,((Цена-ПерваяЦена)/ПерваяЦена)*100);

      ИначеЕсли (ТекКолонка = "Цена") Тогда
         Если (ПерваяЦена<>0)  И (ЭтоТовар>0) Тогда
            РазмерОптНадбавки=(Цена-ПерваяЦена)/ПерваяЦена*100;
            Если Окр(РазмерОптНадбавки,2) <> ОптНадбавка Тогда  // точность ОптНадбавки бы знать
                ОптНадбавка = РазмерОптНадбавки;
            КонецЕсли;
         КонецЕСли;
         юРассчитатьСуммы(Контекст,?(ПриИзмЦеныРеализацииПересчитыватьТолькоСкидку=1,0,ЭтоТовар),,ЗнОкр);

      ИначеЕсли (ТекКолонка = "Сумма") или (ТекКолонка = "СтавкаНДСспр") Тогда

         НДС = Окр(Сумма*СтавкаНДС/100,ЗнОкр);
         СуммаСНДС = Окр(Сумма + НДС,0,0);

      ИначеЕсли ТекКолонка = "НДС" Тогда
         СуммаСНДС = Окр(Сумма + НДС,ЗнОкр);

      ИначеЕсли (ТекКолонка = "ПерваяЦена") Тогда
         РазмерОптНадбавки=?((ПерваяЦена=0),0,((Цена-ПерваяЦена)/ПерваяЦена)*100);
         Если ЦенаНДС <> 0 Тогда
             ОптНадбавка = РазмерОптНадбавки;
         ИначеЕсли Окр(РазмерОптНадбавки,2) <> ОптНадбавка Тогда  // как бы узнать точность поля оптНадбавка
             ОптНадбавка = РазмерОптНадбавки;
             юРассчитатьСуммы(Контекст,ЭтоТовар,,ЗнОкр);
         КонецЕсли;
      ИначеЕсли ТекКолонка = "ОптНадбавка" Тогда
         Если ПерваяЦена<>0 Тогда
            Цена=Окр(ПерваяЦена*(100+ОптНадбавка)/100,0,0);
         ИначеЕсли (ЭтоТовар>0) И (100+ОптНадбавка<>0) тогда
         ПерваяЦена = Окр(Цена*100/(100+ОптНадбавка),ЗнОкр);
         КонецЕсли;
         юРассчитатьСуммы(Контекст,ЭтоТовар,,ЗнОкр);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры



Теги:

Похожие темы (4)

Рейтинг@Mail.ru

Поиск