Срок: прибавить календарные дни и проверить разницу дат

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

Для своей учебной заявки вычисляем срок через четыре дня, перенос назад, два месяца и десятидневный интервал. Проверяем календарную разницу и явно не называем её рабочими днями.

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

Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.

Процедура ВыполнитьПример() Экспорт
    ДатаЗаявки = Дата(2026, 10, 6, 12, 30, 0);
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ДОБАВИТЬКДАТЕ(&ДатаЗаявки, ДЕНЬ, 4.9) КАК Срок,
    |    ДОБАВИТЬКДАТЕ(&ДатаЗаявки, ДЕНЬ, -1) КАК ПредыдущийДень,
    |    ДОБАВИТЬКДАТЕ(&ДатаЗаявки, МЕСЯЦ, 2) КАК ЧерезДваМесяца,
    |    ДОБАВИТЬКДАТЕ(&ДатаЗаявки, ДЕКАДА, 1) КАК ЧерезДесятьДней,
    |    РАЗНОСТЬДАТ(&ДатаЗаявки, ДОБАВИТЬКДАТЕ(&ДатаЗаявки, ДЕНЬ, 4), ДЕНЬ) КАК КалендарныхДней,
    |    РАЗНОСТЬДАТ(&ДатаЗаявки, ДОБАВИТЬКДАТЕ(&ДатаЗаявки, ДЕНЬ, 4), СЕКУНДА) КАК Секунд,
    |    РАЗНОСТЬДАТ(&ДатаЗаявки, ДОБАВИТЬКДАТЕ(&ДатаЗаявки, МЕСЯЦ, 2), МЕСЯЦ) КАК КалендарныхМесяцев,
    |    РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(&ДатаЗаявки, ДЕНЬ, 4), &ДатаЗаявки, ДЕНЬ) КАК ОбратнаяРазница";
    Запрос.УстановитьПараметр("ДатаЗаявки", ДатаЗаявки);
    Таблица = Запрос.Выполнить().Выгрузить();
    Если Таблица.Количество() <> 1 Тогда
        ВызватьИсключение "Ожидалась одна собственная строка календарного срока";
    КонецЕсли;
    Сроки = Таблица[0];
    Сообщить(Сроки.Срок = Дата(2026, 10, 10, 12, 30, 0));
    Сообщить(Сроки.ПредыдущийДень = Дата(2026, 10, 5, 12, 30, 0));
    Сообщить(Сроки.ЧерезДваМесяца = Дата(2026, 12, 6, 12, 30, 0));
    Сообщить(Сроки.ЧерезДесятьДней = Дата(2026, 10, 16, 12, 30, 0));
    Сообщить(Сроки.КалендарныхДней = 4);
    Сообщить(Сроки.Секунд = 345600);
    Сообщить(Сроки.КалендарныхМесяцев = 2);
    Сообщить(Сроки.ОбратнаяРазница = -4);
КонецПроцедуры

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

  1. Зафиксировать дату 06.10.2026 12:30:00 и передать её параметром. Это дата собственной заявки в памяти, не текущий момент сервера.

  2. ДОБАВИТЬКДАТЕ получает исходную дату, ключевое слово единицы и величину. Для 4.9 дробная часть игнорируется: получается четыре дня, а не четыре дня и 21.6 часа.

  3. ДЕНЬ,-1 переносит назад на 5 октября с тем же временем. МЕСЯЦ,2 переносит на 6 декабря; календарные месяцы не заменяются 60 днями.

  4. ДЕКАДА,1 у ДОБАВИТЬКДАТЕ означает десять дней: срок 16 октября. Это документированное прибавление, не начало/конец календарной декады месяца.

  5. РАЗНОСТЬДАТ вычитает первый аргумент из второго: срок 10 октября минус дата заявки 6 октября даёт четыре календарных дня.

  6. Здесь время в обеих датах одинаковое, поэтому проверка секунд точно 4×24×60×60=345600. При другой паре времён разность в днях не обязана означать столько полных суток.

  7. Для двух месяцев результат 2; перестановка дат даёт -4 дня. Ни одна функция не исключает субботу, воскресенье или праздники.

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

  1. Восемь сообщений Истина: четыре вычисленные даты, четыре календарные разницы. Срок через четыре дня — суббота 10 октября, он не переносится автоматически на понедельник.

  2. Замените 4.9 на 4.1: при игнорировании дробной части срок останется тем же. Для 5 срок станет 11 октября; отдельные проверки разницы, в тексте которых всё ещё задано 4, не изменятся автоматически.

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

Завершён расчёт собственных календарных сроков с сохранением времени, единицами прибавления, знаком разницы и честным ограничением по рабочим дням.

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

  1. РАЗНОСТЬДАТ рассчитывает календарную разницу, не банковские или рабочие дни. Производственный календарь этим кодом не читается.

  2. Наборы единиц двух функций отличаются: НЕДЕЛЯ есть у ДОБАВИТЬКДАТЕ, но не в документированном списке РАЗНОСТЬДАТ этого выпуска.

  3. Обрезание дробной части не является округлением. Явное отрицательное целое -1 здесь отдельно демонстрирует перенос назад без неоднозначности дробного отрицательного ввода.

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

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

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

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

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