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

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

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

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

Условие в 1С — это конструкция, которая проверяет выражение и в зависимости от результата (Истина или Ложь) выполняет разные ветки кода. Без условий невозможно написать ни одну осмысленную обработку: проверка заполненности реквизитов, расчёт скидок, отбор документов, контроль прав пользователя — всё это строится на условной логике.

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

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

Оператор Если…Тогда…Иначе: базовый синтаксис

Основная условная конструкция встроенного языка выглядит так:

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

Скидка = 10;

Иначе

Скидка = 0;

КонецЕсли;

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

Для цепочки проверок используется ИначеЕсли — условия проверяются сверху вниз, и выполняется только первая истинная ветка:

Если Сумма > 100000 Тогда

Скидка = 15;

ИначеЕсли Сумма > 50000 Тогда

Скидка = 10;

ИначеЕсли Сумма > 10000 Тогда

Скидка = 5;

Иначе

Скидка = 0;

КонецЕсли;

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

Логические операторы и составные условия

Условия объединяются тремя логическими операторами: И (оба условия истинны), ИЛИ (хотя бы одно истинно), НЕ (отрицание). Оператор И имеет более высокий приоритет, чем ИЛИ, поэтому в сложных выражениях ставьте скобки явно.

Если (ТипДокумента = "Реализация" И Сумма > 0)

ИЛИ ПринудительнаяПроверка Тогда

ВыполнитьПроверку();

КонецЕсли;

Важная особенность платформы: при вычислении составного условия 1С вычисляет все его части, а не останавливается на первом ложном. Поэтому конструкция вида Если Ссылка <> Неопределено И Ссылка.Реквизит = 1 Тогда вызовет ошибку, если Ссылка = Неопределено: обращение к реквизиту будет выполнено в любом случае. Разбивайте такие проверки на вложенные условия:

Если Ссылка <> Неопределено Тогда

Если Ссылка.Реквизит = 1 Тогда

// действие

КонецЕсли;

КонецЕсли;

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

Для проверки, заполнено ли значение, используйте функцию ЗначениеЗаполнено(Значение). Она корректно обрабатывает пустые ссылки, пустые строки, нули, Неопределено и NULL, возвращая Ложь. Обратная проверка — НЕ ЗначениеЗаполнено(Значение).

При сравнении значений учитывайте типы. Сравнение строки с числом (Если "5" = 5 Тогда) вернёт Ложь без ошибки, что может скрыть логический дефект. Для сравнения с пустой ссылкой используйте метод Пустая() или функцию ЗначениеЗаполнено(), а не сравнение с Неопределено — это разные значения.

Если НЕ ЗначениеЗаполнено(Контрагент) Тогда

Сообщить("Не указан контрагент");

Возврат;

КонецЕсли;

Для проверки типа значения применяется функция ТипЗнч(Значение) в паре с Тип("ИмяТипа"):

Если ТипЗнч(Документ) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда

// обработка реализации

КонецЕсли;

Типичные ошибки
01
Сравнение ссылочного значения с Неопределено вместо проверки на пустую ссылку — условие никогда не сработает
02
Сравнение строк с лишними пробелами: «Приход » и «Приход» не равны, используйте СокрЛП()
03
Забытая точка с запятой после КонецЕсли — синтаксическая ошибка при проверке модуля
04
Использование нескольких отдельных Если вместо ИначеЕсли — перезапись результата последующими ветками

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

В языке запросов 1С оператора Если нет — вместо него две разные конструкции. Секция ГДЕ отбирает строки результата, а оператор ВЫБОР вычисляет значение поля по условию, подобно тернарному оператору.

ВЫБРАТЬ

Реализация.Ссылка,

ВЫБОР

КОГДА Реализация.СуммаДокумента > 100000

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

КОГДА Реализация.СуммаДокумента > 10000

ТОГДА "Средняя"

ИНАЧЕ "Мелкая"

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

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.Проведен

И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода

В секции ГДЕ доступны сравнения, И/ИЛИ/НЕ, операторы В (вхождение в список или иерархию), МЕЖДУ, ПОДОБНО для поиска по шаблону и проверка ЕСТЬ NULL. Значение NULL появляется при левом соединении таблиц, когда пары не нашлось; сравнение = NULL не работает — только ЕСТЬ NULL или НЕ ЕСТЬ NULL.

Помните о производительности: условия в ГДЕ на полях виртуальных таблиц лучше переносить в параметры самих виртуальных таблиц, а функции над полями в условии (например, ПОДСТРОКА) блокируют использование индексов и замедляют запрос на больших объёмах данных.

Условия без кода: отборы и условное оформление

Не каждое условие требует программирования. В пользовательском режиме отборы в списках и отчётах на СКД настраиваются через кнопку «Ещё → Настроить список» или «Настройки отчёта»: выбирается поле, вид сравнения (равно, в списке, больше, содержит и т.д.) и значение. Несколько условий объединяются по «И», а через группировку условий доступно и «ИЛИ».

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

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

Если…Тогда в модуле

Любая логика, расчёты, ветвление алгоритма. Требует прав доступа к конфигуратору или расширению

ГДЕ в запросе

Отбор строк из базы данных. Быстро, выполняется на сервере СУБД, но только для чтения данных

ВЫБОР в запросе

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

Отборы и условное оформление

Настройка пользователем без кода. Ограничены стандартными видами сравнения

Пошаговый пример: проверка документа перед проведением

Типовая задача — запретить проведение документа, если не заполнен склад или сумма равна нулю. Проверка размещается в обработчике ОбработкаПроверкиЗаполнения модуля объекта:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если НЕ ЗначениеЗаполнено(Склад) Тогда

Сообщить("Не заполнен склад");

Отказ = Истина;

КонецЕсли;

Если Товары.Итог("Сумма") = 0 Тогда

Сообщить("Сумма документа равна нулю");

Отказ = Истина;

КонецЕсли;

КонецПроцедуры

Порядок действий
  1. 1
    Откройте конфигуратор и найдите нужный объект (документ, справочник) или создайте расширение
  2. 2
    Определите событие, в котором нужна проверка: ОбработкаПроверкиЗаполнения, ПередЗаписью, ПриЗаписи
  3. 3
    Напишите условие через Если…Тогда с проверкой реквизита через ЗначениеЗаполнено()
  4. 4
    При нарушении условия выведите сообщение и установите Отказ = Истина
  5. 5
    Сохраните, обновите конфигурацию базы данных и проверьте на тестовой копии
  6. 6
    Проверьте оба сценария: с корректными и с некорректными данными

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

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

Для быстрой проверки без отладки используйте Сообщить() с выводом проверяемых значений перед условием. Во внешних обработках и на клиенте это самый простой способ убедиться, что в переменной лежит именно то, что ожидается, а не пустая ссылка или строка с лишним пробелом.

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

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

Значение в условии
Норма

В отладчике видно ожидаемое значение и тип

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

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

Выполнение веток
Норма

При Истина и Ложь выполняются разные, ожидаемые ветки

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

Всегда выполняется одна и та же ветка

Запрос с ГДЕ
Норма

В консоли запросов результат содержит только нужные строки

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

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

Часто задаваемые вопросы

Можно ли писать условие в одну строку без КонецЕсли?

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

Чем отличается проверка «= Неопределено» от проверки на пустую ссылку?

Неопределено — это отсутствие значения в переменной, а пустая ссылка — вполне конкретное значение ссылочного типа, означающее «ничего не выбрано». Сравнение пустой ссылки с Неопределено даёт Ложь. Для ссылок используйте ЗначениеЗаполнено() или Ссылка.Пустая(), для переменных без типа — сравнение с Неопределено.

Как проверить, что строка содержит подстроку?

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

Почему условие с ИЛИ работает не так, как ожидалось?

Чаще всего из-за приоритета операторов: И вычисляется раньше ИЛИ, поэтому «А ИЛИ Б И В» читается как «А ИЛИ (Б И В)». Всегда расставляйте скобки в смешанных условиях и проверяйте логику в отладчике, вычисляя части выражения по отдельности.

Можно ли использовать условия в расширении конфигурации?

Да, в расширениях доступен полный синтаксис встроенного языка, включая Если…Тогда…КонецЕсли. Условия добавляются в заимствованные или собственные обработчики событий. Это безопасный способ доработки типовой конфигурации, так как расширение не изменяет основной код и не снимает конфигурацию с поддержки.

Как задать условие в динамическом списке формы?

Откройте свойства динамического списка, перейдите в настройку произвольного запроса и добавьте секцию ГДЕ с параметрами, либо используйте «Настройку списка» — отбор, доступный пользователю. Для программной установки отбора используйте коллекцию Отбор.Элементы у элемента формы с добавлением элемента отбора и установкой вида сравнения.

Итог

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

В коде модулей условия пишутся через Если…Тогда…ИначеЕсли…Иначе…КонецЕсли, в запросах — через ГДЕ для отбора и ВЫБОР для вычисляемых полей. Проверяйте заполненность через ЗначениеЗаполнено(), разбивайте цепочки обращений через точку на вложенные условия и тестируйте обе ветки — и при Истина, и при Ложь.