Здравствуйте всем! Я начинающий 1сник, прошу помочь решить задачу. Сижу уже часов 7, по всякому пробовал, и мозг уже отказывается находить ошибку. Ниже прилагаю условие задачи и код, который я родил, но в нём где-то ошибка...
Задача.
Напишите функцию ДобавитьРабочийДень(ДатаНачала,КоличествоРабочихДней), данная
функция добавляет рабочие дни (с 1 по 5 день недели, праздники учитывать не будем), и
возвращает дату. ДатаНачала изменяться не должна. КоличествоРабочихДней –
необязательный параметр, по умолчанию равен 0.
Моя попытка решения.
Задача.
Напишите функцию ДобавитьРабочийДень(ДатаНачала,КоличествоРабочихДней), данная
функция добавляет рабочие дни (с 1 по 5 день недели, праздники учитывать не будем), и
возвращает дату. ДатаНачала изменяться не должна. КоличествоРабочихДней –
необязательный параметр, по умолчанию равен 0.
Моя попытка решения.
&НаКлиенте
Функция ДобавитьРабочийДень(ДатаНачала,КоличествоРабочихДней)
ДатаОкончания=ДатаНачала+(86400*КоличествоРабочихДней);
СписокДат = Новый Массив;
Дата=ДатаНачала;
Пока Дата<ДатаОкончания Цикл
СписокДат.Добавить(Дата);
Дата = Дата + 86400;
КонецЦикла;
КоличествоВыхДнейВПериоде=0;
Для Каждого ЭлМассива из СписокДат Цикл
Если ДеньНедели(ЭлМассива)>5 Тогда
КоличествоВыхДнейВПериоде=КоличествоВыхДнейВПериоде+1;
КонецЕсли;
КонецЦикла;
НужнаяДата=ДатаОкончания+(КоличествоВыхДнейВПериоде*86400);
Сообщить("Конечная дата рабочего периода - "+Формат(НужнаяДата,"ДФ=dd.MM.yyyy"));
КонецФункции
&НаКлиенте
Процедура Команда(Команда)
Перем ДатаНачала,КоличествоРабочихДней;
Если ВвестиДату(ДатаНачала,"Введите дату начала работы",ЧастиДаты.Дата) Тогда
Если ВвестиЧисло(КоличествоРабочихДней,"Введите количество дней для добавления") Тогда
ДобавитьРабочийДень(ДатаНачала,КоличествоРабочихДней)
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ПоказатьПо теме из базы знаний
Найденные решения
(3)
Берешь счетчик накопленых рабочих дней, обнуляешь. Берешь дату, инициализируешь ее следующим от началом периода днем. Смотришь - если эта дата указывает на рабочий день, то прибавляешь к счетчику рабочих дней единицу. Если счетчик рабочих дней достиг нужного количества, то принимаешь поздравления - дата указывает на искомый конец периода. Если не достиг - сдвигаешь дату на день вперед, и опять проверяешь полученное на рабочий день, прибавляешь к счетчику... и так пока нужное количество рабочих дней не наберешь.
И добавляю это количество выходных дней к ДатеОкончания чтобы увеличить рабочий период
Выброси.
Берешь счетчик накопленых рабочих дней, обнуляешь. Берешь дату, инициализируешь ее следующим от началом периода днем. Смотришь - если эта дата указывает на рабочий день, то прибавляешь к счетчику рабочих дней единицу. Если счетчик рабочих дней достиг нужного количества, то принимаешь поздравления - дата указывает на искомый конец периода. Если не достиг - сдвигаешь дату на день вперед, и опять проверяешь полученное на рабочий день, прибавляешь к счетчику... и так пока нужное количество рабочих дней не наберешь.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Я пытаюсь наполнить массив датами; датами каждого дня начиная с ДатыНачала, заканчивая ДатойОкончания(ДатаНачала+КоличествоРабочихДней).
Потом я проверяю и считаю сколько выходных дней в датах массива.
И добавляю это количество выходных дней к ДатеОкончания чтобы увеличить рабочий период.
Кстати, я только что понял, что нужно ещё проверку делать на добавляемые дни, так они тоже будут увеличивать рабочий период вместе с выходными, а это неправильно...
СписокДат = Новый Массив;
Дата=ДатаНачала;
Пока Дата<ДатаОкончания Цикл
СписокДат.Добавить(Дата);
Дата = Дата + 86400;
КонецЦикла;
Потом я проверяю и считаю сколько выходных дней в датах массива.
КоличествоВыхДнейВПериоде=0;
Для Каждого ЭлМассива из СписокДат Цикл
Если ДеньНедели(ЭлМассива)>5 Тогда
КоличествоВыхДнейВПериоде=КоличествоВыхДнейВПериоде+1;
КонецЕсли;
КонецЦикла;
ПоказатьИ добавляю это количество выходных дней к ДатеОкончания чтобы увеличить рабочий период.
НужнаяДата=ДатаОкончания+(КоличествоВыхДнейВПериоде*86400);
Кстати, я только что понял, что нужно ещё проверку делать на добавляемые дни, так они тоже будут увеличивать рабочий период вместе с выходными, а это неправильно...
(3)
Берешь счетчик накопленых рабочих дней, обнуляешь. Берешь дату, инициализируешь ее следующим от началом периода днем. Смотришь - если эта дата указывает на рабочий день, то прибавляешь к счетчику рабочих дней единицу. Если счетчик рабочих дней достиг нужного количества, то принимаешь поздравления - дата указывает на искомый конец периода. Если не достиг - сдвигаешь дату на день вперед, и опять проверяешь полученное на рабочий день, прибавляешь к счетчику... и так пока нужное количество рабочих дней не наберешь.
И добавляю это количество выходных дней к ДатеОкончания чтобы увеличить рабочий период
Выброси.
Берешь счетчик накопленых рабочих дней, обнуляешь. Берешь дату, инициализируешь ее следующим от началом периода днем. Смотришь - если эта дата указывает на рабочий день, то прибавляешь к счетчику рабочих дней единицу. Если счетчик рабочих дней достиг нужного количества, то принимаешь поздравления - дата указывает на искомый конец периода. Если не достиг - сдвигаешь дату на день вперед, и опять проверяешь полученное на рабочий день, прибавляешь к счетчику... и так пока нужное количество рабочих дней не наберешь.
(4) Получилось. Спасибо.
&НаКлиенте
Функция ДобавитьРабочийДень(ДатаНачала, КоличествоРабочихДней)
Дата=ДатаНачала;
КоличествоДобавленныхРабочихДней=0;
Пока КоличествоДобавленныхРабочихДней<КоличествоРабочихДней Цикл
Дата=Дата+86400;
Если ДеньНедели(Дата)<=5 Тогда
КоличествоДобавленныхРабочихДней=КоличествоДобавленныхРабочи хДней+1;
КонецЕсли;
КонецЦикла;
Сообщить("Конечная дата рабочего периода - " + Формат(Дата, "ДФ=dd.MM.yyyy"));
КонецФункции
Показать
(4) - решение в лоб.
А не в лоб берешь текущий номер дня в неделе начиная с нуля, добавляешь количество рабочих дней, делишь нацело на 5 и умножаешь на 2. Получаешь количество пропущенных выходных, дальше просто. Если стартовая дата суббота или воскресенье, нужно вернуться на пятницу, чтоб правильно считало. Оно быстрее получится, но для практических целей (4) сойдет, плюс оно проще и понятнее.
А не в лоб берешь текущий номер дня в неделе начиная с нуля, добавляешь количество рабочих дней, делишь нацело на 5 и умножаешь на 2. Получаешь количество пропущенных выходных, дальше просто. Если стартовая дата суббота или воскресенье, нужно вернуться на пятницу, чтоб правильно считало. Оно быстрее получится, но для практических целей (4) сойдет, плюс оно проще и понятнее.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот