Как исправить условие сравнения в процедуре СкидкаПоДокументуПриИзменении?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как исправить условие сравнения в процедуре СкидкаПоДокументуПриИзменении?

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

        Вот фрагмент кода

        «Процедура СкидкаПоДокументуПриИзменении(Элемент)
        Если СуммаСкидки >= ИтогВсего + Объект.СуммаСкидки Тогда
        ТекстСообщения = НСтр(«ru = ‘Сумма скидки превышает сумму по документу'»);

        ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,,»СуммаСкидки»);
        СуммаСкидки = Объект.СуммаСкидки;

        Возврат;
        КонецЕсли;

        Объект.СуммаСкидки = СуммаСкидки;
        РаспределитьСуммуСкидки(ЭтотОбъект);
        ОбновитьИтоги(ЭтотОбъект);
        КонецПроцедуры»

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

          В вашем фрагменте кода есть ошибка в условии:

          |Если СуммаСкидки >= ИтогВсего + Объект.СуммаСкидки Тогда

          Здесь сравнивается СуммаСкидки с суммой ИтогВсего + Объект.СуммаСкидки, что логически странно — вы сравниваете скидку с суммой итога плюс уже установленную скидку. Скорее всего, нужно сравнивать с ИтогВсего, а не с ИтогВсего + Объект.СуммаСкидки.

          Правильнее будет:

          |Если СуммаСкидки > ИтогВсего Тогда

          Или, если хотите учесть текущую скидку, то логика должна быть другой.

          Также в процедуре используются переменные СуммаСкидки и ИтогВсего, но в коде они не объявлены и не видно, откуда берутся. Скорее всего, это реквизиты формы или объекта.

          Если СуммаСкидки — это значение из элемента формы (например, Элемент.Значение), то нужно явно его получить.

          Пример исправленного варианта:

          |Процедура СкидкаПоДокументуПриИзменении(Элемент)
          | СуммаСкидки = Элемент.Значение;
          | ИтогВсего = Объект.ИтогВсего; // или другой реквизит с итогом
          |
          | Если СуммаСкидки > ИтогВсего Тогда
          | ТекстСообщения = НСтр(«ru = ‘Сумма скидки превышает сумму по документу'»);
          | ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения, , «СуммаСкидки»);
          | Элемент.Значение = Объект.СуммаСкидки; // возвращаем прежнее значение
          | Возврат;
          | КонецЕсли;
          |
          | Объект.СуммаСкидки = СуммаСкидки;
          | РаспределитьСуммуСкидки(Объект);
          | ОбновитьИтоги(Объект);
          |КонецПроцедуры

          Обратите внимание:

          — Используйте Элемент.Значение для получения текущего значения поля.

          — Передавайте в процедуры объект Объект, а не ЭтотОбъект (если не в модуле объекта).

          — Вызов ОбщегоНазначенияКлиент.СообщитьПользователю — второй параметр пустой, это нормально.

          — Если в вашем коде ИтогВсего — это сумма по документу, то сравнивайте с ней.

          Если ошибка «Неопознанный оператор &Ignore» связана с этим кодом, то скорее всего она в другом месте, а этот фрагмент — просто часть модуля.

          Проверьте весь модуль на наличие строки с «&Ignore» и удалите её.

          Если нужна помощь с поиском ошибки в модуле — можно выгрузить весь модуль или хотя бы 20-30 строк вокруг строки 621.

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