При работе со строковыми реквизитами в 1С часто возникает ситуация, когда в текстовую строку заносится результат математических вычислений. В результате числовое значение может иметь слишком длинную дробную часть (например, 0.02424125514...). Разберем, как оставить строго заданное количество знаков после запятой или точки, если реквизит имеет тип Строка.
Рассмотрим наибыстрейший способ решения задачи, когда необходимо просто усечь длинный хвост дробной части без математического округления. Для этого проанализируем позицию разделителя и обрезаем строку с помощью встроенных функций платформы.
Разберем по шагам алгоритм действия:
Найти() или СтрНайти().Лев() берем подстроку, включающую целую часть, разделитель и требуемое количество знаков после него (например, +5 символов).Посмотрим на пример кода 1С:
// Находим позицию разделителя дробной части
ПозТочки = Найти(Реквизит, ".");
Если ПозТочки = 0 Тогда
ПозТочки = Найти(Реквизит, ",");
КонецЕсли;
// Если разделитель найден, обрезаем строку до 5 знаков после него
Если ПозТочки > 0 Тогда
Реквизит = Лев(Реквизит, ПозТочки + 5);
КонецЕсли;
Важное примечание: при таком подходе происходит простое усечение символов. Например, значение 0.123456 превратится в 0.12345, а не в 0.12346, так как математическое округление не применяется.
Проанализируем более надежный способ, который позволяет применить полноценное математическое округление. Функция Формат() не работает напрямую со строковым типом данных, поэтому строку необходимо сначала привести к числовому типу.
Выясним порядок действий:
СтрЗаменить().Число.Формат() с параметром ЧДЦ=5 (число дробных знаков) и отключаем разделители триад (параметр ЧГ=0).Рассмотрим пример реализации:
// Приводим разделитель к единому стандарту
СтрокаЧисла = СтрЗаменить(Реквизит, ",", ".");
// Преобразуем в число
ЧисловоеЗначение = Число(СтрокаЧисла);
// Форматируем с точностью 5 знаков после запятой и преобразуем обратно в строку
Реквизит = Формат(ЧисловоеЗначение, "ЧГ=0; ЧДЦ=5; ЧРД=.");
Этот способ гарантирует, что число будет округлено по математическим правилам, а в дробной части останется ровно 5 знаков.
Если пользователь должен дописывать к числовому значению суффиксы или единицы измерения (например, кг, шт, кг/см), хранение всего значения в одном строковом реквизите часто приводит к ошибкам при расчетах и конвертации типов.
Лучшим практическим решением в 1С является разделение данных:
Число(15, 5) для хранения чистого количества. В этом случае платформа автоматически контролирует количество знаков и формат отображения.СправочникСсылка.КлассификаторЕдиницИзмерения или Строка).