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

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

Какие типы данных нельзя складывать в 1С

Разбираем, какие типы данных нельзя складывать в 1С: строки, числа, даты, ссылки. Примеры ошибок, способы преобразования типов и проверка результата.

Операция сложения во встроенном языке 1С работает не так, как в математике: результат зависит от типов операндов, а не только от их значений. Одни комбинации дают осмысленный результат (число + число, строка + строка, дата + число), другие завершаются ошибкой «Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов» или «Преобразование значения к типу Число не может быть выполнено».

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

Материал ориентирован на разработчиков, администраторов и продвинутых пользователей, которые пишут формулы, обработки или выражения в СКД. Разберём допустимые и запрещённые сочетания, способы безопасного преобразования и типичные сценарии, где ошибка проявляется внезапно.

Какие сочетания типов допустимы, а какие вызовут ошибку

Встроенный язык 1С не выполняет неявного приведения большинства типов при арифметических операциях. Платформа жёстко проверяет совместимость операндов, и если типы несовместимы — выполнение кода прерывается исключением. Это отличает 1С от JavaScript, где 1 + "2" молча превращается в строку.

Базовая логика такова: сложение определено только внутри «семейств» типов. Числа складываются с числами, строки конкатенируются со строками, к дате можно прибавить число секунд. Всё остальное требует явного преобразования одного из операндов.

Левый операндПравый операндРезультат
ЧислоЧислоЧисло (арифметическое сложение)
СтрокаСтрокаСтрока (конкатенация)
ДатаЧислоДата (сдвиг на указанное число секунд)
ЧислоСтрокаОшибка преобразования типа
ДатаДатаОшибка: операция не определена
Любой типСсылка (справочник, документ)Ошибка
Число / Дата / СтрокаБулевоОшибка
Любой типNULL или НеопределеноОшибка или NULL (в запросах)

Число и строка: самая частая ошибка сложения

Классический сценарий: данные загружены из Excel, CSV или веб-сервиса, и количество пришло в виде строки "150". Выражение КоличествоИзФайла + 10 вызывает ошибку «Преобразование значения к типу Число не может быть выполнено», потому что платформа пытается привести строку к числу и не справляется — например, из-за пробела, неразрывного пробела или буквы в значении.

Обратная ситуация коварнее: "Итого: " + 150 тоже вызовет ошибку, потому что в 1С нет неявного преобразования числа в строку при конкатенации. Нужно писать "Итого: " + Строка(150) или использовать шаблон СтрШаблон("Итого: %1", 150).

Как безопасно сложить строку с числом

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

bsl
Попытка
	ЗначениеЧислом = Число(СокрЛП(СтрокаИзФайла));
Исключение
	ЗначениеЧислом = 0;
КонецПопытки;
Итог = ЗначениеЧислом + Количество;

Обратите внимание на неразрывные пробелы и разделители групп: строка «1 200» после Число() может дать ошибку или неверное значение в зависимости от региональных настроек. Перед преобразованием удаляйте пробелы через СтрЗаменить(Значение, Символ(160), "") и СтрЗаменить(Значение, " ", "").

Даты: что можно прибавлять, а что нельзя

К дате разрешено прибавлять только число, и это число интерпретируется как количество секунд, а не дней. Выражение Дата + 1 сдвинет дату на одну секунду, а не на сутки — частая причина «внезапно неверных» периодов в отчётах. Для сдвига на день нужно Дата + 86400 или функция ДобавитьКДате(Дата, "ДЕНЬ", 1) в запросах.

Складывать две даты между собой нельзя — операция не имеет смысла и вызывает ошибку. Если нужна разница между датами, используйте вычитание: Дата2 - Дата1 вернёт число секунд. Для календарных разниц в запросах есть функция РАЗНОСТЬДАТЬ(Дата1, Дата2, ДЕНЬ).

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

Типичные ошибки при работе с датами
01
Прибавление к дате числа дней вместо секунд: Дата + 7 сдвигает на 7 секунд, а не на неделю
02
Попытка сложить две даты для получения периода — операция не определена, нужна разность или РАЗНОСТЬДАТЬ
03
Арифметика с пустой датой '00010101' без проверки ЗначениеЗаполнено()

Ссылочные типы, булево, NULL и Неопределено

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

Булевы значения (Истина/Ложь) также не складываются с числами: в 1С нет неявного преобразования Истина → 1, как в некоторых других языках. Если нужна такая логика, пишите явно: ?(ПризнакОплаты, 1, 0) + Итог.

Значения NULL и Неопределено — отдельный источник сбоев. NULL встречается в результатах запросов (например, при левом соединении без совпадений), Неопределено — в реквизитах составного типа и невозвращающих функциях. Сложение любого значения с NULL в запросе даёт NULL, а в коде — ошибку. Поэтому поля из запросов принято оборачивать в ЕСТЬNULL(Поле, 0), а переменные проверять на Неопределено до арифметики.

Сложение в запросах: свои правила и ловушки

В языке запросов 1С сложение подчиняется похожей логике, но с важными отличиями. Числа складываются свободно, даты можно сдвигать через ДОБАВИТЬКДАТЕ, а конкатенация строк выполняется оператором «+» только для строковых выражений. Попытка сложить число со строкой в запросе вызовет ошибку ещё на этапе проверки текста запроса — в консоли или при выполнении.

Главная ловушка — поля составного типа и соединения. Если поле имеет составной тип (например, «Регистратор» — ссылка на разные документы), сложение его с чем-либо невозможно. А если в левом соединении нет совпадения, числовое поле приходит как NULL, и Количество + NULL даёт NULL, который потом «съедает» итоги в группировках и СКД.

Как защитить вычисления в запросе
  1. 1
    Оберните все числовые поля из соединений в ЕСТЬNULL(Поле, 0)
  2. 2
    Для строковых полей используйте ЕСТЬNULL(Поле, "") перед конкатенацией
  3. 3
    Проверьте тип полей в конструкторе запроса — составные типы видны в описании
  4. 4
    Протестируйте запрос в консоли на данных с гарантированно пустыми связями

Как проверить и привести типы перед сложением

Надёжный шаблон защитного кода строится на трёх шагах: определить фактический тип значения, привести его к нужному типу с обработкой сбоя, выполнить операцию. Для определения типа используется связка ТипЗнч(Значение) и Тип("Число"), Тип("Строка"), Тип("Дата").

В выражениях СКД и управляемых формах, где нет полноценного кода, используйте функции языка выражений: ЕСТЬNULL, ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ и оператор ВЫРАЗИТЬ(Поле КАК Число(15,2)) в запросах. Оператор ВЫРАЗИТЬ не преобразует строку в число — он только уточняет тип, поэтому для «грязных» строк он не поможет.

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

Как выбрать способ приведения типа

Значение пришло из файла, веб-сервиса или ввода пользователяИспользуйте Число()/Дата() внутри Попытка...Исключение с предварительной очисткой строки
Значение — поле запроса, которое может быть NULLПрименяйте ЕСТЬNULL(Поле, 0) или ЕСТЬNULL(Поле, "") прямо в тексте запроса
Реквизит составного типа и нужно сложить только числовые значенияПроверяйте ТипЗнч() и выполняйте сложение только для нужного типа
Нужно собрать строку из значений разных типовИспользуйте СтрШаблон() или явное Строка() для каждого нестрокового значения

Признак корректно написанного кода — он не падает на граничных данных: пустых строках, NULL, пустых датах и ссылках. Прогоняйте обработки на тестовом наборе, где намеренно присутствуют «плохие» значения, а не только на идеальных данных.

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

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

Сложение чисел из загруженного файла
Норма

Итог совпадает с контрольной суммой, посчитанной вручную или в источнике

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

Ошибка преобразования или итог заметно меньше ожидаемого — часть строк не преобразовалась

Сдвиг даты
Норма

Дата изменилась на ожидаемое число дней/месяцев

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

Дата сдвинулась на секунды — прибавлено число без перевода в секунды

Итоги в отчёте СКД
Норма

Суммы по группам и общий итог заполнены

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

В итогах пусто — где-то в цепочке сложения появился NULL

Частые вопросы

Почему «2» + «2» в 1С даёт «22», а не 4?

Оба операнда — строки, поэтому выполняется конкатенация, а не арифметическое сложение. Чтобы получить 4, преобразуйте операнды: Число("2") + Число("2"). Платформа сама не угадывает намерение разработчика.

Можно ли сложить число с Неопределено, если предварительно проверить?

Складывать с Неопределено нельзя даже после проверки — проверка нужна именно для того, чтобы подставить замену: Итог = Итог + ?(Значение = Неопределено, 0, Значение). Сама операция с Неопределено всегда вызовет ошибку.

Почему в запросе сумма по полю равна NULL, хотя в документах есть количество?

Скорее всего, используется левое соединение, и для части строк совпадений нет — поле приходит как NULL. Сложение NULL с числом даёт NULL. Оберните поле в ЕСТЬNULL(Поле, 0) в списке выбираемых полей.

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

В коде используйте ДобавитьМесяц(Дата, 1) — функция корректно обрабатывает разную длину месяцев. В запросе — ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, 1). Прибавление фиксированного числа секунд для месяца не подходит, так как месяцы имеют разную длительность.

Можно ли складывать значения перечислений с числами?

Нет, ссылки на перечисления — это ссылочный тип, и арифметика с ними запрещена. Если нужен порядковый номер значения, получите его через метаданные или сопоставьте значениям числа вручную через соответствие.

Что делать, если тип реквизита составной и заранее неизвестен?

Определите фактический тип через ТипЗнч(Значение) и сравните с Тип("Число"), Тип("Строка"), Тип("Дата"). Выполняйте сложение только в ветке с подходящим типом, для остальных предусмотрите значение по умолчанию или запись в журнал ошибок.

Итог

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

В 1С сложение определено только внутри семейств типов: числа с числами, строки со строками, дата плюс число секунд. Ссылки, булево, NULL и Неопределено в арифметике не участвуют. Всегда приводите типы явно (Число, Строка, ЕСТЬNULL), проверяйте составные реквизиты через ТипЗнч() и тестируйте код на пустых и «грязных» данных.