Загрузка данных
Глава 2.2. Цикл Для…Цикл — решения задач
Краткий конспект по циклу Для
Синтаксис
```1С
Для Счётчик = Начало По Конец Цикл
// операторы
КонецЦикла;
```
· Счётчик автоматически увеличивается на 1
· Начало должно быть ≤ Конца
· Операторы выполняются, пока счётчик в интервале
Управляющие операторы
Оператор Что делает
Прервать Полностью выходит из цикла
Продолжить Переходит к следующей итерации, пропуская остаток тела
Вложенные циклы
```1С
Для н = 1 По 3 Цикл
Для к = 1 По 2 Цикл
// выполнится 3 × 2 = 6 раз
КонецЦикла;
КонецЦикла;
```
---
Задача 1. Ряд x₁ + x₂² + x₃³ + ... для i = 1…10
Формула (восстановленная): сумма xᵢ в степени i, где x — какое-то число.
Проще: пусть x = 2, тогда сумма 2¹ + 2² + 2³ + … + 2¹⁰.
```1С
X = 2;
Сумма = 0;
Для i = 1 По 10 Цикл
Слагаемое = Pow(X, i);
Сумма = Сумма + Слагаемое;
Сообщить("i = " + i + ": " + X + "^" + i + " = " + Слагаемое);
КонецЦикла;
Сообщить("Сумма ряда: " + Сумма);
```
Если X вводится интерактивно:
```1С
X = 0;
ВвестиЧисло(X, "Введите X", 10, 2);
Сумма = 0;
Для i = 1 По 10 Цикл
Сумма = Сумма + Pow(X, i);
КонецЦикла;
Сообщить("Сумма: " + Сумма);
```
---
Задача 2. Ряд 1 / (20 − xᵢ − xᵢ²) для i = −10…10
Знаменатель может быть нулём — надо проверить и пропустить.
```1С
X = 2; // или вводится интерактивно
Для i = -10 По 10 Цикл
Знаменатель = 20 - X - Pow(X, 2); // ⚠️ тут X — не зависит от i, но пусть
// Если X зависит от i — то, например: Знаменатель = 20 - i - Pow(i, 2);
Если Знаменатель = 0 Тогда
Сообщить("i = " + i + ": знаменатель равен 0 — пропускаем");
Продолжить; // переход к следующей итерации
КонецЕсли;
Z = 1 / Знаменатель;
Сообщить("i = " + i + ": 1 / " + Знаменатель + " = " + Z);
КонецЦикла;
```
Вариант с xᵢ = i:
```1С
Для i = -10 По 10 Цикл
Xi = i;
Знаменатель = 20 - Xi - Pow(Xi, 2);
Если Знаменатель = 0 Тогда
Сообщить("i = " + i + ": знаменатель = 0, пропуск");
Продолжить;
КонецЕсли;
Сообщить("i = " + i + ": 1 / " + Знаменатель + " = " + (1 / Знаменатель));
КонецЦикла;
```
Пояснение: Продолжить вместо Прервать — потому что нам надо пропустить только одну итерацию, а не выходить из цикла.
---
Задача 3. Вывести каждый день месяца по введённой дате
```1С
ДатаВвед = Дата(1, 1, 1);
ВвестиДату(ДатаВвед, "Введите дату", ЧастьДаты.Дата);
НачМесяца = НачалоМесяца(ДатаВвед);
КонМесяца = КонецМесяца(ДатаВвед);
// Количество дней в месяце = разница в днях
ДнейВМесяце = (КонМесяца - НачМесяца) / 86400 + 1;
Для Д = 1 По ДнейВМесяце Цикл
ТекДата = Дата(Год(ДатаВвед), Месяц(ДатаВвед), Д);
Сообщить(Формат(ТекДата, "ДФ=""дд.ММ.гггг"""));
КонецЦикла;
```
Или проще — через День(КонецМесяца(ДатаВвед)):
```1С
ДнейВМесяце = День(КонецМесяца(ДатаВвед));
Для Д = 1 По ДнейВМесяце Цикл
ТекДата = Дата(Год(ДатаВвед), Месяц(ДатаВвед), Д);
Сообщить(Формат(ТекДата, "ДФ=""дд.ММ.гггг"""));
КонецЦикла;
```
---
Задача 4. Вывести названия дней недели для недели введённой даты
```1С
ДатаВвед = Дата(1, 1, 1);
ВвестиДату(ДатаВвед, "Введите дату", ЧастьДаты.Дата);
// Понедельник недели этой даты
Понедельник = НачалоНедели(ДатаВвед);
Для Сдвиг = 0 По 6 Цикл
ТекДата = Понедельник + Сдвиг * 86400;
НомерДня = ДеньНедели(ТекДата);
Если НомерДня = 1 Тогда
Название = "Понедельник";
ИначеЕсли НомерДня = 2 Тогда
Название = "Вторник";
ИначеЕсли НомерДня = 3 Тогда
Название = "Среда";
ИначеЕсли НомерДня = 4 Тогда
Название = "Четверг";
ИначеЕсли НомерДня = 5 Тогда
Название = "Пятница";
ИначеЕсли НомерДня = 6 Тогда
Название = "Суббота";
Иначе
Название = "Воскресенье";
КонецЕсли;
Сообщить(Формат(ТекДата, "ДФ=""дд.ММ.гггг""") + " — " + Название);
КонецЦикла;
```
---
Задача 5. Вывести все дни между двумя датами, кроме сб и вс
```1С
Дата1 = Дата(1, 1, 1);
Дата2 = Дата(1, 1, 1);
ВвестиДату(Дата1, "Введите первую дату", ЧастьДаты.Дата);
ВвестиДату(Дата2, "Введите вторую дату", ЧастьДаты.Дата);
Если Дата1 > Дата2 Тогда
Сообщить("Ошибка: первая дата должна быть раньше второй");
Иначе
Дней = (НачалоДня(Дата2) - НачалоДня(Дата1)) / 86400;
Для Сдвиг = 0 По Дней Цикл
ТекДата = Дата1 + Сдвиг * 86400;
НомерДня = ДеньНедели(ТекДата);
// Пропускаем субботу (6) и воскресенье (7)
Если НомерДня = 6 ИЛИ НомерДня = 7 Тогда
Продолжить;
КонецЕсли;
Сообщить(Формат(ТекДата, "ДФ=""дд.ММ.гггг""") + " — " + НомерДня);
КонецЦикла;
КонецЕсли;
```
---
Задача 6. Вывести 12 месяцев через Формат
```1С
Для М = 1 По 12 Цикл
ДемоДата = Дата(2026, М, 1); // год любой
Сообщить(Формат(ДемоДата, "ДФ=""ММММ"""));
КонецЦикла;
```
Результат:
```
январь
февраль
март
...
декабрь
```
С номерами:
```1С
Для М = 1 По 12 Цикл
ДемоДата = Дата(2026, М, 1);
Сообщить(Формат(М, "ЧЦ=2; ЧН=") + " — " + Формат(ДемоДата, "ДФ=""ММММ"""));
КонецЦикла;
```
Или проще:
```1С
Для М = 1 По 12 Цикл
ДемоДата = Дата(2026, М, 1);
Сообщить(М + " — " + Формат(ДемоДата, "ДФ=""ММММ"""));
КонецЦикла;
```
---
Задача 7. Многострочная строка → вывод построчно
```1С
Текст = "";
ВвестиСтроку(Текст, "Введите многострочный текст", 0, Истина);
КолСтрок = СтрЧислоСтрок(Текст);
Для Сч = 1 По КолСтрок Цикл
Стр = СтрПолучитьСтроку(Текст, Сч);
Сообщить("Строка " + Сч + ": " + Стр);
КонецЦикла;
```
---
Задача 8. Предложение → вывод каждого слова отдельно
Логика: заменяем пробелы на переносы строк, получаем многострочную строку, выводим каждую строку.
```1С
Предложение = "";
ВвестиСтроку(Предложение, "Введите предложение", 200);
Предложение = СокрЛП(Предложение);
// Убираем двойные пробелы
Пока Найти(Предложение, " ") > 0 Цикл
Предложение = СтрЗаменить(Предложение, " ", " ");
КонецЦикла;
// Заменяем пробелы на переносы строк
Предложение = СтрЗаменить(Предложение, " ", Символы.ПС);
КолСлов = СтрЧислоСтрок(Предложение);
Для Сч = 1 По КолСлов Цикл
Слово = СокрЛП(СтрПолучитьСтроку(Предложение, Сч));
Если НЕ ПустаяСтрока(Слово) Тогда
Сообщить("Слово " + Сч + ": " + Слово);
КонецЕсли;
КонецЦикла;
```
Без цикла Пока (если запрещено — как в предыдущих задачах):
```1С
Предложение = СокрЛП(Предложение);
Предложение = СтрЗаменить(Предложение, " ", " ");
Предложение = СтрЗаменить(Предложение, " ", " "); // второй раз на всякий случай
Предложение = СтрЗаменить(Предложение, " ", Символы.ПС);
Для Сч = 1 По СтрЧислоСтрок(Предложение) Цикл
Слово = СокрЛП(СтрПолучитьСтроку(Предложение, Сч));
Если НЕ ПустаяСтрока(Слово) Тогда
Сообщить(Слово);
КонецЕсли;
КонецЦикла;
```
---
Ключевые приёмы раздела
Приём Где применяется
Для i = A По B Цикл … КонецЦикла Все задачи
Продолжить — пропустить итерацию Задачи 2, 5, 8
Прервать — выйти из цикла (когда встретится)
Pow(X, N) — степень Задачи 1, 2
Работа с датами: + 86400 = +1 день Задачи 3, 4, 5
ДеньНедели(Дата) — номер дня недели Задачи 4, 5
СтрЧислоСтрок + СтрПолучитьСтроку Задачи 7, 8
СтрЗаменить(…, " ", Символы.ПС) — разбить на слова Задача 8
Важные моменты
1. Прервать vs Продолжить:
· Прервать — выход из всего цикла
· Продолжить — пропуск остатка текущей итерации
2. Даты в цикле: Дата + 86400 = следующий день (секунд в сутках)
3. ДеньНедели возвращает: 1 = понедельник, …, 7 = воскресенье
4. Счётчик цикла увеличивается на 1 автоматически, менять его вручную внутри цикла нельзя
5. Разбить предложение на слова — трюк: заменить пробелы на Символы.ПС, затем выводить через СтрПолучитьСтроку