В чём причина ошибок в коде расчёта процента наценки?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию В чём причина ошибок в коде расчёта процента наценки?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #36498
      Фото аватараOdineski
      Участник

        что не так в коде?

        &НаКлиенте
        Функция РассчитатьПроцентНаценки(ЦенаЗакупки, ЦенаПродажи)
        ПроцентНаценки = 0;
        Если ЦенаЗакупки <> 0 Тогда
        ПроцентНаценки = (ЦенаПродажи — ЦенаЗакупки) * 100 / ЦенаЗакупки;
        КонецЕсли;
        Возврат ПроцентНаценки;
        КонецФункции

        &НаКлиенте
        Процедура ПоследняяЦенаЗакупкиПриИзменении(Элемент)

        Объект.ПроцентНаценки = РассчитатьПроцентНаценки(Объект.ПоследняяЦенаЗакупки,
        Объект.ЦенаПродажи);

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

        &НаКлиенте
        Процедура ЦенаПродажиПриИзменении(Элемент)

        Объект.ПроцентНаценки = РассчитатьПроцентНаценки(Объект.ПоследняяЦенаЗакупки,
        Объект.ЦенаПродажи);

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

      • #36499
        bot_avaOdin — Одинэсник
        Участник

          В коде с точки зрения синтаксиса 1С ошибок нет, логика тоже простая и правильная — рассчитывается процент наценки по формуле:

          |ПроцентНаценки = (ЦенаПродажи — ЦенаЗакупки) * 100 / ЦенаЗакупки;

          Однако есть несколько моментов, которые могут привести к проблемам или неожиданному поведению:

          1. Обращение к Объекту в процедурах изменения
          В процедурах ПоследняяЦенаЗакупкиПриИзменении и ЦенаПродажиПриИзменении вы используете Объект.ПроцентНаценки и другие поля.
          Убедитесь, что эти процедуры находятся в модуле формы или объекта, где Объект действительно доступен и содержит нужные реквизиты. Если это модуль формы, то Объект — это ссылка на текущий объект документа или справочника. Если процедуры в модуле объекта, то Объект не нужен, можно обращаться напрямую к реквизитам.
          Если процедуры в модуле формы, то всё нормально.

          2. Обработка нулевых и пустых значений
          В функции РассчитатьПроцентНаценки проверяется только ЦенаЗакупки <> 0. Но если ЦенаЗакупки или ЦенаПродажи равны Неопределено или ПустаяСтрока, то будет ошибка при вычислении.
          Рекомендую добавить проверку на тип и наличие значений, например:

          |Если ЗначениеЗаполнено(ЦенаЗакупки) И ЗначениеЗаполнено(ЦенаПродажи) И ЦенаЗакупки <> 0 Тогда
          | ПроцентНаценки = (ЦенаПродажи — ЦенаЗакупки) * 100 / ЦенаЗакупки;
          |Иначе
          | ПроцентНаценки = 0;
          |КонецЕсли;

          3. Обновление поля ПроцентНаценки
          Если поле ПроцентНаценки связано с формой, то после изменения его значения желательно вызвать Обновить() формы или соответствующего элемента, чтобы обновить отображение.

          4. Типы данных
          Убедитесь, что ЦенаЗакупки и ЦенаПродажи — числовые значения (например, число с плавающей точкой или число). Если они приходят из формы как строки, нужно преобразовать через Число().

          5. Обработка отрицательных значений
          Если ЦенаЗакупки или ЦенаПродажи могут быть отрицательными, то формула может дать неожиданный результат. Проверьте бизнес-логику.

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

          Пример улучшенной функции с проверками:

          |&НаКлиенте
          |Функция РассчитатьПроцентНаценки(ЦенаЗакупки, ЦенаПродажи)
          | ПроцентНаценки = 0;
          | Если ЗначениеЗаполнено(ЦенаЗакупки) И ЗначениеЗаполнено(ЦенаПродажи) И ЦенаЗакупки <> 0 Тогда
          | ПроцентНаценки = (ЦенаПродажи — ЦенаЗакупки) * 100 / ЦенаЗакупки;
          | КонецЕсли;
          | Возврат ПроцентНаценки;
          |КонецФункции

          Если хотите, чтобы при изменении цены сразу обновлялось поле на форме, убедитесь, что процедуры изменения привязаны к событиям изменения соответствующих реквизитов.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С