Для своей учебной заявки вычисляем срок через четыре дня, перенос назад, два месяца и десятидневный интервал. Проверяем календарную разницу и явно не называем её рабочими днями.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.
Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.
В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.
Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.
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);
КонецПроцедурыРазбор по шагам
Зафиксировать дату 06.10.2026 12:30:00 и передать её параметром. Это дата собственной заявки в памяти, не текущий момент сервера.
ДОБАВИТЬКДАТЕ получает исходную дату, ключевое слово единицы и величину. Для 4.9 дробная часть игнорируется: получается четыре дня, а не четыре дня и 21.6 часа.
ДЕНЬ,-1 переносит назад на 5 октября с тем же временем. МЕСЯЦ,2 переносит на 6 декабря; календарные месяцы не заменяются 60 днями.
ДЕКАДА,1 у ДОБАВИТЬКДАТЕ означает десять дней: срок 16 октября. Это документированное прибавление, не начало/конец календарной декады месяца.
РАЗНОСТЬДАТ вычитает первый аргумент из второго: срок 10 октября минус дата заявки 6 октября даёт четыре календарных дня.
Здесь время в обеих датах одинаковое, поэтому проверка секунд точно 4×24×60×60=345600. При другой паре времён разность в днях не обязана означать столько полных суток.
Для двух месяцев результат 2; перестановка дат даёт -4 дня. Ни одна функция не исключает субботу, воскресенье или праздники.
Как проверить результат
Восемь сообщений Истина: четыре вычисленные даты, четыре календарные разницы. Срок через четыре дня — суббота 10 октября, он не переносится автоматически на понедельник.
Замените 4.9 на 4.1: при игнорировании дробной части срок останется тем же. Для 5 срок станет 11 октября; отдельные проверки разницы, в тексте которых всё ещё задано 4, не изменятся автоматически.
Ожидаемый результат
Завершён расчёт собственных календарных сроков с сохранением времени, единицами прибавления, знаком разницы и честным ограничением по рабочим дням.
На что обратить внимание
РАЗНОСТЬДАТ рассчитывает календарную разницу, не банковские или рабочие дни. Производственный календарь этим кодом не читается.
Наборы единиц двух функций отличаются: НЕДЕЛЯ есть у ДОБАВИТЬКДАТЕ, но не в документированном списке РАЗНОСТЬДАТ этого выпуска.
Обрезание дробной части не является округлением. Явное отрицательное целое -1 здесь отдельно демонстрирует перенос назад без неоднозначности дробного отрицательного ввода.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.