Загрузка данных
Глава 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. ПустаяСтрока — для проверки «пустой» строки (пробелы тоже считаются пустой)