Загрузка данных
Задачи 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 (две цифры года)