Как программно ограничить количество знаков после запятой в строке в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе со строковыми реквизитами в 1С часто возникает ситуация, когда в текстовую строку заносится результат математических вычислений. В результате числовое значение может иметь слишком длинную дробную часть (например, 0.02424125514...). Разберем, как оставить строго заданное количество знаков после запятой или точки, если реквизит имеет тип Строка.

Вариант 1. Использование строковых функций

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

Разберем по шагам алгоритм действия:

  1. Находим позицию разделителя (точки или запятой) в строке с помощью функции Найти() или СтрНайти().
  2. С помощью функции Лев() берем подстроку, включающую целую часть, разделитель и требуемое количество знаков после него (например, +5 символов).

Посмотрим на пример кода 1С:


// Находим позицию разделителя дробной части
ПозТочки = Найти(Реквизит, ".");
Если ПозТочки = 0 Тогда
    ПозТочки = Найти(Реквизит, ",");
КонецЕсли;

// Если разделитель найден, обрезаем строку до 5 знаков после него
Если ПозТочки > 0 Тогда
    Реквизит = Лев(Реквизит, ПозТочки + 5);
КонецЕсли;

Важное примечание: при таком подходе происходит простое усечение символов. Например, значение 0.123456 превратится в 0.12345, а не в 0.12346, так как математическое округление не применяется.

Вариант 2. Преобразование строки в число с форматированием

Проанализируем более надежный способ, который позволяет применить полноценное математическое округление. Функция Формат() не работает напрямую со строковым типом данных, поэтому строку необходимо сначала привести к числовому типу.

Выясним порядок действий:

  1. Заменяем возможные запятые на точку для стандартизации дробного разделителя через СтрЗаменить().
  2. Преобразуем полученную строку в тип Число.
  3. Применяем функцию Формат() с параметром ЧДЦ=5 (число дробных знаков) и отключаем разделители триад (параметр ЧГ=0).

Рассмотрим пример реализации:


// Приводим разделитель к единому стандарту
СтрокаЧисла = СтрЗаменить(Реквизит, ",", ".");

// Преобразуем в число
ЧисловоеЗначение = Число(СтрокаЧисла);

// Форматируем с точностью 5 знаков после запятой и преобразуем обратно в строку
Реквизит = Формат(ЧисловоеЗначение, "ЧГ=0; ЧДЦ=5; ЧРД=.");

Этот способ гарантирует, что число будет округлено по математическим правилам, а в дробной части останется ровно 5 знаков.

Рекомендации по проектированию структуры данных

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

Лучшим практическим решением в 1С является разделение данных:

  1. Создать числовой реквизит с точностью Число(15, 5) для хранения чистого количества. В этом случае платформа автоматически контролирует количество знаков и формат отображения.
  2. Создать отдельный реквизит для единицы измерения (тип СправочникСсылка.КлассификаторЕдиницИзмерения или Строка).
  3. На форме объединить эти два поля визуально или формировать итоговую строку исключительно при выводе на печать или в печатные формы.
← На главную