Как прибавить дни к дате в 1С: в запросе и во встроенном языке

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке отчетов, обработок и печатных форм часто возникает задача рассчитать дату будущего события, например, определить срок поставки или оплаты путем добавления некоторого количества дней к дате документа. Рассмотрим, как правильно выполнять арифметические операции с датами во встроенном языке 1С и в языке запросов, а также проанализируем частые ошибки, с которыми сталкиваются разработчики.

Способ 1. Прибавление дней во встроенном языке 1С

Во встроенном языке 1С значение типа Дата содержит не только день, месяц и год, но и время с точностью до секунды. По этой причине любые математические операции сложения и вычитания с переменной типа Дата выполняются в секундах.

Если написать код СрокПоставки = ДатаДокумента + 7;, платформа прибавит к дате всего 7 секунд, а не 7 дней. Для добавления дней необходимо перевести их в секунды: в одних сутках содержится 86 400 секунд (24 часа * 60 минут * 60 секунд).

Разберем пример правильного вычисления даты во встроенном языке:


// Прибавление 7 дней к текущей дате или дате документа
КоличествоДней = 7;
СрокПоставки = ВыборкаСтрок.ДатаДокумента + (КоличествоДней * 86400);

// Если необходимо отсечь время и получить начало дня:
СрокПоставкиБезВремени = НачалоДня(ВыборкаСтрок.ДатаДокумента + (КоличествоДней * 86400));

Способ 2. Прибавление дней в языке запросов 1С

В языке запросов 1С прямые математические операции сложения с типом Дата не поддерживаются. Для работы с интервалами дат применяется специальная функция ДОБАВИТЬКДАТЕ().

Синтаксис функции в запросе выглядит следующим образом:

ДОБАВИТЬКДАТЕ(ИсходнаяДата, ТипУвеличения, Количество)

В качестве типа увеличения применяются ключевые слова: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД.

Проанализируем пример использования функции в тексте запроса:


ВЫБРАТЬ
	ДокументРеализация.Ссылка КАК Ссылка,
	ДокументРеализация.Дата КАК ДатаДокумента,
	ДОБАВИТЬКДАТЕ(ДокументРеализация.Дата, ДЕНЬ, 7) КАК СрокПоставки
ИЗ
	Документ.РеализацияТоваровУслуг КАК ДокументРеализация
ГДЕ
	ДокументРеализация.Ссылка В(&МассивОбъектов)

Критическая ошибка при использовании конструкций ОБЪЕДИНИТЬ ВСЕ

Выясним причину ситуации, когда в запросе написана функция ДОБАВИТЬКДАТЕ, но в итоговом результате всё равно выводится исходная дата без изменений.

Если запрос состоит из нескольких частей, связанных оператором ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ (например, при выборке товаров, услуг и агентских услуг), состав и выражение колонок определяется по первой секции ВЫБРАТЬ. Однако выражение вычисления должно быть прописано во всех объединяемых блоках.

Если в первом блоке указано ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 7) КАК СрокПоставки, а в последующих блоках выбрана просто Дата, то для всех строк из второго и третьего блоков придет исходное значение даты.

Разберем правильную структуру запроса с объединением:


ВЫБРАТЬ
	Документ.Ссылка КАК Ссылка,
	ДОБАВИТЬКДАТЕ(Документ.Дата, ДЕНЬ, 7) КАК СрокПоставки
ИЗ
	Документ.РеализацияТоваровУслуг КАК Документ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Документ.Ссылка,
	// Обязательно применяем ДОБАВИТЬКДАТЕ и во всех последующих блоках!
	ДОБАВИТЬКДАТЕ(Документ.Дата, ДЕНЬ, 7)
ИЗ
	Документ.РеализацияТоваровУслуг КАК Документ

Чек-лист для проверки работы печатных форм и обработок

Если значение даты не меняется или выводится неверно при заполнении макета табличного документа, рекомендуем выполнить следующие шаги:

  1. Проверить имена параметров в макете: убедитесь, что имя ячейки в макете (например, СрокПоставки) точно совпадает с именем реквизита в структуре или имени колонки в выборке.
  2. Расположение расчета в коде: если расчет выполняется в цикле обхода выборки, проверьте, чтобы присвоение значения переменной не находилось внутри условия Если ПерваяСтрокаДокумента Тогда, иначе расчет выполнится только для первой строки.
  3. Заполнение параметров области: убедитесь, что вызов Область.Параметры.Заполнить(СтрокаВыборки) выполняется после того, как в таблицу или выборку были внесены изменения.
  4. Учет рабочих дней: если по условиям бизнес-процесса требуется прибавлять не календарные, а только рабочие дни, используйте механизмы БСП и функцию КалендарныеГрафики.ПолучитьДатуПоКалендарю().
← На главную