Las construcciones condicionales son la base de cualquier lógica empresarial en 1C:Enterprise. Descuento para un cliente mayorista, bloqueo de envío en caso de saldo negativo, elección de la tasa de IVA en función del grupo de nomenclatura: todas estas tareas se resuelven mediante la ramificación del código. En este artículo analizaremos la sintaxis de las condiciones, los patrones típicos y los escenarios comerciales reales a los que se enfrenta cada desarrollador de 1C.

Sintaxis básica: Si ... Entonces ... FinSi
La construcción condicional más simple en el lenguaje 1C consta de tres elementos obligatorios: la palabra clave Если, seguida de una expresión lógica, luego la palabra Тогда, un bloque de código y el cierre КонецЕсли. Si la condición es verdadera, se ejecuta el bloque dentro de la estructura. Si es falso, se omite por completo.
// Verificación simple: prohibición de realizar con importe cero
Если Объект.СуммаДокумента = 0 Тогда
Сообщить("The document amount cannot be zero!");
Отказ = Истина;
КонецЕсли;Tenga en cuenta: 1C no tiene llaves, como en JavaScript o C#. Los límites del bloque se establecen mediante palabras clave. El punto y coma se coloca después de КонецЕсли y después de cada operador dentro del bloque.
La rama «De lo contrario» — procesamiento de un escenario alternativo
Cuando es necesario ejecutar un bloque de código cuando la condición es verdadera y otro cuando es falsa, se utiliza la construcción con Иначе. Este es el patrón clásico «o-o», que se encuentra en la gran mayoría de las tareas empresariales.
// Determinamos el tipo de precio para el cliente
Если Контрагент.ОптовыйПокупатель Тогда
ТипЦены = Справочники.ТипыЦен.НайтиПоНаименованию("Wholesale");
Иначе
ТипЦены = Справочники.ТипыЦен.НайтиПоНаименованию("Retail");
КонецЕсли;Aquí el programa comprueba los detalles de la contraparte y, dependiendo de su valor, asigna a la variable uno de los dos tipos de precio. El bloque Иначе se ejecuta solo cuando la condición después de Если ha devuelto Ложь.
Condiciones múltiples: De lo contrario
La lógica empresarial real rara vez se reduce a dos opciones. Cuando es necesario verificar tres o más escenarios, se utiliza la construcción ИначеЕсли. La plataforma verifica las condiciones secuencialmente de arriba a abajo y ejecuta el primer bloque, cuya condición resultó ser verdadera. Todas las demás ramas se omiten.
// Cálculo del descuento en función del importe del pedido
Если СуммаЗаказа >= 500000 Тогда
ПроцентСкидки = 15;
ИначеЕсли СуммаЗаказа >= 100000 Тогда
ПроцентСкидки = 10;
ИначеЕсли СуммаЗаказа >= 50000 Тогда
ПроцентСкидки = 5;
Иначе
ПроцентСкидки = 0;
КонецЕсли;El orden de las ramas en ИначеЕсли es de importancia crítica. Si se establece una verificación de 50.000 primero, entonces un pedido de 500.000 también caerá en esta rama, porque 500.000 >= 50.000. Organiza siempre las condiciones de la más estricta a la más suave.
Operadores lógicos: Y, O, NO
Las condiciones se pueden combinar con tres operadores lógicos. Esto permite construir comprobaciones complejas que tienen en cuenta varios factores al mismo tiempo.
El operador И (conjunción) devuelve Истина cuando ambas condiciones son verdaderas. El operador ИЛИ (disyunción) devuelve Истина cuando al menos una condición es verdadera. El operador НЕ (negación) invierte el valor, devuelve Истина cuando la condición es falsa.
// El envío está permitido si el producto está disponible y el cliente no está bloqueado
Если ОстатокНаСкладе > 0 И НЕ Контрагент.Заблокирован Тогда
РазрешитьОтгрузку();
КонецЕсли;
// Condiciones especiales para clientes VIP o empleados
Если Контрагент.VIP ИЛИ Контрагент.Сотрудник Тогда
ПрименитьСпециальнуюСкидку();
КонецЕсли;En 1C no hay cálculo "perezoso" de expresiones lógicas (evaluación de cortocircuito). La plataforma siempre calcula ambos operandos, incluso si el resultado ya es obvio en el primero. Esto significa que si el segundo operando puede causar un error, debe llevarse a una comprobación separada a través del Если adjunto.
Operadores de comparación
Para construir condiciones en 1C, está disponible un conjunto estándar de operadores de comparación. Funcionan con números, cadenas, fechas y tipos de referencia: = (igual), <> (no igual), > (mayor), < (menor), >= (mayor o igual), <= (menor o igual).
// Ejemplos de uso de operadores de comparación
Если Статус = "Paid" Тогда
// procesamiento de un pedido pagado
КонецЕсли;
Если Остаток <> 0 Тогда
// el saldo no es cero
КонецЕсли;
Если ДатаОтгрузки < ТекущаяДата() Тогда
// fecha de envío vencida
КонецЕсли;
Если Количество >= МинимальнаяПартия Тогда
// cantidad suficiente para el envío
КонецЕсли;Condiciones adjuntas
Dentro de cualquier bloque Если se pueden colocar otras estructuras condicionales. Esto se llama anidamiento. Le permite implementar una lógica paso a paso, donde cada nivel de verificación posterior depende del resultado del anterior.
// Verificación multinivel durante la ejecución del documento
Если Объект.Контрагент.Пустая() Тогда
Сообщить("No counterparty specified!");
Отказ = Истина;
Иначе
Если Объект.Контрагент.Заблокирован Тогда
Сообщить("Counterparty is blocked. Please contact your supervisor.");
Отказ = Истина;
Иначе
Если Объект.СуммаДокумента > Объект.Контрагент.КредитныйЛимит Тогда
Сообщить("Counterparty credit limit exceeded!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;Trate de no ir más allá de tres niveles de anidamiento. Si la lógica requiere más, realice comprobaciones en funciones separadas o use una «salida temprana» estableciendo la variable Отказ y regresando del procedimiento.
Operador ternario: construcción ?(…, …, …)
1C tiene una alternativa compacta a la construcción Si-No para casos simples cuando se necesita elegir uno de dos valores. Este es un operador ternario que se escribe con un signo de interrogación.
// Forma completa:
Если Контрагент.ОптовыйПокупатель Тогда
Приветствие = "Dear Partner,";
Иначе
Приветствие = "Dear Customer,";
КонецЕсли;
// Forma compacta a través del operador ternario:
Приветствие = ?(Контрагент.ОптовыйПокупатель, "Dear Partner,", "Dear Customer,");Sintaxis: ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). El operador ternario es útil para asignar valores a variables, formar cadenas y establecer parámetros. No lo uses para lógica compleja, esto empeora la legibilidad.

Escenarios empresariales reales
Consideremos algunas tareas típicas que enfrenta un desarrollador de 1C en su trabajo diario.
Escenario 1: Control de los remanentes durante el envío
Al realizar el documento "Venta de bienes", debe asegurarse de que haya suficientes bienes en el almacén. Si el saldo no es suficiente, bloquear la realización y mostrar un mensaje claro.
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Остаток = ПолучитьОстатокНаСкладе(СтрокаТЧ.Номенклатура, Объект.Склад);
Если СтрокаТЧ.Количество > Остаток Тогда
Сообщить("Not enough goods: "
+ СтрокаТЧ.Номенклатура
+ ". In stock: " + Остаток
+ ", required: " + СтрокаТЧ.Количество);
Отказ = Истина;
КонецЕсли;
КонецЦикла;Escenario 2: Cálculo automático de la tasa de IVA
Dependiendo del grupo de nomenclatura de los bienes, se sustituye automáticamente el tipo de IVA requerido. Esto evita que el gerente tenga que seleccionar manualmente y reduce la probabilidad de error.
Если Номенклатура.НоменклатурнаяГруппа = Группы.ДетскиеТовары
ИЛИ Номенклатура.НоменклатурнаяГруппа = Группы.Продовольствие Тогда
СтавкаНДС = Перечисления.СтавкиНДС.НДС10;
ИначеЕсли Номенклатура.НоменклатурнаяГруппа = Группы.Экспорт Тогда
СтавкаНДС = Перечисления.СтавкиНДС.НДС0;
ИначеЕсли Номенклатура.НоменклатурнаяГруппа = Группы.МедицинскиеИзделия Тогда
СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
Иначе
СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
КонецЕсли;Escenario 3: Delimitación de derechos durante la coordinación
Los documentos que superan una cierta cantidad requieren la aprobación del gerente. Los gerentes simples solo pueden enviar para su aprobación, y los gerentes pueden aprobar directamente.
ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
ЭтоРуководитель = ТекущийПользователь.Роль = Перечисления.Роли.Руководитель;
Если Объект.СуммаДокумента > 1000000 Тогда
Если ЭтоРуководитель Тогда
Объект.Статус = Перечисления.СтатусыДокументов.Утверждён;
Сообщить("The document is approved.");
Иначе
Объект.Статус = Перечисления.СтатусыДокументов.НаСогласовании;
Сообщить("The document has been sent to the manager for approval.");
КонецЕсли;
Иначе
Объект.Статус = Перечисления.СтатусыДокументов.Утверждён;
КонецЕсли;Escenario 4: Control de los plazos de pago
El sistema comprueba automáticamente los pagos atrasados y genera advertencias de diversos grados de criticidad.
ДнейПросрочки = (ТекущаяДата() - Объект.ДатаОплаты) / 86400;
Если ДнейПросрочки <= 0 Тогда
Статус = "On time";
ИначеЕсли ДнейПросрочки <= 7 Тогда
Статус = "A small delay";
ОтправитьНапоминание(Объект.Контрагент);
ИначеЕсли ДнейПросрочки <= 30 Тогда
Статус = "Critical overdue";
ОтправитьПретензию(Объект.Контрагент);
ЗаблокироватьОтгрузки(Объект.Контрагент);
Иначе
Статус = "Submitted to lawyers";
СоздатьЗадачуЮристу(Объект.Контрагент, ДнейПросрочки);
КонецЕсли;Errores típicos y cómo evitarlos
Error 1: Comparación con un enlace vacío
Los principiantes a menudo escriben Если Контрагент = "" Тогда, tratando de verificar la integridad de los detalles de la referencia. Esto es incorrecto: la cadena y el enlace son de diferentes tipos. Para comprobar si un enlace está vacío, utiliza el método Пустая() o la función ЗначениеЗаполнено().
// Incorrecto:
Если Объект.Контрагент = "" Тогда
// Correcto:
Если Объект.Контрагент.Пустая() Тогда
// También es correcto (versión universal):
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) ТогдаError 2: El «entonces» olvidado
A diferencia de la mayoría de los lenguajes de programación, en 1C la palabra clave Тогда siempre va después de la condición. Sin ella, la plataforma dará un error de sintaxis. Este es uno de los errores más comunes al cambiar de otros idiomas.
Error 3: Orden incorrecto en De lo contrario
Como ya se ha mencionado, el orden de las condiciones es de importancia crítica. La plataforma ejecuta la primera rama cuya condición es verdadera. Si ordenas las condiciones de leve a estricta, las ramas más específicas nunca funcionarán.
Error 4: Anidamiento excesivo
La anidación profunda dificulta la lectura y la depuración del código. Utilice el patrón de «salida temprana»: compruebe las condiciones no válidas al principio del procedimiento y salga inmediatamente a través de Возврат.
// Anidamiento profundo (malo):
Если УсловиеА Тогда
Если УсловиеБ Тогда
Если УсловиеВ Тогда
// código principal
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Salida temprana (bien):
Если НЕ УсловиеА Тогда
Возврат;
КонецЕсли;
Если НЕ УсловиеБ Тогда
Возврат;
КонецЕсли;
Если НЕ УсловиеВ Тогда
Возврат;
КонецЕсли;
// código principal — sin anidamientoCondiciones en el lenguaje de consulta 1C
Además del lenguaje integrado, las construcciones condicionales se utilizan activamente en el lenguaje de consulta 1C. Aquí se utiliza el operador ВЫБОР, similar a CASE en SQL.
ВЫБОР
КОГДА Продажи.Сумма >= 500000
ТОГДА "Large order"
КОГДА Продажи.Сумма >= 100000
ТОГДА "Average order"
ИНАЧЕ "Small order"
КОНЕЦ КАК КатегорияЗаказаEl operador ВЫБОР se puede utilizar en las secciones ВЫБРАТЬ, ГДЕ, УПОРЯДОЧИТЬ ПО e incluso en las condiciones de unión de tablas. Es una herramienta poderosa para la formación de campos calculados y el filtrado de datos a nivel de SGBD.
Conclusión
Las estructuras condicionales son una herramienta con la que trabajarás todos los días. Un simple Если-Тогда se convierte en complejos árboles de reglas comerciales que gestionan descuentos, derechos de acceso, rutas de aprobación y decenas de otros procesos. Lo principal es escribir las condiciones de forma clara, organizar las ramas en el orden correcto y no tener miedo de llevar la lógica compleja a funciones separadas. El código limpio con condiciones es un código que tus compañeros podrán leer y mantener durante meses y años.
Si estás empezando tu camino en el desarrollo o quieres profundizar tus conocimientos, la aplicación Kodik te ayudará a aprender programación desde cero. Cursos estructurados en Python, JavaScript, HTML, CSS, 1C y otras tecnologías, tareas prácticas y explicaciones claras, todo en un solo lugar. Descarga la aplicación Kodik en App Store y Google Play, y si tienes alguna pregunta, únete a nuestro canal de Telegram con soporte, donde más de 2000 desarrolladores ya están discutiendo código, compartiendo experiencias y ayudándose mutuamente. ¡Juntos es más fácil aprender!
