Разработка и Конфигурация · 11 мин
Какие типы данных нельзя складывать в 1С
Разбираем, какие типы данных нельзя складывать в 1С: строки, числа, даты, ссылки. Примеры ошибок, способы преобразования типов и проверка результата.
Операция сложения во встроенном языке 1С работает не так, как в математике: результат зависит от типов операндов, а не только от их значений. Одни комбинации дают осмысленный результат (число + число, строка + строка, дата + число), другие завершаются ошибкой «Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов» или «Преобразование значения к типу Число не может быть выполнено».
Проблема особенно остра в запросах, при выгрузке данных из внешних источников и при работе с реквизитами составного типа: значение «120» из Excel — это строка, а не число, и попытка сложить её с количеством товара приведёт либо к ошибке, либо к неожиданной конкатенации. Понимание правил сложения типов экономит часы отладки и предотвращает тихие ошибки в расчётах.
Материал ориентирован на разработчиков, администраторов и продвинутых пользователей, которые пишут формулы, обработки или выражения в СКД. Разберём допустимые и запрещённые сочетания, способы безопасного преобразования и типичные сценарии, где ошибка проявляется внезапно.
Какие сочетания типов допустимы, а какие вызовут ошибку
Встроенный язык 1С не выполняет неявного приведения большинства типов при арифметических операциях. Платформа жёстко проверяет совместимость операндов, и если типы несовместимы — выполнение кода прерывается исключением. Это отличает 1С от JavaScript, где 1 + "2" молча превращается в строку.
Базовая логика такова: сложение определено только внутри «семейств» типов. Числа складываются с числами, строки конкатенируются со строками, к дате можно прибавить число секунд. Всё остальное требует явного преобразования одного из операндов.
| Левый операнд | Правый операнд | Результат |
|---|---|---|
| Число | Число | Число (арифметическое сложение) |
| Строка | Строка | Строка (конкатенация) |
| Дата | Число | Дата (сдвиг на указанное число секунд) |
| Число | Строка | Ошибка преобразования типа |
| Дата | Дата | Ошибка: операция не определена |
| Любой тип | Ссылка (справочник, документ) | Ошибка |
| Число / Дата / Строка | Булево | Ошибка |
| Любой тип | NULL или Неопределено | Ошибка или NULL (в запросах) |
Число и строка: самая частая ошибка сложения
Классический сценарий: данные загружены из Excel, CSV или веб-сервиса, и количество пришло в виде строки "150". Выражение КоличествоИзФайла + 10 вызывает ошибку «Преобразование значения к типу Число не может быть выполнено», потому что платформа пытается привести строку к числу и не справляется — например, из-за пробела, неразрывного пробела или буквы в значении.
Обратная ситуация коварнее: "Итого: " + 150 тоже вызовет ошибку, потому что в 1С нет неявного преобразования числа в строку при конкатенации. Нужно писать "Итого: " + Строка(150) или использовать шаблон СтрШаблон("Итого: %1", 150).
Как безопасно сложить строку с числом
Перед сложением строки, которая должна быть числом, выполните явное преобразование с защитой от мусора. Функция Число() вызовет исключение на нечисловой строке, поэтому в загрузках данных используйте проверку или конструкцию «Попытка...Исключение».
Попытка
ЗначениеЧислом = Число(СокрЛП(СтрокаИзФайла));
Исключение
ЗначениеЧислом = 0;
КонецПопытки;
Итог = ЗначениеЧислом + Количество;Обратите внимание на неразрывные пробелы и разделители групп: строка «1 200» после Число() может дать ошибку или неверное значение в зависимости от региональных настроек. Перед преобразованием удаляйте пробелы через СтрЗаменить(Значение, Символ(160), "") и СтрЗаменить(Значение, " ", "").
Даты: что можно прибавлять, а что нельзя
К дате разрешено прибавлять только число, и это число интерпретируется как количество секунд, а не дней. Выражение Дата + 1 сдвинет дату на одну секунду, а не на сутки — частая причина «внезапно неверных» периодов в отчётах. Для сдвига на день нужно Дата + 86400 или функция ДобавитьКДате(Дата, "ДЕНЬ", 1) в запросах.
Складывать две даты между собой нельзя — операция не имеет смысла и вызывает ошибку. Если нужна разница между датами, используйте вычитание: Дата2 - Дата1 вернёт число секунд. Для календарных разниц в запросах есть функция РАЗНОСТЬДАТЬ(Дата1, Дата2, ДЕНЬ).
Отдельный риск — пустая дата '00010101'. Сложение с ней технически работает, но результат почти всегда бессмысленен. Перед арифметикой с датами проверяйте заполненность: Если ЗначениеЗаполнено(Дата) Тогда ....
Ссылочные типы, булево, NULL и Неопределено
Ссылки на объекты базы данных — справочники, документы, перечисления, планы счетов — не участвуют в арифметических операциях вообще. Сложение НоменклатураСсылка + Число или двух ссылок между собой всегда завершается ошибкой. Если нужно «собрать» представление объекта, преобразуйте ссылку в строку: Строка(Ссылка) вернёт представление.
Булевы значения (Истина/Ложь) также не складываются с числами: в 1С нет неявного преобразования Истина → 1, как в некоторых других языках. Если нужна такая логика, пишите явно: ?(ПризнакОплаты, 1, 0) + Итог.
Значения NULL и Неопределено — отдельный источник сбоев. NULL встречается в результатах запросов (например, при левом соединении без совпадений), Неопределено — в реквизитах составного типа и невозвращающих функциях. Сложение любого значения с NULL в запросе даёт NULL, а в коде — ошибку. Поэтому поля из запросов принято оборачивать в ЕСТЬNULL(Поле, 0), а переменные проверять на Неопределено до арифметики.
Сложение в запросах: свои правила и ловушки
В языке запросов 1С сложение подчиняется похожей логике, но с важными отличиями. Числа складываются свободно, даты можно сдвигать через ДОБАВИТЬКДАТЕ, а конкатенация строк выполняется оператором «+» только для строковых выражений. Попытка сложить число со строкой в запросе вызовет ошибку ещё на этапе проверки текста запроса — в консоли или при выполнении.
Главная ловушка — поля составного типа и соединения. Если поле имеет составной тип (например, «Регистратор» — ссылка на разные документы), сложение его с чем-либо невозможно. А если в левом соединении нет совпадения, числовое поле приходит как NULL, и Количество + NULL даёт NULL, который потом «съедает» итоги в группировках и СКД.
- 1Оберните все числовые поля из соединений в ЕСТЬNULL(Поле, 0)
- 2Для строковых полей используйте ЕСТЬNULL(Поле, "") перед конкатенацией
- 3Проверьте тип полей в конструкторе запроса — составные типы видны в описании
- 4Протестируйте запрос в консоли на данных с гарантированно пустыми связями
Как проверить и привести типы перед сложением
Надёжный шаблон защитного кода строится на трёх шагах: определить фактический тип значения, привести его к нужному типу с обработкой сбоя, выполнить операцию. Для определения типа используется связка ТипЗнч(Значение) и Тип("Число"), Тип("Строка"), Тип("Дата").
В выражениях СКД и управляемых формах, где нет полноценного кода, используйте функции языка выражений: ЕСТЬNULL, ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ и оператор ВЫРАЗИТЬ(Поле КАК Число(15,2)) в запросах. Оператор ВЫРАЗИТЬ не преобразует строку в число — он только уточняет тип, поэтому для «грязных» строк он не поможет.
Как выбрать способ приведения типа
Признак корректно написанного кода — он не падает на граничных данных: пустых строках, NULL, пустых датах и ссылках. Прогоняйте обработки на тестовом наборе, где намеренно присутствуют «плохие» значения, а не только на идеальных данных.
Как проверить результат
Итог совпадает с контрольной суммой, посчитанной вручную или в источнике
Ошибка преобразования или итог заметно меньше ожидаемого — часть строк не преобразовалась
Дата изменилась на ожидаемое число дней/месяцев
Дата сдвинулась на секунды — прибавлено число без перевода в секунды
Суммы по группам и общий итог заполнены
В итогах пусто — где-то в цепочке сложения появился NULL
Частые вопросы
Почему «2» + «2» в 1С даёт «22», а не 4?
Оба операнда — строки, поэтому выполняется конкатенация, а не арифметическое сложение. Чтобы получить 4, преобразуйте операнды: Число("2") + Число("2"). Платформа сама не угадывает намерение разработчика.
Можно ли сложить число с Неопределено, если предварительно проверить?
Складывать с Неопределено нельзя даже после проверки — проверка нужна именно для того, чтобы подставить замену: Итог = Итог + ?(Значение = Неопределено, 0, Значение). Сама операция с Неопределено всегда вызовет ошибку.
Почему в запросе сумма по полю равна NULL, хотя в документах есть количество?
Скорее всего, используется левое соединение, и для части строк совпадений нет — поле приходит как NULL. Сложение NULL с числом даёт NULL. Оберните поле в ЕСТЬNULL(Поле, 0) в списке выбираемых полей.
Как прибавить к дате один месяц?
В коде используйте ДобавитьМесяц(Дата, 1) — функция корректно обрабатывает разную длину месяцев. В запросе — ДОБАВИТЬКДАТЕ(Дата, МЕСЯЦ, 1). Прибавление фиксированного числа секунд для месяца не подходит, так как месяцы имеют разную длительность.
Можно ли складывать значения перечислений с числами?
Нет, ссылки на перечисления — это ссылочный тип, и арифметика с ними запрещена. Если нужен порядковый номер значения, получите его через метаданные или сопоставьте значениям числа вручную через соответствие.
Что делать, если тип реквизита составной и заранее неизвестен?
Определите фактический тип через ТипЗнч(Значение) и сравните с Тип("Число"), Тип("Строка"), Тип("Дата"). Выполняйте сложение только в ветке с подходящим типом, для остальных предусмотрите значение по умолчанию или запись в журнал ошибок.
Что важно запомнить
В 1С сложение определено только внутри семейств типов: числа с числами, строки со строками, дата плюс число секунд. Ссылки, булево, NULL и Неопределено в арифметике не участвуют. Всегда приводите типы явно (Число, Строка, ЕСТЬNULL), проверяйте составные реквизиты через ТипЗнч() и тестируйте код на пустых и «грязных» данных.