При разработке в 1С часто возникает задача инкрементировать числовой код, артикул или порядковый номер, хранящийся в строковом виде с фиксированной длиной и лидирующими нулями (например, превратить "018446483" в "018446484"). Простое приведение к числу и последующее преобразование в строку методом Строка() приводит к потере ведущих нулей. Разберем по шагам наиболее эффективные и надежные способы решения этой задачи.
Рассмотрим классический и наиболее лаконичный способ на платформе 1С: преобразование строки в число, выполнение арифметической операции и обратное форматирование с помощью функции Формат().
Для корректного вывода лидирующих нулей в форматной строке используются следующие параметры:
ЧГ=0 отключает группировку триад цифр пробелами (неразрывными пробелами).Посмотрим на пример кода с фиксированной разрядностью (9 знаков):
ИсходнаяСтрока = "018446483";
ЧисловоеЗначение = Число(ИсходнаяСтрока) + 1;
Результат = Формат(ЧисловоеЗначение, "ЧЦ=9; ЧВН=; ЧГ=0");
// В переменной Результат получим "018446484"
Если длина исходной строки может меняться динамически, разберем более универсальный вариант без жесткой привязки к числу 9. Соберем форматную строку программно:
ИсходнаяСтрока = "018446483";
ДлинаСтроки = СтрДлина(ИсходнаяСтрока);
НовоеЧисло = Число(ИсходнаяСтрока) + 1;
ФорматнаяСтрока = "ЧЦ=" + ДлинаСтроки + "; ЧВН=; ЧГ=0";
Результат = Формат(НовоеЧисло, ФорматнаяСтрока);
Проанализируем альтернативный вариант, не требующий сложной настройки форматной строки. Данный метод основан на предварительном добавлении цепочки нулей слева и последующем получении нужного количества символов справа с помощью функции Прав().
ИсходнаяСтрока = "018446483";
ДлинаСтроки = СтрДлина(ИсходнаяСтрока);
НовоеЧисло = Число(ИсходнаяСтрока) + 1;
// Форматируем число без группировки разрядов
СтрокаБезРазделителей = Формат(НовоеЧисло, "ЧГ=0");
// Добавляем запас нулей слева и отсекаем нужную длину
СтрокаНулей = "00000000000000000000";
Результат = Прав(СтрокаНулей + СтрокаБезРазделителей, ДлинаСтроки);
Рассмотрим вариант с пошаговым добавлением нулей в цикле. Данный алгоритм нагляден и работает с любой длиной строки:
Предыдущий = "018446483";
ТребуемаяДлина = СтрДлина(Предыдущий);
// Преобразуем к числу, увеличиваем на 1 и убираем группировку
Следующий = Формат(Число(Предыдущий) + 1, "ЧГ=0");
// Дополняем нулями слева до исходной длины
Пока СтрДлина(Следующий) < ТребуемаяДлина Цикл
Следующий = "0" + Следующий;
КонецЦикла;
Если разработка ведется в типовой или доработанной конфигурации с подключенной БСП, рекомендуется использовать готовые методы общего модуля СтроковыеФункцииКлиентСервер. Это делает код стандартизированным и легко читаемым:
ИсходнаяСтрока = "018446483";
ДлинаСтроки = СтрДлина(ИсходнаяСтрока);
НовоеЧисло = Число(ИсходнаяСтрока) + 1;
ЧислоСтрокой = Формат(НовоеЧисло, "ЧГ=0");
Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(ЧислоСтрокой, ДлинаСтроки, "0", "Слева");
Выясним возможные подводные камни, с которыми можно столкнуться при реализации:
1 + "018446483" выполняет неявное приведение строки к числу и возвращает число, однако выражение "018446483" + 1 выполнит конкатенацию строк (получится "0184464831"). Согласно стандартам разработки 1С, всегда следует использовать явное приведение типов с помощью функции Число()."999" результатом должно стать "1000" (4 символа). Если жестко обрезать строку функцией Прав(..., 3), старшая единица будет потеряна. Чтобы избежать потери старших разрядов, вычисляйте результирующую длину как максимум между исходной длиной и длиной полученного числа:
ЧислоСтрокой = Формат(НовоеЧисло, "ЧГ=0");
ИтоговаяДлина = Макс(СтрДлина(ИсходнаяСтрока), СтрДлина(ЧислоСтрокой));
Результат = Прав("0000000000" + ЧислоСтрокой, ИтоговаяДлина);
Число в платформе 1С ограничен максимальной разрядностью в 38 знаков. Для строк большей длины стандартное приведение через Число() вызовет ошибку переполнения, поэтому для сверхдлинных строк сложение необходимо выполнять посимвольно в столбик.Число() вызовет исключение. При необходимости используйте предварительную очистку строки или конструкцию Попытка ... Исключение.