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


Глава 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. Разбить предложение на слова — трюк: заменить пробелы на Символы.ПС, затем выводить через СтрПолучитьСтроку