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

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

Что такое выражение в 1С и как с ним работать

Выражение в 1С — конструкция встроенного языка, вычисляющая значение. Разбираем виды выражений, операторы, приоритет, примеры кода и типичные ошибки разработчиков.

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

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

Материал ниже охватывает определение выражения, его виды, правила приоритета операторов, работу с типами данных, практические примеры и типичные ошибки, которые приводят к неправильным результатам или падению кода.

Что такое выражение во встроенном языке 1С

Формально выражение — это фрагмент кода, который платформа вычисляет и в результате получает единственное значение определённого типа: число, строку, дату, булево, ссылку на объект базы и так далее. Простейшее выражение — это одиночный литерал или имя переменной, сложное — цепочка операций с вызовами функций.

Важно отличать выражение от оператора (инструкции). Оператор выполняет действие: присваивание, вызов процедуры, цикл. Выражение же только вычисляет значение и обычно находится внутри оператора. Например, в строке Сумма = Количество Цена; оператор — это присваивание, а Количество Цена — выражение.

Выражения встречаются в правой части присваивания, в условиях Если ... Тогда, в параметрах методов, в конструкции ?(Условие, Значение1, Значение2), в текстах запросов и в формулах системы компоновки данных. Правила синтаксиса при этом немного различаются: выражение запроса и выражение СКД — не то же самое, что выражение встроенного языка.

Виды выражений и операторы

Выражения принято классифицировать по типу результата и по используемым операторам. Это помогает быстро понять, что вернёт вычисление, и где искать ошибку типов.

Арифметические выражения

Используют операторы +, -, *, / и унарный минус. Результат — число. Деление в 1С всегда даёт дробный результат, отдельного оператора целочисленного деления нет; для округления применяются функции Окр(), Цел(), а остаток от деления получают через % в запросах или вычитанием в коде.

Строковые выражения

Единственный оператор для строк — конкатенация +. Строки можно складывать, но нельзя вычитать или умножать. Для сложной сборки текста удобнее функции СтрШаблон() и СтрСоединить(): они читаемее и быстрее длинных цепочек плюсов.

Логические выражения

Строятся на операторах сравнения =, <>, >, <, >=, <= и логических связках И, ИЛИ, НЕ. Результат — значение типа Булево (Истина или Ложь). Такие выражения стоят в условиях Если, Пока и в отборах.

Операции с датами

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

Сложение даты и числа в 1С работает с секундами, а не с днями. Выражение Дата + 1 сдвинет значение на одну секунду, а не на сутки. Для суток нужно Дата + 86400 — это одна из самых частых причин «внезапно неверных» дат в отчётах.
ПЗ
Практическое замечание

Приоритет операторов и скобки

Платформа вычисляет выражение слева направо с учётом приоритета: сначала вызовы функций и унарные операторы, затем умножение и деление, потом сложение и вычитание, далее операторы сравнения, затем НЕ, И и в конце ИЛИ. Скобки переопределяют этот порядок и выполняются первыми.

Классическая ошибка — смешивание И и ИЛИ без скобок. Выражение А И Б ИЛИ В читается как (А И Б) ИЛИ В, а не как А И (Б ИЛИ В). Если задумано второе, скобки обязательны, иначе условие будет срабатывать не в тех случаях.

bsl
// Приоритет: сначала умножение, потом сложение
Сумма = 100 + 50 <em> 2; // результат 200, а не 300

// Скобки меняют порядок
Сумма = (100 + 50) </em> 2; // результат 300

// Логика: скобки обязательны
Если (ЭтоОпт ИЛИ ЭтоРозница) И НЕ Отменен Тогда
	// обработка
КонецЕсли;

Правило простое: если в выражении больше двух операторов разного вида, ставьте скобки даже там, где приоритет и так даст нужный результат. Это убирает двусмысленность для того, кто будет читать код после вас, и снижает риск ошибки при доработке.

Типы операндов и преобразование типов

1С не выполняет неявных преобразований между несовместимыми типами: попытка сложить число со строкой вида 10 + "текст" вызовет ошибку выполнения. При этом строка из цифр тоже не станет числом автоматически — её нужно явно преобразовать функцией Число(), Строка(), Дата() или Булево().

Отдельная тема — значение Неопределено и NULL из запросов. Сравнение Если Поле = NULL Тогда не работает: любое сравнение с NULL даёт не Истину и не Ложь, а неопределённость. Проверять NULL нужно через ЕСТЬ NULL в запросе или функцию ЗначениеЗаполнено() и проверку на Неопределено в коде.

Выражения в запросах и СКД

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

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

Сравнение вариантов

Выражение встроенного языка

Полный набор операторов и функций модуля. Подходит для любой логики, но выполняется на клиенте или сервере после получения данных.

Выражение языка запросов

Вычисляется на сервере СУБД, быстро для больших объёмов. Ограниченный набор функций, нет обращения к методам объектов.

Выражение СКД

Используется в отчётах без изменения запроса. Удобно для формул колонок и ресурсов, но отладка сложнее.

Практические примеры

Ниже — типовые ситуации, где выражения решают конкретные задачи. Все примеры можно вставить в модуль и проверить.

bsl
// Скидка в зависимости от суммы
Скидка = ?(СуммаЗаказа >= 100000, 0.1, ?(СуммаЗаказа >= 50000, 0.05, 0));
ИтогоСоСкидкой = СуммаЗаказа * (1 - Скидка);

// Формирование представления
Представление = СтрШаблон("%1 от %2", НомерДокумента, Формат(ДатаДокумента, "ДЛФ=D"));

// Проверка заполненности
Если ЗначениеЗаполнено(Контрагент) И Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
	ТребуетсяДоговор = Истина;
КонецЕсли;

Типичные ошибки при работе с выражениями

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

Типичные ошибки
01
Сравнение с NULL через знак равенства — условие никогда не сработает, нужно ЕСТЬ NULL или ЕстьNULL() в запросе
02
Сложение даты и числа дней — добавляются секунды, а не дни; дату сдвигают на 86400 секунд или через ДобавитьМесяц()
03
Смешение И и ИЛИ без скобок — условие срабатывает не там, где задумано
04
Деление на ноль без проверки знаменателя — падение кода с ошибкой выполнения
05
Сравнение чисел с плавающей точкой на точное равенство — лучше сравнивать модуль разности с малым порогом
06
Конкатенация строки с числом без Строка() или СтрШаблон() — ошибка преобразования типов

Ещё одна группа ошибок связана с контекстом выполнения. Выражение, корректное в модуле объекта, может не работать в модуле формы из-за недоступности переменных, а выражение на клиенте не может обратиться к серверным функциям без вызова сервера. Всегда проверяйте, где именно выполняется код.

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

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

Тип результата выражения
Норма

Совпадает с ожидаемым (число, строка, булево)

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

Неопределено или тип, который ломает дальнейший код

Поведение на граничных данных
Норма

Ноль, пустые значения и NULL обрабатываются явно

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

Ошибка выполнения или молча неверный результат

Читаемость выражения
Норма

Скобки расставлены, условие понятно без комментария

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

Для понимания нужно вспоминать таблицу приоритетов

Итог и частые вопросы

Итог

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

Выражение — это вычисляемая конструкция, возвращающая одно значение. Контролируйте типы операндов, ставьте скобки в логических выражениях, помните про NULL и секунды в арифметике дат, а сложные формулы проверяйте на копии базы до переноса в рабочий код.

Чем выражение отличается от оператора в 1С?

Оператор — это инструкция, которая выполняет действие: присваивание, условие, цикл, вызов процедуры. Выражение только вычисляет значение и находится внутри оператора. В строке «А = Б + 1» оператор — присваивание, выражение — «Б + 1».

Можно ли складывать строку и число?

Нет, неявного преобразования типов в 1С нет, такая операция вызовет ошибку. Число нужно явно преобразовать функцией Строка() или использовать СтрШаблон(), который сам приводит параметры к строковому виду.

Что вернёт выражение «1 / 3» в 1С?

Число с дробной частью — деление в 1С всегда нецелочисленное. Точность результата ограничена разрядностью числового типа платформы. Для денежных расчётов результат обычно округляют функцией Окр() до нужного знака.

Как проверить поле на NULL из запроса?

Сравнение «= NULL» не работает. В тексте запроса используйте «Поле ЕСТЬ NULL», в коде после выборки — проверку на Неопределено или функцию ЗначениеЗаполнено(). Для замены NULL на значение по умолчанию в запросе есть функция ЕстьNULL(Поле, Значение).

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

В конфигураторе при остановке на точке останова выделите выражение и нажмите Shift+F9 — откроется окно «Вычислить выражение». Также можно добавить выражение в табло (Ctrl+Alt+W), чтобы его значение обновлялось на каждом шаге отладки.

Чем тернарный оператор ?() отличается от Если...Тогда?

Конструкция ?(Условие, Значение1, Значение2) — это именно выражение: его результат можно сразу присвоить переменной или передать в параметр. Если...Тогда — оператор, он не возвращает значение. Для коротких выборов из двух вариантов тернарная форма компактнее, для сложной логики читаемее полный Если.