Разработка и Конфигурация · 10 мин
Что такое операторы в 1С и как их использовать
Что такое операторы во встроенном языке 1С: арифметические, логические, сравнения, присваивания. Синтаксис, примеры кода, типичные ошибки и FAQ.
Операторы во встроенном языке 1С — это специальные символы и служебные слова, которые выполняют действия над данными: складывают числа, сравнивают значения, объединяют строки, проверяют условия. Без них невозможно написать ни один обработчик события, расчёт в модуле документа или условие в запросе. Любая строчка кода в конфигураторе, которая что-то вычисляет или проверяет, построена на операторах.
Важно различать операторы и конструкции языка. Конструкции вроде Если...Тогда или Для...Цикл управляют потоком выполнения, а операторы работают с самими значениями внутри выражений. Например, в строке Сумма = Количество Цена; символ — оператор умножения, а = — оператор присваивания.
Операторы одинаково работают и в тонком клиенте, и на сервере, и в веб-клиенте — синтаксис встроенного языка един для всех режимов. Однако есть нюансы с типами данных: попытка сложить число со строкой без преобразования вызовет ошибку выполнения, поэтому понимание того, какие операторы с какими типами совместимы, критично для стабильного кода.
Какие группы операторов существуют во встроенном языке
Все операторы 1С условно делятся на несколько групп по назначению. Арифметические выполняют вычисления: сложение +, вычитание -, умножение *, деление /, остаток от деления %. Операторы сравнения возвращают булево значение: равно =, не равно <>, больше >, меньше <, больше или равно >=, меньше или равно <=.
Логические операторы И, ИЛИ, НЕ комбинируют условия. Оператор присваивания = записывает значение в переменную. Отдельно стоит унарный минус для отрицательных чисел и оператор + для склейки строк. В языке запросов 1С действует свой набор операторов, частично пересекающийся со встроенным языком, но с дополнительными конструкциями вроде В, ПОДОБНО, МЕЖДУ.
Арифметические операторы и работа с числами
Арифметические операторы применяются к числовым значениям и датам. С числами доступны все стандартные действия: Итог = Сумма1 + Сумма2;, Разница = План - Факт;, НДС = Сумма * 20 / 120;. Оператор % возвращает остаток от деления и часто используется для проверки чётности или циклических вычислений.
Особый случай — арифметика с датами. К дате можно прибавить или вычесть число секунд: Завтра = ТекущаяДата() + 86400;. Разность двух дат также даёт число секунд. Для сдвига на месяцы или годы арифметические операторы не подходят — используйте функцию ДобавитьМесяц(), иначе получите ошибку в расчётах из-за разной длины месяцев.
При делении помните о риске деления на ноль: если знаменатель — переменная, её нужно проверять перед операцией, иначе выполнение модуля прервётся с ошибкой. Типичный защитный приём: Если Количество <> 0 Тогда Цена = Сумма / Количество; КонецЕсли;.
Операторы сравнения и приоритет в условиях
Операторы сравнения возвращают Истина или Ложь и чаще всего встречаются внутри конструкций Если...Тогда и Пока...Цикл. Сравнивать можно числа, строки, даты и ссылки. Строки сравниваются посимвольно с учётом регистра, поэтому "Абонент" = "абонент" вернёт Ложь — для регистронезависимого сравнения приводите обе строки через ВРег() или НРег().
Ссылки сравниваются по уникальному идентификатору: две переменные, указывающие на один элемент справочника, равны. А вот сравнение значений разных типов (например, ссылки и строки) не вызовет ошибку, но вернёт Ложь или результат по правилам упорядочивания типов — это частый источник трудноуловимых дефектов в логике.
Приоритет операций стандартный: сначала арифметика, затем сравнения, затем логические операторы. В сложных условиях всегда ставьте скобки явно: Если (Сумма > 10000 И ВидОплаты = "Безнал") ИЛИ ЕстьСкидка Тогда читается однозначно, а без скобок поведение легко истолковать неверно.
Логические операторы И, ИЛИ, НЕ
Логические операторы объединяют булевы выражения. И требует истинности обоих условий, ИЛИ — хотя бы одного, НЕ инвертирует результат. Встроенный язык 1С допускает и русское, и английское написание (And, Or, Not), что удобно при копировании примеров из англоязычных источников.
Платформа вычисляет логические выражения полностью: даже если первый операнд И равен Ложь, второй всё равно будет вычислен. Это значит, что вызов функции в правой части условия выполнится в любом случае — не размещайте там дорогие операции или обращения к базе, если результат уже предрешён. Разбейте условие на вложенные Если, чтобы гарантировать порядок проверок.
Частая ситуация: нужно проверить, заполнен ли реквизит, и только потом сравнить его значение. Пишите «Если ЗначениеЗаполнено(Договор) Тогда Если Договор.Валюта = ВалютаРуб Тогда ...» вложенными блоками. Объединение через И не защитит от обращения к реквизиту пустой ссылки, потому что обе части условия вычисляются всегда.
Присваивание и операции со строками
Оператор присваивания = записывает результат выражения справа в переменную слева: ИтоговаяСумма = ИтоговаяСумма + СтрокаТаблицы.Сумма;. В 1С нет составных операторов вроде +=, поэтому накопление всегда пишется в полной форме. Символ = выполняет двойную роль — присваивание и сравнение — и интерпретируется по контексту: в начале оператора это присваивание, внутри условия — сравнение.
Для строк оператор + выполняет конкатенацию: ПолноеИмя = Фамилия + " " + Имя + " " + Отчество;. Если один из операндов — число, перед сложением со строкой преобразуйте его функцией Строка() или используйте СтрШаблон() для подстановки значений в шаблон: СтрШаблон("Счёт №%1 от %2", Номер, Формат(Дата, "ДЛФ=D")). Это читабельнее и снижает риск ошибок типов.
Операторы в языке запросов 1С
Язык запросов — отдельный диалект, и его операторы отличаются от встроенного языка. Здесь доступны арифметика и сравнения, а также специфические конструкции: В (&СписокЗначений) для проверки вхождения, ПОДОБНО "%строка%" для поиска по шаблону, МЕЖДУ &Начало И &Конец для диапазонов, ЕСТЬ NULL для проверки на NULL, ЕСТЬNULL(Поле, 0) для подстановки значения по умолчанию.
Логика в запросах пишется теми же словами И, ИЛИ, НЕ, но в секции ГДЕ, ИМЕЮЩИЕ или в условиях соединений. Помните, что сравнение с NULL всегда требует специальной обработки: условие Поле = NULL не сработает, нужен оператор ЕСТЬ NULL. Это одна из самых частых причин «пропадающих» строк в отчётах при левых соединениях.
Как проверить корректность выражений перед запуском
До переноса кода в рабочую базу проверьте выражения в безопасной среде. Используйте консоль кода или обработку с командой Выполнить() на копии базы, чтобы увидеть результат вычислений. Синтаксический контроль модуля (команда «Проверка модуля» в конфигураторе) отловит ошибки написания операторов, но не логические ошибки — их выявляет только выполнение на тестовых данных.
Полезный приём — временный вывод промежуточных значений через Сообщить() или отладку с точками останова. В отладчике можно вычислить любое выражение в табло и сразу увидеть, какой тип и значение возвращает каждый оператор. Это быстрее, чем многократные запуски всего сценария.
- 1Откройте модуль в конфигураторе и выполните синтаксическую проверку
- 2Поставьте точку останова на строке с выражением и запустите отладку на копии базы
- 3В табло вычислите каждую часть выражения отдельно и сверьте типы операндов
- 4Проверьте граничные случаи: ноль, пустая строка, пустая ссылка, NULL
- 5Уберите отладочный код и повторите сценарий на реальных данных копии
Что важно запомнить
Операторы 1С делятся на арифметические, сравнения, логические, присваивание и строковые; в языке запросов добавляются В, ПОДОБНО, МЕЖДУ, ЕСТЬ NULL. Главные источники ошибок — несовпадение типов, деление на ноль, регистр строк и сравнение с NULL. Проверяйте выражения в отладчике на копии базы перед переносом в рабочую конфигурацию.
Часто задаваемые вопросы
Чем отличается оператор = от == в 1С?
Во встроенном языке 1С оператора == не существует. Одиночный знак = используется и для присваивания, и для сравнения — интерпретация зависит от контекста. В условии Если А = Б Тогда это сравнение, в начале оператора А = Б; — присваивание.
Почему условие со строками не срабатывает, хотя значения одинаковые?
Чаще всего дело в регистре символов или неразрывных пробелах. Сравнение строк в 1С регистрозависимое. Приведите обе строки к одному регистру через ВРег() и уберите лишние пробелы функцией СокрЛП() перед сравнением.
Как проверить, что переменная содержит нужный тип, перед применением оператора?
Используйте функцию ТипЗнч(Переменная) и сравните результат с нужным типом: Если ТипЗнч(Значение) = Тип("Число") Тогда .... Это стандартный способ защиты от ошибок несовместимости типов в универсальных процедурах.
Можно ли складывать даты арифметическими операторами?
К дате можно прибавлять только число секунд, а разность двух дат даёт секунды. Для сдвига на дни, месяцы и годы используйте ДобавитьМесяц() или прибавляйте нужное количество секунд с учётом того, что длительность суток обычно принимают за 86400 секунд.
Почему в запросе не работает условие «Поле = NULL»?
NULL в запросах 1С нельзя сравнивать оператором равенства — такое условие всегда ложно. Для проверки используйте конструкцию Поле ЕСТЬ NULL, а для замены NULL значением по умолчанию — функцию ЕСТЬNULL(Поле, 0).
Вычисляются ли обе части условия «И», если первая уже ложна?
Да, встроенный язык вычисляет оба операнда всегда. Если правая часть содержит обращение к реквизиту объекта или вызов функции, она выполнится независимо от левой части. Для гарантированного порядка проверок используйте вложенные блоки Если.