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


Задачи 6–8. Полные коды

---

Задача 6. Функция ДобавитьРабочийДень

Условие: функция добавляет N рабочих дней (Пн–Пт, без праздников). ДатаНачала не меняется. КоличествоРабочихДней — необязательный, по умолчанию 0.

```1С
Функция ДобавитьРабочийДень(Знач ДатаНачала, КоличествоРабочихДней = 0)
    ТекДата = ДатаНачала;
    Добавлено = 0;
    
    Пока Добавлено < КоличествоРабочихДней Цикл
        ТекДата = ТекДата + 86400;   // +1 день
        НомерДня = ДеньНедели(ТекДата);
        
        // Рабочие дни — с 1 по 5 (Пн–Пт)
        Если НомерДня >= 1 И НомерДня <= 5 Тогда
            Добавлено = Добавлено + 1;
        КонецЕсли;
    КонецЦикла;
    
    Возврат ТекДата;
КонецФункции

// Основной код
Дата1 = Дата(1, 1, 1);
ВвестиДату(Дата1, "Введите дату начала", ЧастьДаты.Дата);
Кол = 0;
ВвестиЧисло(Кол, "Введите количество рабочих дней", 5, 0);

Результат = ДобавитьРабочийДень(Дата1, Кол);

Ф = "ДФ=""дд.ММ.гггг""";
Сообщить("Начало: " + Формат(Дата1, Ф));
Сообщить("Результат: " + Формат(Результат, Ф));
```

Пример: пятница 12.10.2012 + 2 рабочих дня:

· Сб 13 → пропуск
· Вс 14 → пропуск
· Пн 15 → +1
· Вт 16 → +1

Результат: 16.10.2012

Ключевое: Знач ДатаНачала — исходная дата не меняется.

---

Задача 7. Функция ДобавитьКоличествоРабочихЧасов

Условие:

· Рабочий день = 8 часов
· Время работы: 8:00 – 17:00 (9 часов минус 1 час обеда = 8 рабочих часов)
· Дата должна быть рабочая (Пн–Пт), иначе возвращаем эту же дату
· КоличествоЧасов по умолчанию = 1
· ДатаНачала не меняется

Примеры:

· 13.02.2012 10:00 + 5 = 13.02.2012 15:00
· 13.02.2012 10:00 + 10 = 14.02.2012 11:00

```1С
Функция ДобавитьКоличествоРабочихЧасов(Знач ДатаНачала, КоличествоЧасов = 1)
    // Проверка: рабочий день?
    НомерДня = ДеньНедели(ДатаНачала);
    Если НомерДня < 1 ИЛИ НомерДня > 5 Тогда
        Возврат ДатаНачала;
    КонецЕсли;
    
    // Проверка: время от 8:00 до 17:00?
    Ч = Час(ДатаНачала);
    Если Ч < 8 ИЛИ Ч >= 17 Тогда
        Возврат ДатаНачала;
    КонецЕсли;
    
    ТекДата = ДатаНачала;
    Осталось = КоличествоЧасов;
    
    Пока Осталось > 0 Цикл
        КонецРабДня = НачалоДня(ТекДата) + 17 * 3600;   // 17:00
        ЧасовДоКонца = (КонецРабДня - ТекДата) / 3600;
        
        Если Осталось <= ЧасовДоКонца Тогда
            ТекДата = ТекДата + Осталось * 3600;
            Осталось = 0;
        Иначе
            Осталось = Осталось - ЧасовДоКонца;
            
            // Следующий рабочий день
            ТекДата = НачалоДня(ТекДата) + 86400;
            Пока ДеньНедели(ТекДата) > 5 Цикл
                ТекДата = ТекДата + 86400;
            КонецЦикла;
            
            ТекДата = ТекДата + 8 * 3600;   // начинаем в 8:00
        КонецЕсли;
    КонецЦикла;
    
    Возврат ТекДата;
КонецФункции

// Основной код
Д = Дата(2012, 2, 13, 10, 0, 0);
Ч = 0;
ВвестиЧисло(Ч, "Введите количество часов", 5, 0);

Рез = ДобавитьКоличествоРабочихЧасов(Д, Ч);

Ф = "ДФ=""дд.ММ.гггг ЧЧ:мм""";
Сообщить("Начало: " + Формат(Д, Ф));
Сообщить("Результат: " + Формат(Рез, Ф));
```

Проверка:

10:00 + 5 ч:

· До 17:00 — 7 часов
· 5 ≤ 7 → добавляем 5 → 15:00 ✅

10:00 + 10 ч:

· До 17:00 — 7 часов
· 10 > 7 → забираем 7, остаток 3
· Переходим на 14.02.2012 (вт) 08:00
· Добавляем 3 → 11:00 ✅

---

Задача 8. Вывод списка дат вокруг введённой

Условие: ввести дату (например, 10.01.12). Вывести:

```
05.01.12
07.01.12
10.01.12
13.01.12
15.01.12
```

Логика: от введённой даты отнимаем/прибавляем −5, −3, 0, +3, +5 дней.

```1С
Процедура ВывестиДаты(ДатаВвед)
    Сдвиги = Новый Массив;
    Сдвиги.Добавить(-5);
    Сдвиги.Добавить(-3);
    Сдвиги.Добавить(0);
    Сдвиги.Добавить(3);
    Сдвиги.Добавить(5);
    
    Для Каждого Сдвиг Из Сдвиги Цикл
        ТекДата = ДатаВвед + Сдвиг * 86400;
        Сообщить(Формат(ТекДата, "ДФ=""дд.ММ.гг"""));
    КонецЦикла;
КонецПроцедуры

// Основной код
Д = Дата(1, 1, 1);
ВвестиДату(Д, "Введите дату", ЧастьДаты.Дата);
ВывестиДаты(Д);
```

Результат для 10.01.12:

```
05.01.12
07.01.12
10.01.12
13.01.12
15.01.12
```

✅ Совпадает.

---

Ключевые приёмы в задачах 6–8

Приём Где
Функция … Возврат … КонецФункции Задачи 6, 7
Процедура … КонецПроцедуры Задача 8
Знач — передача по значению Задачи 6, 7
Параметр = ЗначениеПоУмолчанию Задачи 6, 7
ДеньНедели(Дата) Задачи 6, 7
+ 86400 — +1 день Задачи 6, 7, 8
+ 3600 — +1 час Задача 7
Формат(Дата, "ДФ=""…""") Задачи 6, 7, 8
Массив сдвигов Задача 8

Что важно

1. Знач — дата не меняется в основном коде
2. ДеньНедели — 1=Пн … 7=Вс; рабочие 1–5
3. + 86400 — прибавление дня; + 3600 — часа
4. Задача 8 — просто массив сдвигов [-5, -3, 0, 3, 5]
5. Формат дд.ММ.гг — 05.01.12 (две цифры года)