Найти последний день месяца и второе воскресенье

Учебные задачи

Разбираем отрицательный номер дня и номер вхождения дня недели на сентябре 2026 года.

Где и как запускать

Полный модуль собственной управляемой формы, расчёт на сервере.

Подготовка

  1. Собственная пустая конфигурация УчебнаяКонфигурацияСинтаксиса 8.5.1.1343. Создайте внешнюю обработку с управляемой формой, командой Выполнить и её кнопкой; вставьте полный модуль урока в форму.

  2. ТребуетсяВыполнение доступен серверу, толстому клиенту и внешнему соединению. Поэтому здесь тонкий клиент получает результат отдельной серверной функции.

  3. Расписание создаётся только в памяти. Регламентное задание не создаётся, не записывается и не запускается; действующие расписания базы не читаются и не меняются.

  4. Все даты проверки заданы явно. Вызов без даты зависит от текущего времени и для этих воспроизводимых проверок не используется.

&НаКлиенте
Процедура Выполнить(Команда)
    Сообщить(ПроверитьУчебноеРасписание());
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроверитьУчебноеРасписание()
    Отчет = Новый Массив;
    КонецМесяца = Новый РасписаниеРегламентногоЗадания;
    КонецМесяца.ДеньВМесяце = -1;
    Отчет.Добавить(Строка(КонецМесяца.ДеньВМесяце = -1));
    Отчет.Добавить(Строка(КонецМесяца.ТребуетсяВыполнение(Дата(2026, 9, 30, 12, 0, 0))));
    Отчет.Добавить(Строка(НЕ КонецМесяца.ТребуетсяВыполнение(Дата(2026, 9, 29, 12, 0, 0))));
    Отчет.Добавить(Строка(КонецМесяца.ТребуетсяВыполнение(Дата(2026, 2, 28, 12, 0, 0))));
    ВтороеВоскресенье = Новый РасписаниеРегламентногоЗадания;
    ВтороеВоскресенье.ДеньНеделиВМесяце = 2;
    Дни = Новый Массив;
    Дни.Добавить(7);
    ВтороеВоскресенье.ДниНедели = Дни;
    Отчет.Добавить(Строка(ВтороеВоскресенье.ДеньНеделиВМесяце = 2));
    Отчет.Добавить(Строка(ВтороеВоскресенье.ТребуетсяВыполнение(Дата(2026, 9, 13, 12, 0, 0))));
    Отчет.Добавить(Строка(НЕ ВтороеВоскресенье.ТребуетсяВыполнение(Дата(2026, 9, 6, 12, 0, 0))));
    Отчет.Добавить(Строка(НЕ ВтороеВоскресенье.ТребуетсяВыполнение(Дата(2026, 9, 20, 12, 0, 0))));
    Возврат СтрСоединить(Отчет, Символы.ПС);
КонецФункции

Разбор по шагам

  1. ДеньВМесяце=-1 отсчитывается от конца месяца: в сентябре это 30-е, в феврале 2026 — 28-е. Не фиксируем 31 для всех месяцев.

  2. ДеньНеделиВМесяце=2 — второе вхождение выбранного дня недели, а не вторник. Воскресенье задаётся отдельным массивом ДниНедели=[7].

  3. В сентябре 2026 воскресенья приходятся на 6, 13, 20 и 27 числа; поэтому второе — 13-е.

  4. Два правила находятся в разных объектах. Урок не обещает смысл одновременного смешения календарных ограничений.

Как проверить результат

  1. Восемь строк ожидаются Истина. Первая группа проверяет конец месяца, вторая — второе воскресенье.

  2. Для самостоятельной проверки задайте ДеньНеделиВМесяце=-1 и сравните 27 и 20 сентября: отсчёт будет от конца месяца.

Ожидаемый результат

На проверяемом календаре показаны два разных вида номера дня в месяце.

На что обратить внимание

  1. Не путать номер дня недели с номером его вхождения.

  2. Дата 31 февраля недопустима; последний день определяется календарём, не строковой подстановкой.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.