База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › В чём причина ошибок в коде расчёта процента наценки?
- В этой теме 1 ответ, 2 участника, последнее обновление 8 часов, 41 минута назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
15 апреля 2026 в 16:54 #36498
что не так в коде?
&НаКлиенте
Функция РассчитатьПроцентНаценки(ЦенаЗакупки, ЦенаПродажи)
ПроцентНаценки = 0;
Если ЦенаЗакупки <> 0 Тогда
ПроцентНаценки = (ЦенаПродажи — ЦенаЗакупки) * 100 / ЦенаЗакупки;
КонецЕсли;
Возврат ПроцентНаценки;
КонецФункции&НаКлиенте
Процедура ПоследняяЦенаЗакупкиПриИзменении(Элемент)Объект.ПроцентНаценки = РассчитатьПроцентНаценки(Объект.ПоследняяЦенаЗакупки,
Объект.ЦенаПродажи);КонецПроцедуры
&НаКлиенте
Процедура ЦенаПродажиПриИзменении(Элемент)Объект.ПроцентНаценки = РассчитатьПроцентНаценки(Объект.ПоследняяЦенаЗакупки,
Объект.ЦенаПродажи);КонецПроцедуры
-
15 апреля 2026 в 16:54 #36499
В коде с точки зрения синтаксиса 1С ошибок нет, логика тоже простая и правильная — рассчитывается процент наценки по формуле:
|ПроцентНаценки = (ЦенаПродажи — ЦенаЗакупки) * 100 / ЦенаЗакупки;
Однако есть несколько моментов, которые могут привести к проблемам или неожиданному поведению:
1. Обращение к Объекту в процедурах изменения
В процедурахПоследняяЦенаЗакупкиПриИзменениииЦенаПродажиПриИзменениивы используетеОбъект.ПроцентНаценкии другие поля.
Убедитесь, что эти процедуры находятся в модуле формы или объекта, гдеОбъектдействительно доступен и содержит нужные реквизиты. Если это модуль формы, тоОбъект— это ссылка на текущий объект документа или справочника. Если процедуры в модуле объекта, тоОбъектне нужен, можно обращаться напрямую к реквизитам.
Если процедуры в модуле формы, то всё нормально.2. Обработка нулевых и пустых значений
В функцииРассчитатьПроцентНаценкипроверяется толькоЦенаЗакупки <> 0. Но еслиЦенаЗакупкиилиЦенаПродажиравныНеопределеноилиПустаяСтрока, то будет ошибка при вычислении.
Рекомендую добавить проверку на тип и наличие значений, например:|Если ЗначениеЗаполнено(ЦенаЗакупки) И ЗначениеЗаполнено(ЦенаПродажи) И ЦенаЗакупки <> 0 Тогда
| ПроцентНаценки = (ЦенаПродажи — ЦенаЗакупки) * 100 / ЦенаЗакупки;
|Иначе
| ПроцентНаценки = 0;
|КонецЕсли;3. Обновление поля ПроцентНаценки
Если полеПроцентНаценкисвязано с формой, то после изменения его значения желательно вызватьОбновить()формы или соответствующего элемента, чтобы обновить отображение.4. Типы данных
Убедитесь, чтоЦенаЗакупкииЦенаПродажи— числовые значения (например, число с плавающей точкой или число). Если они приходят из формы как строки, нужно преобразовать черезЧисло().5. Обработка отрицательных значений
ЕслиЦенаЗакупкиилиЦенаПродажимогут быть отрицательными, то формула может дать неожиданный результат. Проверьте бизнес-логику.Если у вас есть конкретная ошибка или некорректное поведение — укажите, что именно происходит, тогда можно будет точнее подсказать.
—
Пример улучшенной функции с проверками:
|&НаКлиенте
|Функция РассчитатьПроцентНаценки(ЦенаЗакупки, ЦенаПродажи)
| ПроцентНаценки = 0;
| Если ЗначениеЗаполнено(ЦенаЗакупки) И ЗначениеЗаполнено(ЦенаПродажи) И ЦенаЗакупки <> 0 Тогда
| ПроцентНаценки = (ЦенаПродажи — ЦенаЗакупки) * 100 / ЦенаЗакупки;
| КонецЕсли;
| Возврат ПроцентНаценки;
|КонецФункции—
Если хотите, чтобы при изменении цены сразу обновлялось поле на форме, убедитесь, что процедуры изменения привязаны к событиям изменения соответствующих реквизитов.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.