Почему при преобразовании числа в строку в 1С получаются лишние нули и как это исправить?

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

При разработке печатных форм, отчетов и обработок в платформе 1С часто возникает необходимость сформировать итоговую текстовую строку на основе нескольких числовых показателей. Однако при сцеплении таких значений разработчики иногда сталкиваются со странным поведением: вместо ожидаемой строки вида "1Н;2ОТ;" получается конструкция с множеством нулей, например "00001Н00000".

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

Анализ исходного кода и причина появления лишних нулей

Рассмотрим типовой фрагмент кода, в котором проявляется проблема:


ОТ = 0; К = 0; Б = 0; РВ = 0; Н = 0; ОЗ = 0; ДС = 0; ПК = 0; ДП = 0; ОЖ = 0; ОВ = 0;

Если КолКодОТ > 0 Тогда 
    ОТ = Строка(КолКодОТ) + "ОТ;"; 
КонецЕсли;

Если КолКодН > 0 Тогда 
    Н = Строка(КолКодН) + "Н;"; 
КонецЕсли;

Область.Параметры.День = Строка(ОТ) + Строка(К) + Строка(Б) + Строка(РВ) + Строка(Н) + Строка(ОЗ) + Строка(ДС) + Строка(ПК) + Строка(ДП) + Строка(ОЖ) + Строка(ОВ);

Проанализируем ситуацию и выясним, почему возник такой результат:

  1. Особенности динамической типизации: Вначале всем переменным явно присваивается значение 0 типа Число. Если условие (например, КолКодН > 0) выполняется, переменная Н меняет тип на Строка и получает значение "1Н;". Однако те переменные, для которых условия не выполнились, остаются с числовым значением 0.
  2. Поведение функции Строка(): Когда в финальной строке вызывается Строка(ОТ) или Строка(К) для невыполненных условий, функция преобразует числовой ноль 0 в строковый ноль "0".
  3. Сцепление строк: При сложении через оператор + все эти строковые нули объединяются с заполненными значениями. В результате строка вида "0" + "0" + "0" + "1Н;" + "0" + "0" превращается в цепочку нулей с одной текстовой вставкой.

Способ 1. Корректная инициализация переменных

Самый простой шаг для исправления логики — инициализировать переменные не нулями, а пустыми строками "".


ОТ = ""; К = ""; Б = ""; РВ = ""; Н = ""; ОЗ = ""; ДС = ""; ПК = ""; ДП = ""; ОЖ = ""; ОВ = "";

Если КолКодОТ > 0 Тогда 
    ОТ = Строка(КолКодОТ) + "ОТ;"; 
КонецЕсли;

Если КолКодН > 0 Тогда 
    Н = Строка(КолКодН) + "Н;"; 
КонецЕсли;

Область.Параметры.День = ОТ + К + Б + РВ + Н + ОЗ + ДС + ПК + ДП + ОЖ + ОВ;

В этом случае невыполненные условия оставят переменные пустыми строками, и при сцеплении они не добавят лишних символов.

Способ 2. Использование функции Формат()

Если требуется превратить число 0 в пустую строку непосредственно при преобразовании, можно использовать функцию Формат() с управляющим параметром ЧН= (представление нулевого значения):


// Параметр "ЧН=" указывает платформе выводить пустую строку вместо "0"
ТекстОТ = Формат(КолКодОТ, "ЧН=; ЧГ=0");

Параметр ЧГ=0 отключает группировку тысяч. Это критически важно, так как стандартная функция Строка() при значениях от 1000 и выше вставляет неразрывный пробел (например, "1 000"), что может нарушить формат формируемого текста.

Способ 3. Использование массива и функции СтрСоединить() (Рекомендуемый стандарт)

Множественное объявление отдельных переменных и их сложение через + — устаревший подход, который усложняет чтение кода и оставляет лишние разделители (например, точку с запятой в конце строки). Посмотрим, как решить эту задачу согласно современным стандартам платформы 1С.

Создадим объект Массив, будем добавлять в него сформированные подстроки только при выполнении условий, а затем объединим их с помощью СтрСоединить():


СписокКодов = Новый Массив;

Если КолКодОТ > 0 Тогда 
    СписокКодов.Добавить(Формат(КолКодОТ, "ЧГ=0") + "ОТ"); 
КонецЕсли;

Если КолКодН > 0 Тогда 
    СписокКодов.Добавить(Формат(КолКодН, "ЧГ=0") + "Н"); 
КонецЕсли;

Если КолКодБ > 0 Тогда 
    СписокКодов.Добавить(Формат(КолКодБ, "ЧГ=0") + "Б"); 
КонецЕсли;

// Объединяем элементы массива через разделитель "; "
Область.Параметры.День = СтрСоединить(СписокКодов, "; ");

Преимущества данного подхода:

  1. Разделитель помещается строго между элементами, поэтому в конце итоговой строки не будет лишнего символа ";".
  2. Исключены ошибки из-за неверной типизации начальных значений.
  3. Код работает быстрее, так как платформа не создает множества промежуточных строковых объектов в памяти.

Способ 4. Сокращение кода с помощью обхода коллекции

Если видов показателей много, избавимся от множества конструкций Если ... Тогда с помощью объекта Структура и цикла Для Каждого:


Показатели = Новый Структура;
Показатели.Вставить("ОТ", КолКодОТ);
Показатели.Вставить("К",  КолКодК);
Показатели.Вставить("Б",  КолКодБ);
Показатели.Вставить("РВ", КолКодРВ);
Показатели.Вставить("Н",  КолКодН);

СписокКодов = Новый Массив;

Для Каждого КлючИЗначение Из Показатели Цикл
    Если КлючИЗначение.Значение > 0 Тогда
        ТекстЭлемента = СтрШаблон("%1%2", Формат(КлючИЗначение.Значение, "ЧГ=0"), КлючИЗначение.Ключ);
        СписокКодов.Добавить(ТекстЭлемента);
    КонецЕсли;
КонецЦикла;

Область.Параметры.День = СтрСоединить(СписокКодов, "; ");

Использование функции СтрШаблон() совместно со СтрСоединить() делает код компактным, легко поддерживаемым и полностью защищенным от появления паразитных нулей.

← На главную