Разработка и Конфигурация · 11 мин
Что такое выражение в 1С и как с ним работать
Выражение в 1С — конструкция встроенного языка, вычисляющая значение. Разбираем виды выражений, операторы, приоритет, примеры кода и типичные ошибки разработчиков.
Выражение — фундаментальное понятие встроенного языка 1С:Предприятие, без которого невозможно написать ни один алгоритм. Любой расчёт цены, проверка условия, формирование строки для печатной формы или запрос к данным в конечном счёте сводится к вычислению выражений. Понимание того, как платформа их обрабатывает, напрямую влияет на качество кода и скорость поиска ошибок.
На практике с выражениями сталкиваются не только разработчики. Пользователи видят их в настройках отборов динамических списков, в формулах произвольных колонок отчётов на СКД, в выражениях представления полей информационных баз. Поэтому разобраться в теме полезно и тем, кто только настраивает типовые конфигурации без программирования.
Материал ниже охватывает определение выражения, его виды, правила приоритета операторов, работу с типами данных, практические примеры и типичные ошибки, которые приводят к неправильным результатам или падению кода.
Что такое выражение во встроенном языке 1С
Формально выражение — это фрагмент кода, который платформа вычисляет и в результате получает единственное значение определённого типа: число, строку, дату, булево, ссылку на объект базы и так далее. Простейшее выражение — это одиночный литерал или имя переменной, сложное — цепочка операций с вызовами функций.
Важно отличать выражение от оператора (инструкции). Оператор выполняет действие: присваивание, вызов процедуры, цикл. Выражение же только вычисляет значение и обычно находится внутри оператора. Например, в строке Сумма = Количество Цена; оператор — это присваивание, а Количество Цена — выражение.
Выражения встречаются в правой части присваивания, в условиях Если ... Тогда, в параметрах методов, в конструкции ?(Условие, Значение1, Значение2), в текстах запросов и в формулах системы компоновки данных. Правила синтаксиса при этом немного различаются: выражение запроса и выражение СКД — не то же самое, что выражение встроенного языка.
Виды выражений и операторы
Выражения принято классифицировать по типу результата и по используемым операторам. Это помогает быстро понять, что вернёт вычисление, и где искать ошибку типов.
Арифметические выражения
Используют операторы +, -, *, / и унарный минус. Результат — число. Деление в 1С всегда даёт дробный результат, отдельного оператора целочисленного деления нет; для округления применяются функции Окр(), Цел(), а остаток от деления получают через % в запросах или вычитанием в коде.
Строковые выражения
Единственный оператор для строк — конкатенация +. Строки можно складывать, но нельзя вычитать или умножать. Для сложной сборки текста удобнее функции СтрШаблон() и СтрСоединить(): они читаемее и быстрее длинных цепочек плюсов.
Логические выражения
Строятся на операторах сравнения =, <>, >, <, >=, <= и логических связках И, ИЛИ, НЕ. Результат — значение типа Булево (Истина или Ложь). Такие выражения стоят в условиях Если, Пока и в отборах.
Операции с датами
К дате можно прибавить или отнять число секунд, разность двух дат тоже даёт число секунд. Для сдвига на месяцы и дни корректнее использовать функцию ДобавитьМесяц() или вычисления через запрос, потому что длительность месяцев различается.
Сложение даты и числа в 1С работает с секундами, а не с днями. Выражение Дата + 1 сдвинет значение на одну секунду, а не на сутки. Для суток нужно Дата + 86400 — это одна из самых частых причин «внезапно неверных» дат в отчётах.
Приоритет операторов и скобки
Платформа вычисляет выражение слева направо с учётом приоритета: сначала вызовы функций и унарные операторы, затем умножение и деление, потом сложение и вычитание, далее операторы сравнения, затем НЕ, И и в конце ИЛИ. Скобки переопределяют этот порядок и выполняются первыми.
Классическая ошибка — смешивание И и ИЛИ без скобок. Выражение А И Б ИЛИ В читается как (А И Б) ИЛИ В, а не как А И (Б ИЛИ В). Если задумано второе, скобки обязательны, иначе условие будет срабатывать не в тех случаях.
// Приоритет: сначала умножение, потом сложение
Сумма = 100 + 50 <em> 2; // результат 200, а не 300
// Скобки меняют порядок
Сумма = (100 + 50) </em> 2; // результат 300
// Логика: скобки обязательны
Если (ЭтоОпт ИЛИ ЭтоРозница) И НЕ Отменен Тогда
// обработка
КонецЕсли;Правило простое: если в выражении больше двух операторов разного вида, ставьте скобки даже там, где приоритет и так даст нужный результат. Это убирает двусмысленность для того, кто будет читать код после вас, и снижает риск ошибки при доработке.
Типы операндов и преобразование типов
1С не выполняет неявных преобразований между несовместимыми типами: попытка сложить число со строкой вида 10 + "текст" вызовет ошибку выполнения. При этом строка из цифр тоже не станет числом автоматически — её нужно явно преобразовать функцией Число(), Строка(), Дата() или Булево().
Отдельная тема — значение Неопределено и NULL из запросов. Сравнение Если Поле = NULL Тогда не работает: любое сравнение с NULL даёт не Истину и не Ложь, а неопределённость. Проверять NULL нужно через ЕСТЬ NULL в запросе или функцию ЗначениеЗаполнено() и проверку на Неопределено в коде.
Выражения в запросах и СКД
Язык запросов 1С имеет собственный синтаксис выражений, похожий на SQL. Здесь доступны арифметика над полями, функции СУММА(), МАКСИМУМ(), РАЗНОСТЬДАТ(), ПОДСТРОКА(), конструкция ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ — аналог тернарного условия. Выражения применяются в списке выбираемых полей, в условиях ГДЕ и в соединениях таблиц.
В системе компоновки данных выражения — третий диалект. Вычисляемые поля СКД, выражения ресурсов и пользовательские поля пишутся на языке выражений компоновки, где доступны функции работы со строками, датами и агрегаты. Важно помнить: выражение ресурса вычисляется на уровне группировки, и ссылаться в нём на поля, не входящие в группировку, без агрегатной функции нельзя.
Сравнение вариантов
Полный набор операторов и функций модуля. Подходит для любой логики, но выполняется на клиенте или сервере после получения данных.
Вычисляется на сервере СУБД, быстро для больших объёмов. Ограниченный набор функций, нет обращения к методам объектов.
Используется в отчётах без изменения запроса. Удобно для формул колонок и ресурсов, но отладка сложнее.
Практические примеры
Ниже — типовые ситуации, где выражения решают конкретные задачи. Все примеры можно вставить в модуль и проверить.
// Скидка в зависимости от суммы
Скидка = ?(СуммаЗаказа >= 100000, 0.1, ?(СуммаЗаказа >= 50000, 0.05, 0));
ИтогоСоСкидкой = СуммаЗаказа * (1 - Скидка);
// Формирование представления
Представление = СтрШаблон("%1 от %2", НомерДокумента, Формат(ДатаДокумента, "ДЛФ=D"));
// Проверка заполненности
Если ЗначениеЗаполнено(Контрагент) И Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
ТребуетсяДоговор = Истина;
КонецЕсли;Типичные ошибки при работе с выражениями
Большинство проблем с выражениями — это не синтаксис, а семантика: код выполняется, но результат неверный. Ниже собраны ситуации, которые встречаются чаще всего.
Ещё одна группа ошибок связана с контекстом выполнения. Выражение, корректное в модуле объекта, может не работать в модуле формы из-за недоступности переменных, а выражение на клиенте не может обратиться к серверным функциям без вызова сервера. Всегда проверяйте, где именно выполняется код.
Как проверить результат
Совпадает с ожидаемым (число, строка, булево)
Неопределено или тип, который ломает дальнейший код
Ноль, пустые значения и NULL обрабатываются явно
Ошибка выполнения или молча неверный результат
Скобки расставлены, условие понятно без комментария
Для понимания нужно вспоминать таблицу приоритетов
Итог и частые вопросы
Что важно запомнить
Выражение — это вычисляемая конструкция, возвращающая одно значение. Контролируйте типы операндов, ставьте скобки в логических выражениях, помните про NULL и секунды в арифметике дат, а сложные формулы проверяйте на копии базы до переноса в рабочий код.
Чем выражение отличается от оператора в 1С?
Оператор — это инструкция, которая выполняет действие: присваивание, условие, цикл, вызов процедуры. Выражение только вычисляет значение и находится внутри оператора. В строке «А = Б + 1» оператор — присваивание, выражение — «Б + 1».
Можно ли складывать строку и число?
Нет, неявного преобразования типов в 1С нет, такая операция вызовет ошибку. Число нужно явно преобразовать функцией Строка() или использовать СтрШаблон(), который сам приводит параметры к строковому виду.
Что вернёт выражение «1 / 3» в 1С?
Число с дробной частью — деление в 1С всегда нецелочисленное. Точность результата ограничена разрядностью числового типа платформы. Для денежных расчётов результат обычно округляют функцией Окр() до нужного знака.
Как проверить поле на NULL из запроса?
Сравнение «= NULL» не работает. В тексте запроса используйте «Поле ЕСТЬ NULL», в коде после выборки — проверку на Неопределено или функцию ЗначениеЗаполнено(). Для замены NULL на значение по умолчанию в запросе есть функция ЕстьNULL(Поле, Значение).
Где посмотреть результат выражения при отладке?
В конфигураторе при остановке на точке останова выделите выражение и нажмите Shift+F9 — откроется окно «Вычислить выражение». Также можно добавить выражение в табло (Ctrl+Alt+W), чтобы его значение обновлялось на каждом шаге отладки.
Чем тернарный оператор ?() отличается от Если...Тогда?
Конструкция ?(Условие, Значение1, Значение2) — это именно выражение: его результат можно сразу присвоить переменной или передать в параметр. Если...Тогда — оператор, он не возвращает значение. Для коротких выборов из двух вариантов тернарная форма компактнее, для сложной логики читаемее полный Если.