Разработка и Конфигурация · 11 мин
Как писать условия в 1С: полное руководство с примерами
Как писать условия в 1С: синтаксис Если…Тогда…Иначе, логические операторы И, ИЛИ, НЕ, условия в запросах и СКД, типичные ошибки и примеры кода для начинающих.
Условные конструкции — основа любой логики в 1С: проверка заполнения реквизитов, выбор алгоритма расчёта, фильтрация данных в запросах и настройка отчётов. Встроенный язык 1С использует конструкцию Если … Тогда … ИначеЕсли … Иначе … КонецЕсли;, а в запросах и СКД условия задаются иначе — через ГДЕ, ВЫБОР и отборы.
Ошибки в условиях — одна из самых частых причин неправильных расчётов: забытая точка с запятой, сравнение с NULL через знак равенства или неверный приоритет логических операторов способны «молча» изменить поведение программы. Поэтому важно понимать не только синтаксис, но и типичные ловушки.
Материал рассчитан на начинающих разработчиков и продвинутых пользователей, которые пишут условия в отборах, выражениях СКД и простых доработках. Все примеры можно проверить в конфигураторе на учебной базе.
Синтаксис оператора «Если» во встроенном языке
Базовая форма условного оператора выглядит так:
Если СуммаДокумента > 100000 Тогда
ТребуетсяСогласование = Истина;
ИначеЕсли СуммаДокумента > 0 Тогда
ТребуетсяСогласование = Ложь;
Иначе
ВызватьИсключение "Сумма документа должна быть положительной";
КонецЕсли;
Правила синтаксиса, которые нельзя нарушать: после логического выражения обязательно слово Тогда, весь блок заканчивается словом КонецЕсли с точкой с запятой. Веток ИначеЕсли может быть сколько угодно, ветка Иначе — необязательна и всегда идёт последней.
Условие должно быть выражением булева типа: сравнение (=, <>, >, <, >=, <=), функция, возвращающая Истина или Ложь, или переменная булева типа. В отличие от некоторых языков, 1С не приводит числа и строки к булеву типу автоматически — запись Если Сумма Тогда вызовет ошибку.
Если НЕ ЗначениеЗаполнено(Контрагент) Тогда
Сообщить("Не указан контрагент");
Возврат;
КонецЕсли;Логические операторы И, ИЛИ, НЕ
Сложные условия строятся из простых с помощью трёх операторов. И требует истинности обеих частей, ИЛИ — хотя бы одной, НЕ инвертирует результат. Приоритет: сначала НЕ, затем И, затем ИЛИ.
Когда порядок вычисления неочевиден, ставьте скобки — это бесплатно и избавляет от тонких ошибок. Например, условие «скидка действует для постоянных клиентов или при сумме больше 50000, но только для розницы» без скобок будет интерпретировано иначе, чем задумано:
Если ЭтоРозница И (ПостоянныйКлиент ИЛИ Сумма > 50000) Тогда
ПрименитьСкидку();
КонецЕсли;
Полезная особенность: 1С вычисляет логические выражения по сокращённой схеме. Если в цепочке И первое условие ложно, второе не вычисляется. Этим пользуются, ставя «дешёвую» и безопасную проверку первой: Если ЗначениеЗаполнено(Ссылка) И Ссылка.Проведен Тогда — обращения к реквизиту пустой ссылки не произойдёт.
Сравнение значений и проверка заполненности
Для проверки «пустоты» значения в 1С есть специальная функция ЗначениеЗаполнено(). Она корректно работает со ссылками, строками, числами и датами, тогда как сравнение Строка = "" не поймает строку из одних пробелов, а сравнение ссылки с Неопределено не поймает пустую ссылку конкретного типа.
Значение Неопределено означает отсутствие значения вообще — его возвращают, например, свойства структур при отсутствии ключа. Проверяется строгим равенством: Если Результат = Неопределено Тогда. Пустая ссылка проверяется функцией Ссылка.Пустая() или сравнением с Справочники.Номенклатура.ПустаяСсылка().
Особый случай — NULL, который встречается только в результатах запросов (например, при левом соединении без совпадений). Сравнение Значение = NULL всегда даёт ложь в классической логике запросов; используйте конструкцию ЕСТЬ NULL или функцию ЕСТЬNULL(Поле, ЗначениеПоУмолчанию).
Условия в запросах: ГДЕ, ВЫБОР и ЕСТЬ NULL
В языке запросов 1С условия фильтрации записываются в секции ГДЕ. Логические операторы те же — И, ИЛИ, НЕ, плюс специфичные конструкции: В для проверки вхождения в список, ПОДОБНО для поиска по шаблону, МЕЖДУ для диапазонов.
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
И Номенклатура.ВидНоменклатуры В (&СписокВидов)
И Номенклатура.Наименование ПОДОБНО &Маска
Когда нужно не отфильтровать, а вычислить значение по условию, используется оператор ВЫБОР — аналог «Если» внутри запроса:
ВЫБОР
КОГДА Продажи.Сумма > 100000
ТОГДА "Крупная"
КОГДА Продажи.Сумма > 0
ТОГДА "Обычная"
ИНАЧЕ "Не определена"
КОНЕЦ КАК КатегорияПродажи
Для подстановки значения вместо NULL применяйте ЕСТЬNULL(Остатки.Количество, 0) — это убережёт от сюрпризов при последующих арифметических операциях и сравнениях в коде.
Условия в СКД и настройках отчётов
В системе компоновки данных условия задаются без кода — через отборы на закладке «Настройки». Пользователь выбирает поле, вид сравнения (равно, в списке, содержит, больше и т.д.) и значение. Отборы, добавленные на уровне схемы компоновки, применяются до вывода данных и работают эффективнее программной фильтрации результата.
Для условного оформления строк отчёта (подсветить отрицательные остатки красным, выделить просроченные документы) используется закладка «Условное оформление»: задаётся отбор-условие и оформление, которое применяется к полям при его выполнении. Это заменяет программную обработку каждой строки.
Вычисляемые поля в СКД позволяют написать выражение с конструкцией Выбор Когда … Тогда … Иначе … Конец прямо в ресурсах и полях отчёта. Это удобно для категоризации данных без изменения запроса.
Где задавать условие
Гибкая бизнес-логика, проверки перед записью, ветвление алгоритмов. Требует доработки конфигурации
Фильтрация и вычисления на уровне СУБД, быстро на больших объёмах. Не подходит для сложного ветвления
Настраивается пользователем без кода, идеально для отчётов. Ограничено возможностями конструктора
Проверка и отладка условий
Самый надёжный способ проверить условие — отладчик конфигуратора: поставьте точку останова на строке с Если, запустите сеанс в режиме отладки и посмотрите значения всех переменных, входящих в выражение, через «Вычислить выражение» (Shift+F9). Так вы увидите, какая именно часть сложного условия даёт неожиданный результат.
Для запросов используйте консоль запросов: выполняйте запрос по частям, временно убирая условия из ГДЕ, чтобы понять, какое из них «отсекает» нужные строки. Проверяйте параметры — незаполненный параметр отбора часто является причиной пустого результата.
Перед переносом доработки в рабочую базу протестируйте условие на граничных значениях: ноль, пустая строка, пустая ссылка, максимально длинное значение, отрицательное число. Именно на границах условия ломаются чаще всего.
Как проверить результат
Каждая переменная имеет ожидаемый тип и значение
Неопределено, NULL или значение не того типа
Условия отбирают именно те строки, что ожидались
Пустой результат или лишние строки
Ноль, пустые значения и максимумы обрабатываются корректно
Ошибка или неверная ветка условия на границах
Непредусмотренные случаи попадают в безопасную ветку
Ситуация «молча» проходит без обработки
Типичные ошибки и ограничения
Самая частая синтаксическая ошибка — пропущенное КонецЕсли; или точка с запятой после него: модуль просто не сохранится с сообщением об ошибке. Коварнее логические ошибки: условие компилируется, но работает не так. Классический пример — сравнение даты со строкой или числа со строкой без явного приведения типов.
В запросах помните про трёхзначную логику NULL: любое сравнение с NULL даёт неопределённый результат, и строка отбрасывается. Если после левого соединения вы фильтруете по полю правой таблицы, добавьте обработку NULL или перенесите условие в само соединение.
Ограничение безопасной самостоятельной работы: доработки типовых конфигураций делайте через расширения, а не изменением основной конфигурации — иначе усложните обновления. Перед изменением рабочей базы обязательно сделайте резервную копию и проверьте логику на копии.
Что важно запомнить
Условие в коде — это Если…Тогда…ИначеЕсли…Иначе…КонецЕсли; с операторами И, ИЛИ, НЕ. В запросах используются ГДЕ, ВЫБОР и ЕСТЬNULL. Проверяйте заполненность через ЗначениеЗаполнено, NULL — только через ЕСТЬ NULL, ставьте скобки в сложных выражениях и тестируйте на граничных значениях в копии базы.
Частые вопросы
Чем отличается «ИначеЕсли» от нескольких отдельных «Если»?
В конструкции ИначеЕсли проверка следующего условия выполняется только если предыдущее ложно, и срабатывает максимум одна ветка. Несколько отдельных Если проверяются все независимо, и могут выполниться несколько блоков подряд — это медленнее и часто приводит к двойной обработке одной ситуации.
Как проверить, что строка содержит определённый текст?
Во встроенном языке используйте функцию СтрНайти(Строка, Подстрока) — она возвращает позицию вхождения или 0, если текст не найден: Если СтрНайти(Наименование, "услуга") > 0 Тогда. В запросах для этой цели служит оператор ПОДОБНО с шаблоном "%текст%".
Почему условие в запросе не отбирает нужные строки?
Чаще всего причина в NULL после левого соединения, незаполненном параметре отбора или несовпадении типов сравниваемых значений. Выполните запрос в консоли по частям, убирая условия по одному, и проверьте фактические значения параметров.
Можно ли использовать условия без программирования?
Да. В динамических списках, отборах отчётов на СКД и условном оформлении условия задаются через настройки: выбор поля, вида сравнения и значения. Этого достаточно для типовых задач фильтрации и подсветки данных без изменения конфигурации.
Как задать условие «значение входит в список»?
В коде создайте массив или соответствие и проверяйте вхождение методом Найти: Если СписокСтатусов.Найти(Статус) <> Неопределено Тогда. В запросе используйте оператор В: Поле В (&СписокЗначений), передав список параметром.
Что делать, если веток условия слишком много?
Длинную цепочку ИначеЕсли стоит заменить: в коде — соответствием, где ключом служит проверяемое значение, а значением — результат или имя обработчика; в запросе — соединением с таблицей соответствий. Такой код короче, читается легче и проще расширяется.