Разработка и Конфигурация · 10 мин
Как сложить число и строку в запросе 1С
Как сложить число и строку в запросе 1С: приведение типов через ВЫРАЗИТЬ, ПОДСТРОКА, конкатенация строк, типичные ошибки и готовые примеры кода.
В языке запросов 1С нет неявного преобразования типов: если попытаться сложить число и строку оператором «+», запрос завершится с ошибкой «Несовместимые типы». Поэтому задача «сложить число и строку» всегда сводится к одному из двух сценариев: либо нужно привести строку к числу и выполнить арифметику, либо привести число к строке и выполнить конкатенацию (склейку текста).
Выбор сценария зависит от смысла данных. Если строка хранит количество или сумму («15», «1200.5») — требуется арифметическое сложение. Если нужно сформировать текст вроде «Остаток: 15 шт.» — требуется конкатенация. В обоих случаях используются конструкции языка запросов: ВЫРАЗИТЬ, ПОДСТРОКА, арифметические операторы и функции работы со строками.
Важное ограничение: язык запросов 1С поддерживает явное приведение типов через ВЫРАЗИТЬ только в ограниченном наборе случаев. Прямое преобразование строки в число через ВЫРАЗИТЬ(... КАК ЧИСЛО) работает не во всех ситуациях и зависит от СУБД, поэтому на практике часто применяют обходные приёмы. Ниже разобраны рабочие варианты с примерами.
Почему возникает ошибка при сложении разных типов
Язык запросов 1С строго типизирован на уровне операций. Оператор «+» допустим только между совместимыми типами: число с числом, строка со строкой, дата с числом (прибавление секунд). Когда платформа встречает выражение вида Количество + КодСтрокой, где одно поле числовое, а второе строковое, она не может выбрать правило вычисления и прерывает выполнение.
Типичный текст ошибки — «Ошибка при выполнении запроса» с пояснением о несовместимости типов операндов. Ошибка возникает на этапе исполнения, а не компиляции, поэтому в консоли запросов или при вызове Запрос.Выполнить() она проявляется только при реальном обращении к данным.
Дополнительная сложность — составные типы. Если реквизит объявлен как составной (например, строка и число одновременно), результат операции зависит от фактического значения в каждой строке, и запрос может падать непредсказуемо — на одних данных работать, на других нет.
Сценарий 1: арифметическое сложение через ВЫРАЗИТЬ
Если строковое поле гарантированно содержит число, используйте явное приведение типа конструкцией ВЫРАЗИТЬ. Это стандартный способ сказать запросу: «трактуй это значение как число».
ВЫБРАТЬ
ВЫРАЗИТЬ(Товары.КоличествоСтрокой КАК ЧИСЛО(15, 2)) + Товары.Резерв КАК ИтоговоеКоличество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
Параметры ЧИСЛО(15, 2) задают общую длину и точность. Подбирайте их с запасом: если фактическое значение не помещается в указанную разрядность, результат будет обрезан или запрос вернёт ошибку переполнения в зависимости от СУБД.
Главный риск этого подхода — «грязные» данные. Если в строковом поле встретится значение «12а», «нет» или пустая строка, приведение к числу может дать ошибку или непредсказуемый результат. Поэтому перед массовым применением такого запроса проверьте данные отдельным запросом: выберите значения, которые не состоят только из цифр и разделителя.
Проверка данных перед приведением
Надёжный приём — отфильтровать проблемные значения заранее. В языке запросов нет функции «ЭтоЧисло», поэтому проверку делают косвенно: например, исключают значения, где приведение невозможно, обрабатывая их на уровне встроенного языка, либо используют ВЫБОР с проверкой на пустую строку:
ВЫБОР
КОГДА Товары.КоличествоСтрокой = ""
ТОГДА 0
ИНАЧЕ ВЫРАЗИТЬ(Товары.КоличествоСтрокой КАК ЧИСЛО(15, 2))
КОНЕЦ + Товары.Резерв КАК Итог
Такая конструкция защищает хотя бы от пустых строк, но не от буквенных значений. Полную гарантию даёт только предварительная очистка данных или перенос логики из запроса в код.
Сценарий 2: конкатенация — склеить число и строку в текст
Когда цель — получить строку вида «Заказ № 125 от контрагента», нужна не арифметика, а склейка. В языке запросов оператор «+» для строк выполняет конкатенацию, но все операнды должны быть строками.
Универсальный приём приведения числа к строке в запросе — функция ПОДСТРОКА. Поскольку прямого ВЫРАЗИТЬ(Число КАК СТРОКА) с произвольной длиной в ряде случаев недостаточно, используют представление значения:
ВЫБРАТЬ
"Заказ № " + ПОДСТРОКА(Заказы.Номер, 1, 20) + ", сумма: " КАК Описание
ИЗ
Документ.ЗаказПокупателя КАК Заказы
Для ссылочных полей (номер документа, наименование) часто достаточно сложить их представления. Однако для чисто числового реквизита надёжнее получить строковое представление на уровне встроенного языка после выполнения запроса — в цикле обхода выборки применить Строка(Выборка.Сумма) или Формат(Выборка.Сумма, "ЧГ=0").
Запрос = Новый Запрос("ВЫБРАТЬ Товары.Количество КАК Количество, Товары.Номенклатура.Наименование КАК Наименование ИЗ Документ.Реализация.Товары КАК Товары");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТекстСтроки = Выборка.Наименование + " — " + Формат(Выборка.Количество, "ЧГ=0") + " шт.";
КонецЦикла;Сценарий 3: обработка составных типов и NULL
Реквизиты составного типа — частый источник проблем. Если поле может хранить и строку, и число, безопасный шаблон — сначала отделить значения нужного типа через ВЫБОР с проверкой ТИПЗНАЧЕНИЯ, и только потом складывать:
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Регистр.Значение) = ТИП(ЧИСЛО)
ТОГДА Регистр.Значение
ИНАЧЕ 0
КОНЕЦ + 10 КАК Результат
Отдельно следите за NULL. Сложение любого значения с NULL даёт NULL, а не число и не строку. Если поле участвует в соединении таблиц, оберните его в ЕСТЬNULL(Поле, 0) для арифметики или в ЕСТЬNULL(Поле, "") для конкатенации. Это устраняет «тихие» потери данных, когда строка результата просто оказывается пустой.
Когда логику лучше вынести из запроса в код
Запрос оптимален для выборки и агрегации, но не для гибкой работы со строками. Если требуется форматировать числа с разделителями групп, обрабатывать нечисловые строки или строить сложные тексты, выполните вычисления в цикле обхода выборки средствами встроенного языка: Формат(), Строка(), Число() с проверками.
Критерий выбора простой: если выражение в запросе требует больше одного вложенного ВЫБОР или обходных приёмов с ПОДСТРОКА — переносите его в код. Запрос останется читаемым, а логика получит полноценную обработку исключений через Попытка/Исключение.
Как выбрать действие
Проверка результата
После доработки запроса проверьте его на данных, близких к боевым. Откройте консоль запросов, выполните запрос и убедитесь, что тип итоговой колонки соответствует ожиданию: число — для арифметики, строка — для конкатенации. Проверить тип можно, выгрузив результат в таблицу значений и посмотрев типы колонок.
Обязательно протестируйте граничные случаи: пустая строка, NULL, очень длинное число, строка с пробелами и нецифровыми символами. Именно на таких значениях запросы с приведением типов ломаются чаще всего.
Как проверить результат
Число — для арифметики, Строка — для склейки
Тип не определён или не совпадает с ожиданием
Возвращают 0 или пустую строку по логике ВЫБОР/ЕСТЬNULL
Строка исчезает из результата или содержит NULL
Выполняется без ошибок на всех записях
Падает на отдельных документах с нечисловыми строками
Частые вопросы
Можно ли в запросе 1С написать Число + Строка напрямую?
Нет. Оператор «+» требует совместимых типов операндов. Необходимо сначала привести один из операндов: строку к числу через ВЫРАЗИТЬ, либо число к строке через ПОДСТРОКА или на уровне встроенного языка.
Как преобразовать строку в число в запросе 1С?
Используйте конструкцию ВЫРАЗИТЬ(Поле КАК ЧИСЛО(длина, точность)). Учтите, что при нечисловом содержимом поля запрос может завершиться ошибкой, поэтому данные стоит предварительно проверить.
Как преобразовать число в строку в запросе?
Прямой универсальной функции нет. На практике применяют ПОДСТРОКА для строковых представлений либо формируют текст уже после запроса — функциями Строка() и Формат() при обходе выборки.
Почему результат сложения стал NULL?
Потому что один из операндов равен NULL — например, поле пришло из левого соединения без совпадений. Любая операция с NULL даёт NULL. Оберните поле в ЕСТЬNULL(Поле, 0) или ЕСТЬNULL(Поле, "").
Что делать, если в строковом поле встречаются буквы?
Язык запросов не умеет проверять «числовость» строки. Отфильтруйте такие записи в коде с помощью Попытка/Исключение и Число(), либо очистите данные перед выполнением запроса.
Работает ли ВЫРАЗИТЬ одинаково на файловой базе и на SQL?
Поведение приведения типов может различаться в зависимости от используемой СУБД, особенно при ошибках преобразования и переполнении разрядности. Проверяйте запрос на той же архитектуре, что используется в рабочей базе.
Что важно запомнить
Число и строку в запросе 1С нельзя сложить напрямую — сначала приведите типы: ВЫРАЗИТЬ для арифметики, ПОДСТРОКА или код встроенного языка для склейки. Всегда защищайтесь от NULL через ЕСТЬNULL и проверяйте «грязные» строковые данные до приведения к числу.