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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    База знаний 1С