К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как прибавить к строке число в 1С

Как прибавить число к строке в 1С: конкатенация через Строка(), преобразование Число(), инкремент номера в строке, типичные ошибки и готовые примеры кода.

Задача «прибавить к строке число» в 1С встречается в двух разных смыслах. Первый — дописать число в конец строки, например сформировать наименование «Договор № 15» или штрихкод. Второй — увеличить числовое значение, которое хранится внутри строки: инкрементировать номер документа, счётчик в коде элемента справочника или порядковый номер файла. Способы решения принципиально различаются, и смешение этих сценариев — частая причина ошибок у начинающих разработчиков.

В языке 1С оператор «+» работает по-разному в зависимости от типов операндов. Если оба операнда — числа, выполняется арифметическое сложение. Если хотя бы один операнд — строка, платформа попытается выполнить неявное преобразование, и в ряде случаев это приведёт к ошибке «Преобразование значения к типу Число не может быть выполнено». Поэтому перед операцией нужно явно решить, какой результат требуется: новая строка или увеличенное число.

Ниже разобраны оба сценария с готовыми примерами кода, способы безопасного преобразования типов, работа с номерами документов и типичные ошибки. Примеры приведены на встроенном языке 1С и подходят для управляемых и обычных форм.

Как дописать число в конец строки через конкатенацию

Самый простой случай — нужно склеить строку и число. В 1С для этого используют оператор «+», но число желательно явно привести к строковому типу функцией Строка(). Это делает код предсказуемым и защищает от неожиданного поведения при изменении типов переменных.

НомерДоговора = 15;

Наименование = "Договор № " + Строка(НомерДоговора);

// Результат: "Договор № 15"

Функция Строка() преобразует число в его строковое представление с учётом региональных настроек сеанса. В некоторых настройках между разрядами могут появляться неразрывные пробелы (например, «1 000» вместо «1000»). Если такое поведение нежелательно — например, при формировании штрихкода, ключа записи или имени файла — используйте функцию Формат() с явным указанием форматной строки.

Сумма = 15000;

Текст = "Сумма: " + Формат(Сумма, "ЧГ=0");

// Результат: "Сумма: 15000" без разделителей групп

Параметр ЧГ=0 отключает группировку разрядов. Для денежных значений удобен формат ЧДЦ=2, который выводит два знака после запятой: Формат(Сумма, "ЧДЦ=2; ЧГ=0") даст «15000.00» или «15000,00» в зависимости от настроек.

Как прибавить число к числу, хранящемуся в строке

Если в строковой переменной лежит число — например, «100» — и его нужно увеличить на единицу, сначала выполните преобразование функцией Число(), затем арифметическую операцию, затем при необходимости обратное преобразование.

СтрокаСЧислом = "100";

Результат = Число(СтрокаСЧислом) + 1; // 101

НоваяСтрока = Строка(Результат); // "101"

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

ИсходнаяСтрока = "1 500"; // возможен неразрывный пробел

Очищенная = СтрЗаменить(ИсходнаяСтрока, Символ(160), "");

Очищенная = СтрЗаменить(Очищенная, " ", "");

Если СтрДлина(Очищенная) > 0 Тогда

Значение = Число(Очищенная) + 1; // 1501

КонецЕсли;

Символ с кодом 160 — это неразрывный пробел, который часто попадает в данные при копировании из документов, Excel или при выгрузке из других систем. Визуально он неотличим от обычного пробела, но Число() из-за него может не сработать. Дополнительно полезно обернуть преобразование в конструкцию Попытка...Исключение, если данные приходят извне и их качество не гарантировано.

Как увеличить номер в строке с сохранением формата

Отдельный практический сценарий — номер вида «000123» или «АБ-0042», где нужно увеличить числовую часть, сохранив длину и префикс. Такая задача возникает при ручной нумерации, генерации кодов и работе со старыми базами, где нумерация велась как строка.

Числовой номер с ведущими нулями

Извлеките число, прибавьте единицу и верните в строку с дополнением нулями слева через Формат():

СтарыйНомер = "000123";

НовоеЧисло = Число(СтарыйНомер) + 1; // 124

НовыйНомер = Формат(НовоеЧисло, "ЧЦ=6; ЧВН=; ЧГ=0");

// Результат: "000124"

Параметр ЧЦ=6 задаёт общую длину, ЧВН= включает вывод ведущих нулей. Длина должна соответствовать длине исходного номера, иначе нумерация «поплывёт» и нарушится сортировка.

Номер с буквенным префиксом

Если номер смешанный, сначала отделите числовую часть. Простой способ — идти по строке справа, пока символы являются цифрами:

Номер = "АБ-0042";

Позиция = СтрДлина(Номер);

Пока Позиция > 0 И СтрНайти("0123456789", Сред(Номер, Позиция, 1)) > 0 Цикл

Позиция = Позиция - 1;

КонецЦикла;

Префикс = Лев(Номер, Позиция); // "АБ-"

ЧисловаяЧасть = Сред(Номер, Позиция + 1); // "0042"

ДлинаЧисла = СтрДлина(ЧисловаяЧасть);

НовыйНомер = Префикс + Формат(Число(ЧисловаяЧасть) + 1,

"ЧЦ=" + ДлинаЧисла + "; ЧВН=; ЧГ=0");

// Результат: "АБ-0043"

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

bsl
Номер = "000123";
НовыйНомер = Формат(Число(Номер) + 1, "ЧЦ=6; ЧВН=; ЧГ=0");
// "000124"

Как работать с нумерацией документов и справочников

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

Для получения следующего номера в типовых конфигурациях используются механизмы нумерации: свойство Нумератор у документов, автонумерация у справочников, а в БСП — подсистема «Префиксация объектов». Если требуется нестандартная нумерация, переопределяйте её в событии ПриУстановкеНовогоНомера (для документов) или ПриУстановкеНовогоКода (для справочников) в модуле объекта, а не прямым пересчётом строк.

Прямое чтение максимального номера запросом с последующим прибавлением единицы — антипаттерн: между чтением и записью другой сеанс может занять тот же номер. Если без такой схемы не обойтись, выполняйте её в транзакции с управляемой блокировкой диапазона номеров.

Типичные ошибки
01
Складывать строку и число без преобразования — получение ошибки о невозможности преобразования типа или неожиданной конкатенации вместо сложения.
02
Использовать Строка() для кодов и штрихкодов — в строку попадают неразрывные пробелы-разделители разрядов.
03
Прибавлять единицу к номеру без сохранения ведущих нулей — нарушается длина номера и сортировка.
04
Считать следующий номер запросом MAX()+1 без блокировок — при параллельной работе возникают дубли номеров.
05
Не очищать строку от неразрывных пробелов перед Число() — исключение на внешне корректных данных.

Как выбрать подходящий способ

Выбор зависит от того, что является результатом: строка для отображения, строка-ключ или число для дальнейших вычислений. Сводная логика выбора приведена ниже.

ЗадачаСпособОграничение
Показать число в тексте сообщенияСтрока(Число) или подстановка в шаблонЗависит от региональных настроек
Сформировать код, штрихкод, имя файлаФормат(Число, "ЧГ=0")Форматную строку нужно задать явно
Увеличить число из строкиЧисло(Строка) + NСтрока должна содержать только цифры
Инкремент номера с нулямиФормат(..., "ЧЦ=n; ЧВН=")Длина должна совпадать с исходной
Нумерация документовШтатная нумерация, ПриУстановкеНовогоНомераНе использовать MAX()+1 без блокировок

Для подстановки чисел в текст сообщений пользователю удобна функция СтрШаблон(): она заменяет места %1, %2 и так далее на переданные значения, автоматически приводя их к строке. Это читаемее, чем длинная цепочка конкатенаций, особенно когда в текст вставляется несколько чисел.

Сообщение = СтрШаблон("Обработано %1 из %2 документов", 15, 20);

// "Обработано 15 из 20 документов"

Маршрут решения

Как выбрать действие

Нужно просто показать число в текстеИспользуйте Строка() или СтрШаблон()
Строка — машиночитаемый ключ или кодИспользуйте Формат() с ЧГ=0, не Строка()
Нужно увеличить число внутри строкиОчистите строку, преобразуйте Число(), прибавьте, верните через Формат()
Речь о номере документа или кода справочникаИспользуйте штатную нумерацию и события установки номера

Как проверить результат и отладить код

После преобразований проверяйте три вещи: тип результата, его значение и длину строки. Быстрый способ — вывести значения через Сообщить() или посмотреть в табло отладчика. Для проверки типа используйте функцию ТипЗнч().

Результат = Формат(Число("000123") + 1, "ЧЦ=6; ЧВН=; ЧГ=0");

Сообщить(ТипЗнч(Результат)); // Строка

Сообщить(Результат); // 000124

Сообщить(СтрДлина(Результат)); // 6

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

Контрольные точки

Как проверить результат

Тип результата
Норма

ТипЗнч() возвращает ожидаемый тип (Строка или Число)

Тревожный признак

Тип отличается — где-то пропущено преобразование

Длина строки-результата
Норма

Совпадает с ожидаемой длиной номера

Тревожный признак

Длина больше — вероятны неразрывные пробелы

Содержимое при выводе
Норма

Число без разделителей разрядов, формат сохранён

Тревожный признак

Пробелы между цифрами или потерянные ведущие нули

Часто задаваемые вопросы

Почему выражение "10" + 1 вызывает ошибку в 1С?

Потому что платформа пытается привести строку «10» к числу для арифметической операции, но неявное преобразование в таком контексте не гарантировано и зависит от порядка операндов. Явно укажите намерение: Число("10") + 1 для сложения или "10" + Строка(1) для склейки строк.

Как убрать пробелы между разрядами при выводе числа в строку?

Используйте Формат(Значение, "ЧГ=0") — параметр ЧГ=0 отключает группировку разрядов. Альтернатива — убрать неразрывные пробелы после преобразования через СтрЗаменить(Строка, Символ(160), ""), но форматная строка надёжнее.

Как прибавить единицу к дате, которая хранится в строке?

Сначала преобразуйте строку в дату функцией Дата() с форматом «ГГГГММДД» или через разбор строки, затем прибавьте нужное число секунд (сутки — 86400). Прямое арифметическое сложение со строковым представлением даты невозможно.

Можно ли увеличить номер документа вручную в цикле при загрузке данных?

Можно, но безопаснее оставить номер пустым и позволить платформе назначить его при записи. Если нужен свой алгоритм, реализуйте его в событии ПриУстановкеНовогоНомера и учитывайте префиксы и периодичность нумерации.

Что делать, если Число() выдаёт ошибку на строке, которая выглядит как число?

Проверьте строку на неразрывные пробелы (Символ(160)), табуляцию и переводы строк, а также на запятую вместо точки в дробной части. Очистите строку через СтрЗаменить и оберните преобразование в Попытка...Исключение для внешних данных.

Как дописать число к строке в запросе 1С?

В языке запросов конкатенация выполняется оператором «+», но оба операнда должны быть строками. Приведите число функцией ПРЕДСТАВЛЕНИЕ() или выберите строковое поле. Учтите, что ПРЕДСТАВЛЕНИЕ для чисел также зависит от настроек и может содержать разделители разрядов.

Итог

Что важно запомнить

Дописать число к строке — это конкатенация через Строка() или Формат(); увеличить число внутри строки — преобразование Число(), сложение и возврат формата. Для кодов и ключей используйте только Формат() с ЧГ=0, а номера документов и коды справочников поручайте штатной нумерации. Перед преобразованием внешних данных очищайте строку от неразрывных пробелов и проверяйте результат по типу и длине.