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

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

Как писать условия в 1С: полное руководство с примерами

Как писать условия в 1С: синтаксис Если…Тогда…Иначе, логические операторы И, ИЛИ, НЕ, условия в запросах и СКД, типичные ошибки и примеры кода для начинающих.

Условные конструкции — основа любой логики в 1С: проверка заполнения реквизитов, выбор алгоритма расчёта, фильтрация данных в запросах и настройка отчётов. Встроенный язык 1С использует конструкцию Если … Тогда … ИначеЕсли … Иначе … КонецЕсли;, а в запросах и СКД условия задаются иначе — через ГДЕ, ВЫБОР и отборы.

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

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

Синтаксис оператора «Если» во встроенном языке

Базовая форма условного оператора выглядит так:

Если СуммаДокумента > 100000 Тогда

ТребуетсяСогласование = Истина;

ИначеЕсли СуммаДокумента > 0 Тогда

ТребуетсяСогласование = Ложь;

Иначе

ВызватьИсключение "Сумма документа должна быть положительной";

КонецЕсли;

Правила синтаксиса, которые нельзя нарушать: после логического выражения обязательно слово Тогда, весь блок заканчивается словом КонецЕсли с точкой с запятой. Веток ИначеЕсли может быть сколько угодно, ветка Иначе — необязательна и всегда идёт последней.

Условие должно быть выражением булева типа: сравнение (=, <>, >, <, >=, <=), функция, возвращающая Истина или Ложь, или переменная булева типа. В отличие от некоторых языков, 1С не приводит числа и строки к булеву типу автоматически — запись Если Сумма Тогда вызовет ошибку.

bsl
Если НЕ ЗначениеЗаполнено(Контрагент) Тогда
    Сообщить("Не указан контрагент");
    Возврат;
КонецЕсли;

Логические операторы И, ИЛИ, НЕ

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

Когда порядок вычисления неочевиден, ставьте скобки — это бесплатно и избавляет от тонких ошибок. Например, условие «скидка действует для постоянных клиентов или при сумме больше 50000, но только для розницы» без скобок будет интерпретировано иначе, чем задумано:

Если ЭтоРозница И (ПостоянныйКлиент ИЛИ Сумма > 50000) Тогда

ПрименитьСкидку();

КонецЕсли;

Полезная особенность: 1С вычисляет логические выражения по сокращённой схеме. Если в цепочке И первое условие ложно, второе не вычисляется. Этим пользуются, ставя «дешёвую» и безопасную проверку первой: Если ЗначениеЗаполнено(Ссылка) И Ссылка.Проведен Тогда — обращения к реквизиту пустой ссылки не произойдёт.

Сравнение значений и проверка заполненности

Для проверки «пустоты» значения в 1С есть специальная функция ЗначениеЗаполнено(). Она корректно работает со ссылками, строками, числами и датами, тогда как сравнение Строка = "" не поймает строку из одних пробелов, а сравнение ссылки с Неопределено не поймает пустую ссылку конкретного типа.

Значение Неопределено означает отсутствие значения вообще — его возвращают, например, свойства структур при отсутствии ключа. Проверяется строгим равенством: Если Результат = Неопределено Тогда. Пустая ссылка проверяется функцией Ссылка.Пустая() или сравнением с Справочники.Номенклатура.ПустаяСсылка().

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

Типичные ошибки
01
Сравнение с NULL через знак равенства в запросе — условие никогда не выполнится; используйте ЕСТЬ NULL
02
Проверка строки через = "" вместо ЗначениеЗаполнено — строка из пробелов пройдёт как заполненная
03
Отсутствие КонецЕсли или точки с запятой — модуль не компилируется
04
Сравнение значений разных типов без приведения — результат непредсказуем
05
Длинные цепочки ИначеЕсли там, где уместнее запрос или соответствие — код трудно поддерживать

Условия в запросах: ГДЕ, ВЫБОР и ЕСТЬ NULL

В языке запросов 1С условия фильтрации записываются в секции ГДЕ. Логические операторы те же — И, ИЛИ, НЕ, плюс специфичные конструкции: В для проверки вхождения в список, ПОДОБНО для поиска по шаблону, МЕЖДУ для диапазонов.

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

НЕ Номенклатура.ПометкаУдаления

И Номенклатура.ВидНоменклатуры В (&СписокВидов)

И Номенклатура.Наименование ПОДОБНО &Маска

Когда нужно не отфильтровать, а вычислить значение по условию, используется оператор ВЫБОР — аналог «Если» внутри запроса:

ВЫБОР

КОГДА Продажи.Сумма > 100000

ТОГДА "Крупная"

КОГДА Продажи.Сумма > 0

ТОГДА "Обычная"

ИНАЧЕ "Не определена"

КОНЕЦ КАК КатегорияПродажи

Для подстановки значения вместо NULL применяйте ЕСТЬNULL(Остатки.Количество, 0) — это убережёт от сюрпризов при последующих арифметических операциях и сравнениях в коде.

Условия в СКД и настройках отчётов

В системе компоновки данных условия задаются без кода — через отборы на закладке «Настройки». Пользователь выбирает поле, вид сравнения (равно, в списке, содержит, больше и т.д.) и значение. Отборы, добавленные на уровне схемы компоновки, применяются до вывода данных и работают эффективнее программной фильтрации результата.

Для условного оформления строк отчёта (подсветить отрицательные остатки красным, выделить просроченные документы) используется закладка «Условное оформление»: задаётся отбор-условие и оформление, которое применяется к полям при его выполнении. Это заменяет программную обработку каждой строки.

Вычисляемые поля в СКД позволяют написать выражение с конструкцией Выбор Когда … Тогда … Иначе … Конец прямо в ресурсах и полях отчёта. Это удобно для категоризации данных без изменения запроса.

Где задавать условие

Код модуля (Если)

Гибкая бизнес-логика, проверки перед записью, ветвление алгоритмов. Требует доработки конфигурации

Запрос (ГДЕ, ВЫБОР)

Фильтрация и вычисления на уровне СУБД, быстро на больших объёмах. Не подходит для сложного ветвления

СКД (отборы, условное оформление)

Настраивается пользователем без кода, идеально для отчётов. Ограничено возможностями конструктора

Проверка и отладка условий

Самый надёжный способ проверить условие — отладчик конфигуратора: поставьте точку останова на строке с Если, запустите сеанс в режиме отладки и посмотрите значения всех переменных, входящих в выражение, через «Вычислить выражение» (Shift+F9). Так вы увидите, какая именно часть сложного условия даёт неожиданный результат.

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

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

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

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

Значения переменных в отладчике
Норма

Каждая переменная имеет ожидаемый тип и значение

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

Неопределено, NULL или значение не того типа

Результат запроса в консоли
Норма

Условия отбирают именно те строки, что ожидались

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

Пустой результат или лишние строки

Граничные значения
Норма

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

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

Ошибка или неверная ветка условия на границах

Поведение ветки Иначе
Норма

Непредусмотренные случаи попадают в безопасную ветку

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

Ситуация «молча» проходит без обработки

Типичные ошибки и ограничения

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

В запросах помните про трёхзначную логику NULL: любое сравнение с NULL даёт неопределённый результат, и строка отбрасывается. Если после левого соединения вы фильтруете по полю правой таблицы, добавьте обработку NULL или перенесите условие в само соединение.

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

Итог

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

Условие в коде — это Если…Тогда…ИначеЕсли…Иначе…КонецЕсли; с операторами И, ИЛИ, НЕ. В запросах используются ГДЕ, ВЫБОР и ЕСТЬNULL. Проверяйте заполненность через ЗначениеЗаполнено, NULL — только через ЕСТЬ NULL, ставьте скобки в сложных выражениях и тестируйте на граничных значениях в копии базы.

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

Чем отличается «ИначеЕсли» от нескольких отдельных «Если»?

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

Как проверить, что строка содержит определённый текст?

Во встроенном языке используйте функцию СтрНайти(Строка, Подстрока) — она возвращает позицию вхождения или 0, если текст не найден: Если СтрНайти(Наименование, "услуга") > 0 Тогда. В запросах для этой цели служит оператор ПОДОБНО с шаблоном "%текст%".

Почему условие в запросе не отбирает нужные строки?

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

Можно ли использовать условия без программирования?

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

Как задать условие «значение входит в список»?

В коде создайте массив или соответствие и проверяйте вхождение методом Найти: Если СписокСтатусов.Найти(Статус) <> Неопределено Тогда. В запросе используйте оператор В: Поле В (&СписокЗначений), передав список параметром.

Что делать, если веток условия слишком много?

Длинную цепочку ИначеЕсли стоит заменить: в коде — соответствием, где ключом служит проверяемое значение, а значением — результат или имя обработчика; в запросе — соединением с таблицей соответствий. Такой код короче, читается легче и проще расширяется.