При разработке печатных форм, отчетов и обработок в платформе 1С часто возникает необходимость сформировать итоговую текстовую строку на основе нескольких числовых показателей. Однако при сцеплении таких значений разработчики иногда сталкиваются со странным поведением: вместо ожидаемой строки вида "1Н;2ОТ;" получается конструкция с множеством нулей, например "00001Н00000".
В этой статье мы подробно разберем причины возникновения этой ошибки, рассмотрим правильное применение функций форматирования и изучим наиболее эффективные стандарты разработки в 1С для работы со строками.
Рассмотрим типовой фрагмент кода, в котором проявляется проблема:
ОТ = 0; К = 0; Б = 0; РВ = 0; Н = 0; ОЗ = 0; ДС = 0; ПК = 0; ДП = 0; ОЖ = 0; ОВ = 0;
Если КолКодОТ > 0 Тогда
ОТ = Строка(КолКодОТ) + "ОТ;";
КонецЕсли;
Если КолКодН > 0 Тогда
Н = Строка(КолКодН) + "Н;";
КонецЕсли;
Область.Параметры.День = Строка(ОТ) + Строка(К) + Строка(Б) + Строка(РВ) + Строка(Н) + Строка(ОЗ) + Строка(ДС) + Строка(ПК) + Строка(ДП) + Строка(ОЖ) + Строка(ОВ);
Проанализируем ситуацию и выясним, почему возник такой результат:
0 типа Число. Если условие (например, КолКодН > 0) выполняется, переменная Н меняет тип на Строка и получает значение "1Н;". Однако те переменные, для которых условия не выполнились, остаются с числовым значением 0.Строка(): Когда в финальной строке вызывается Строка(ОТ) или Строка(К) для невыполненных условий, функция преобразует числовой ноль 0 в строковый ноль "0".+ все эти строковые нули объединяются с заполненными значениями. В результате строка вида "0" + "0" + "0" + "1Н;" + "0" + "0" превращается в цепочку нулей с одной текстовой вставкой.Самый простой шаг для исправления логики — инициализировать переменные не нулями, а пустыми строками "".
ОТ = ""; К = ""; Б = ""; РВ = ""; Н = ""; ОЗ = ""; ДС = ""; ПК = ""; ДП = ""; ОЖ = ""; ОВ = "";
Если КолКодОТ > 0 Тогда
ОТ = Строка(КолКодОТ) + "ОТ;";
КонецЕсли;
Если КолКодН > 0 Тогда
Н = Строка(КолКодН) + "Н;";
КонецЕсли;
Область.Параметры.День = ОТ + К + Б + РВ + Н + ОЗ + ДС + ПК + ДП + ОЖ + ОВ;
В этом случае невыполненные условия оставят переменные пустыми строками, и при сцеплении они не добавят лишних символов.
Формат()Если требуется превратить число 0 в пустую строку непосредственно при преобразовании, можно использовать функцию Формат() с управляющим параметром ЧН= (представление нулевого значения):
// Параметр "ЧН=" указывает платформе выводить пустую строку вместо "0"
ТекстОТ = Формат(КолКодОТ, "ЧН=; ЧГ=0");
Параметр ЧГ=0 отключает группировку тысяч. Это критически важно, так как стандартная функция Строка() при значениях от 1000 и выше вставляет неразрывный пробел (например, "1 000"), что может нарушить формат формируемого текста.
СтрСоединить() (Рекомендуемый стандарт)Множественное объявление отдельных переменных и их сложение через + — устаревший подход, который усложняет чтение кода и оставляет лишние разделители (например, точку с запятой в конце строки). Посмотрим, как решить эту задачу согласно современным стандартам платформы 1С.
Создадим объект Массив, будем добавлять в него сформированные подстроки только при выполнении условий, а затем объединим их с помощью СтрСоединить():
СписокКодов = Новый Массив;
Если КолКодОТ > 0 Тогда
СписокКодов.Добавить(Формат(КолКодОТ, "ЧГ=0") + "ОТ");
КонецЕсли;
Если КолКодН > 0 Тогда
СписокКодов.Добавить(Формат(КолКодН, "ЧГ=0") + "Н");
КонецЕсли;
Если КолКодБ > 0 Тогда
СписокКодов.Добавить(Формат(КолКодБ, "ЧГ=0") + "Б");
КонецЕсли;
// Объединяем элементы массива через разделитель "; "
Область.Параметры.День = СтрСоединить(СписокКодов, "; ");
Преимущества данного подхода:
";".Если видов показателей много, избавимся от множества конструкций Если ... Тогда с помощью объекта Структура и цикла Для Каждого:
Показатели = Новый Структура;
Показатели.Вставить("ОТ", КолКодОТ);
Показатели.Вставить("К", КолКодК);
Показатели.Вставить("Б", КолКодБ);
Показатели.Вставить("РВ", КолКодРВ);
Показатели.Вставить("Н", КолКодН);
СписокКодов = Новый Массив;
Для Каждого КлючИЗначение Из Показатели Цикл
Если КлючИЗначение.Значение > 0 Тогда
ТекстЭлемента = СтрШаблон("%1%2", Формат(КлючИЗначение.Значение, "ЧГ=0"), КлючИЗначение.Ключ);
СписокКодов.Добавить(ТекстЭлемента);
КонецЕсли;
КонецЦикла;
Область.Параметры.День = СтрСоединить(СписокКодов, "; ");
Использование функции СтрШаблон() совместно со СтрСоединить() делает код компактным, легко поддерживаемым и полностью защищенным от появления паразитных нулей.