Загрузка данных


Глава 2.1. Условие Если…Тогда…ИначеЕсли — решения задач

Краткий конспект по операторам

1. Полная форма Если

```1С
Если <Условие1> Тогда
    // ...
ИначеЕсли <Условие2> Тогда
    // ...
Иначе
    // ...
КонецЕсли;
```

2. Тернарный оператор ?(…)

```1С
Результат = ?(<Условие>, <ЕслиИстина>, <ЕслиЛожь>);
```

3. Правила

· ИначеЕсли может быть сколько угодно
· Иначе — один и в конце
· Условия проверяются сверху вниз, сработает первое истинное
· Булевы переменные не сравнивают с = Истина: пишут Если Флаг Тогда / Если Не Флаг Тогда

---

Задача 1. Z = X − Y или X + Y

Введите X, Y. Вычислите Z = X − Y, если X > Y. Z = X + Y, если X >= Y.

⚠️ Условия пересекаются: если X > Y, то и X >= Y — но первое сработает раньше. Значит, при X > Y будет вычитание, а при X = Y — сложение.

```1С
X = 0; Y = 0;
ВвестиЧисло(X, "Введите X", 10, 2);
ВвестиЧисло(Y, "Введите Y", 10, 2);

Если X > Y Тогда
    Z = X - Y;
ИначеЕсли X >= Y Тогда
    Z = X + Y;
Иначе
    Z = X + Y;   // X < Y → тоже сложение (по смыслу)
КонецЕсли;

Сообщить("X = " + X + ", Y = " + Y + ", Z = " + Z);
```

Проще — через ?(…):

```1С
Z = ?(X > Y, X - Y, X + Y);
```

---

Задача 2. Деление с защитой от нуля

```1С
X = 0; Y = 0;
ВвестиЧисло(X, "Введите X", 10, 2);
ВвестиЧисло(Y, "Введите Y", 10, 2);

Если Y = 0 Тогда
    Сообщить("Деление на 0 невозможно!");
Иначе
    Z = X / Y;
    Сообщить("Z = " + Z);
КонецЕсли;
```

⚠️ Нельзя ?(Y = 0, 0, X / Y) — обе ветки вычисляются, деление на ноль вызовет ошибку.

---

Задача 3. Проверка на целое

Число целое, если его целая часть равна самому числу:

```
Цел(5.0) = 5   → 5 = 5  → целое
Цел(5.3) = 5   → 5 ≠ 5.3 → дробное
```

```1С
Число = 0;
ВвестиЧисло(Число, "Введите число", 10, 3);

Если Число = Цел(Число) Тогда
    Сообщить(Число + " — целое число");
Иначе
    Сообщить(Число + " — дробное число");
КонецЕсли;
```

Через ?(…):

```1С
Сообщить(Число + ?(Число = Цел(Число), " — целое", " — дробное"));
```

---

Задача 4. Z = ((B + C) / (F * G)) * (D - E)

D, E — константы в модуле. Остальные — интерактивно. Обработать все ошибки.

```1С
D = 10;
E = 5;

B = 0; C = 0; F = 0; G = 0;
ВвестиЧисло(B, "Введите B", 10, 2);
ВвестиЧисло(C, "Введите C", 10, 2);
ВвестиЧисло(F, "Введите F", 10, 2);
ВвестиЧисло(G, "Введите G", 10, 2);

Если F * G = 0 Тогда
    Сообщить("Ошибка: знаменатель (F * G) равен нулю");
Иначе
    Z = ((B + C) / (F * G)) * (D - E);
    Сообщить("Z = " + Z);
КонецЕсли;
```

Проверки, которые нужно обработать:

· F * G = 0 → деление на ноль
· больше ошибок тут нет — остальные операции всегда безопасны

---

Задача 5. Z = A / (5 + A / 2 + B / 4)

```1С
A = 0; B = 0;
ВвестиЧисло(A, "Введите A", 10, 2);
ВвестиЧисло(B, "Введите B", 10, 2);

Знаменатель = 5 + A / 2 + B / 4;

Если Знаменатель = 0 Тогда
    Сообщить("Ошибка: знаменатель равен нулю");
Иначе
    Z = A / Знаменатель;
    Сообщить("Z = " + Z);
КонецЕсли;
```

---

Задача 6. Определение региона по номеру

Номер вида хн344яRU63. Код региона — последние 2–3 цифры.

⚠️ Проблема: как отличить, где 2 цифры, а где 3? Например, ...RU763 — это регион 763 или 63?
По условию: «последние две цифры определяют регион» — значит, берём последние 2:

```1С
Номер = "";
ВвестиСтроку(Номер, "Введите номер", 20);
Номер = СокрЛП(Номер);

КодРегиона = Прав(Номер, 2);

// Список известных регионов
Если КодРегиона = "63" Тогда
    Сообщить("Регион: Самарская область");
ИначеЕсли КодРегиона = "77" Тогда
    Сообщить("Регион: Москва");
ИначеЕсли КодРегиона = "78" Тогда
    Сообщить("Регион: Санкт-Петербург");
ИначеЕсли КодРегиона = "02" Тогда
    Сообщить("Регион: Республика Башкортостан");
ИначеЕсли КодРегиона = "23" Тогда
    Сообщить("Регион: Краснодарский край");
Иначе
    Сообщить("Регион неизвестен (код " + КодРегиона + ")");
КонецЕсли;
```

---

Задача 7. Адрес с заменой пустых полей на ---

```1С
Город = ""; Улица = ""; Дом = ""; Квартира = "";
ВвестиСтроку(Город, "Введите город", 50);
ВвестиСтроку(Улица, "Введите улицу", 50);
ВвестиСтроку(Дом, "Введите дом", 10);
ВвестиСтроку(Квартира, "Введите квартиру", 10);

// Заменяем пустые на "---"
Город     = ?(ПустаяСтрока(СокрЛП(Город)),     "---", СокрЛП(Город));
Улица     = ?(ПустаяСтрока(СокрЛП(Улица)),     "---", СокрЛП(Улица));
Дом       = ?(ПустаяСтрока(СокрЛП(Дом)),       "---", СокрЛП(Дом));
Квартира  = ?(ПустаяСтрока(СокрЛП(Квартира)),  "---", СокрЛП(Квартира));

Сообщить("г. " + Город + ", ул. " + Улица + ", д. " + Дом + ", кв. " + Квартира);
```

Пример вывода при пустых улице и квартире:

```
г. Москва, ул. ---, д. 98, кв. ---
```

---

Задача 8. ФИО в разном регистре по введённому числу

```1С
ФИО = "Иванов Петр Васильевич";   // зададим константой или введём интерактивно
Число = 0;
ВвестиЧисло(Число, "Введите число от 0 до 9", 1, 0);

Если Число = 1 Тогда
    Сообщить(ВРег(ФИО));
ИначеЕсли Число = 2 Тогда
    Сообщить(НРег(ФИО));
ИначеЕсли Число = 3 Тогда
    Сообщить(ТРег(НРег(ФИО)));
Иначе
    // Только фамилия — всё до первого пробела
    Поз = Найти(ФИО, " ");
    Сообщить(?(Поз > 0, Лев(ФИО, Поз - 1), ФИО));
КонецЕсли;
```

Примеры:

Ввод Вывод
1 ИВАНОВ ПЕТР ВАСИЛЬЕВИЧ
2 иванов петр васильевич
3 Иванов Петр Васильевич
5 Иванов

---

Задача 9. Расчёт зарплаты с переработкой

Условия:

· Норма: с 8:00 до 17:00 = 8 рабочих часов (9 часов минус 1 час обеда)
· Ставка: 100 ₽/час
· Первые 2 сверхурочных часа — ×1.5
· Последующие часы — ×2
· Обед 1 час не оплачивается

```1С
Начало = Дата(1, 1, 1);
Конец  = Дата(1, 1, 1);
ВвестиДату(Начало, "Введите начало рабочего дня", ЧастьДаты.Время);
ВвестиДату(Конец,  "Введите конец рабочего дня",  ЧастьДаты.Время);

// Всего часов на работе
ВсегоЧасов = (Конец - Начало) / 3600;

// Рабочих часов (минус час обеда)
РабЧасов = ВсегоЧасов - 1;

Норма = 8;
Ставка = 100;

Если РабЧасов <= Норма Тогда
    ЗП = РабЧасов * Ставка;
Иначе
    Переработка = РабЧасов - Норма;
    
    Если Переработка <= 2 Тогда
        // Первые 2 часа по ×1.5
        ЗП = Норма * Ставка + Переработка * Ставка * 1.5;
    Иначе
        // Первые 2 по ×1.5, остальные по ×2
        ЗП = Норма * Ставка
           + 2 * Ставка * 1.5
           + (Переработка - 2) * Ставка * 2;
    КонецЕсли;
КонецЕсли;

Сообщить("Отработано часов: " + РабЧасов);
Сообщить("Зарплата за день: " + ЗП + " руб.");
```

Пример для 8:00–20:00:

· Всего: 12 часов
· Рабочих: 11 часов
· Переработка: 3 часа
· ЗП = 8×100 + 2×100×1.5 + 1×100×2 = 800 + 300 + 200 = 1300 руб.

---

Задача 10. Сравнение двух дат

```1С
Д1 = Дата(1, 1, 1);
Д2 = Дата(1, 1, 1);
ВвестиДату(Д1, "Введите первую дату", ЧастьДаты.Дата);
ВвестиДату(Д2, "Введите вторую дату", ЧастьДаты.Дата);

// а) одна неделя?
Если НачалоНедели(Д1) = НачалоНедели(Д2) Тогда
    Сообщить("Даты внутри одной недели");
КонецЕсли;

// б) один месяц?
Если Год(Д1) = Год(Д2) И Месяц(Д1) = Месяц(Д2) Тогда
    Сообщить("Даты внутри одного месяца");
КонецЕсли;

// в) один год?
Если Год(Д1) = Год(Д2) Тогда
    Сообщить("Даты внутри одного года");
КонецЕсли;

// г) разные годы?
Если Год(Д1) <> Год(Д2) Тогда
    Сообщить("Даты принадлежат к разным годам");
КонецЕсли;
```

Альтернатива — через НачалоМесяца / НачалоГода:

```1С
Если НачалоГода(Д1) = НачалоГода(Д2) Тогда
    Сообщить("Даты внутри одного года");
КонецЕсли;

Если НачалоМесяца(Д1) = НачалоМесяца(Д2) Тогда
    Сообщить("Даты внутри одного месяца");
КонецЕсли;
```

---

Ключевые приёмы раздела

Приём Пример Где
Если … ИначеЕсли … Иначе Много вариантов Задачи 6, 8, 9
?(…) — тернарный оператор 2 варианта, короткая запись Задачи 1, 3, 7
Защита от деления на ноль Если Y = 0 Тогда … Задачи 2, 4, 5
ПустаяСтрока Проверка пустого ввода Задача 7
Цел(Число) = Число Проверка на целое Задача 3
ВРег / НРег / ТРег Смена регистра Задача 8
НачалоНедели / НачалоМесяца / НачалоГода Сравнение периодов Задача 10
Арифметика с датами (Конец - Начало) / 3600 Задача 9

Важно запомнить

1. Условия проверяются сверху вниз — сработает первое истинное, остальные пропускаются
2. Иначе — всегда один и в конце
3. ?(…) не защищает от деления на ноль — обе ветки вычисляются всегда
4. Булевы переменные не сравнивают с = Истина: пишут Если Флаг Тогда
5. ПустаяСтрока — для проверки «пустой» строки (пробелы тоже считаются пустой)