Разработка и Конфигурация · 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"
Этот подход работает для большинства типовых форматов. Если номеров много и операция выполняется в цикле, вынесите форматную строку в переменную, чтобы не собирать её на каждой итерации.
Номер = "000123";
НовыйНомер = Формат(Число(Номер) + 1, "ЧЦ=6; ЧВН=; ЧГ=0");
// "000124"Как работать с нумерацией документов и справочников
Если задача — прибавить единицу к номеру документа или коду элемента справочника, в типовых конфигурациях не нужно делать это вручную. Платформа и БСП (библиотека стандартных подсистем) автоматически назначают следующий номер при записи объекта, если номер не заполнен. Ручной инкремент номера чреват дублями и конфликтами при одновременной работе пользователей.
Для получения следующего номера в типовых конфигурациях используются механизмы нумерации: свойство Нумератор у документов, автонумерация у справочников, а в БСП — подсистема «Префиксация объектов». Если требуется нестандартная нумерация, переопределяйте её в событии ПриУстановкеНовогоНомера (для документов) или ПриУстановкеНовогоКода (для справочников) в модуле объекта, а не прямым пересчётом строк.
Прямое чтение максимального номера запросом с последующим прибавлением единицы — антипаттерн: между чтением и записью другой сеанс может занять тот же номер. Если без такой схемы не обойтись, выполняйте её в транзакции с управляемой блокировкой диапазона номеров.
Как выбрать подходящий способ
Выбор зависит от того, что является результатом: строка для отображения, строка-ключ или число для дальнейших вычислений. Сводная логика выбора приведена ниже.
| Задача | Способ | Ограничение |
|---|---|---|
| Показать число в тексте сообщения | Строка(Число) или подстановка в шаблон | Зависит от региональных настроек |
| Сформировать код, штрихкод, имя файла | Формат(Число, "ЧГ=0") | Форматную строку нужно задать явно |
| Увеличить число из строки | Число(Строка) + N | Строка должна содержать только цифры |
| Инкремент номера с нулями | Формат(..., "ЧЦ=n; ЧВН=") | Длина должна совпадать с исходной |
| Нумерация документов | Штатная нумерация, ПриУстановкеНовогоНомера | Не использовать MAX()+1 без блокировок |
Для подстановки чисел в текст сообщений пользователю удобна функция СтрШаблон(): она заменяет места %1, %2 и так далее на переданные значения, автоматически приводя их к строке. Это читаемее, чем длинная цепочка конкатенаций, особенно когда в текст вставляется несколько чисел.
Сообщение = СтрШаблон("Обработано %1 из %2 документов", 15, 20);
// "Обработано 15 из 20 документов"
Как выбрать действие
Как проверить результат и отладить код
После преобразований проверяйте три вещи: тип результата, его значение и длину строки. Быстрый способ — вывести значения через Сообщить() или посмотреть в табло отладчика. Для проверки типа используйте функцию ТипЗнч().
Результат = Формат(Число("000123") + 1, "ЧЦ=6; ЧВН=; ЧГ=0");
Сообщить(ТипЗнч(Результат)); // Строка
Сообщить(Результат); // 000124
Сообщить(СтрДлина(Результат)); // 6
Если строка после сложения выглядит правильно, но сравнение с эталоном возвращает ложь, почти всегда виноваты невидимые символы: неразрывный пробел, перевод строки или табуляция. Проверить это можно сравнением СтрДлина() фактической и ожидаемой строк — расхождение длины сразу укажет на лишние символы.
Как проверить результат
ТипЗнч() возвращает ожидаемый тип (Строка или Число)
Тип отличается — где-то пропущено преобразование
Совпадает с ожидаемой длиной номера
Длина больше — вероятны неразрывные пробелы
Число без разделителей разрядов, формат сохранён
Пробелы между цифрами или потерянные ведущие нули
Часто задаваемые вопросы
Почему выражение "10" + 1 вызывает ошибку в 1С?
Потому что платформа пытается привести строку «10» к числу для арифметической операции, но неявное преобразование в таком контексте не гарантировано и зависит от порядка операндов. Явно укажите намерение: Число("10") + 1 для сложения или "10" + Строка(1) для склейки строк.
Как убрать пробелы между разрядами при выводе числа в строку?
Используйте Формат(Значение, "ЧГ=0") — параметр ЧГ=0 отключает группировку разрядов. Альтернатива — убрать неразрывные пробелы после преобразования через СтрЗаменить(Строка, Символ(160), ""), но форматная строка надёжнее.
Как прибавить единицу к дате, которая хранится в строке?
Сначала преобразуйте строку в дату функцией Дата() с форматом «ГГГГММДД» или через разбор строки, затем прибавьте нужное число секунд (сутки — 86400). Прямое арифметическое сложение со строковым представлением даты невозможно.
Можно ли увеличить номер документа вручную в цикле при загрузке данных?
Можно, но безопаснее оставить номер пустым и позволить платформе назначить его при записи. Если нужен свой алгоритм, реализуйте его в событии ПриУстановкеНовогоНомера и учитывайте префиксы и периодичность нумерации.
Что делать, если Число() выдаёт ошибку на строке, которая выглядит как число?
Проверьте строку на неразрывные пробелы (Символ(160)), табуляцию и переводы строк, а также на запятую вместо точки в дробной части. Очистите строку через СтрЗаменить и оберните преобразование в Попытка...Исключение для внешних данных.
Как дописать число к строке в запросе 1С?
В языке запросов конкатенация выполняется оператором «+», но оба операнда должны быть строками. Приведите число функцией ПРЕДСТАВЛЕНИЕ() или выберите строковое поле. Учтите, что ПРЕДСТАВЛЕНИЕ для чисел также зависит от настроек и может содержать разделители разрядов.
Что важно запомнить
Дописать число к строке — это конкатенация через Строка() или Формат(); увеличить число внутри строки — преобразование Число(), сложение и возврат формата. Для кодов и ключей используйте только Формат() с ЧГ=0, а номера документов и коды справочников поручайте штатной нумерации. Перед преобразованием внешних данных очищайте строку от неразрывных пробелов и проверяйте результат по типу и длине.