При разработке отчетов, обработок и печатных форм часто возникает задача рассчитать дату будущего события, например, определить срок поставки или оплаты путем добавления некоторого количества дней к дате документа. Рассмотрим, как правильно выполнять арифметические операции с датами во встроенном языке 1С и в языке запросов, а также проанализируем частые ошибки, с которыми сталкиваются разработчики.
Во встроенном языке 1С значение типа Дата содержит не только день, месяц и год, но и время с точностью до секунды. По этой причине любые математические операции сложения и вычитания с переменной типа Дата выполняются в секундах.
Если написать код СрокПоставки = ДатаДокумента + 7;, платформа прибавит к дате всего 7 секунд, а не 7 дней. Для добавления дней необходимо перевести их в секунды: в одних сутках содержится 86 400 секунд (24 часа * 60 минут * 60 секунд).
Разберем пример правильного вычисления даты во встроенном языке:
// Прибавление 7 дней к текущей дате или дате документа
КоличествоДней = 7;
СрокПоставки = ВыборкаСтрок.ДатаДокумента + (КоличествоДней * 86400);
// Если необходимо отсечь время и получить начало дня:
СрокПоставкиБезВремени = НачалоДня(ВыборкаСтрок.ДатаДокумента + (КоличествоДней * 86400));
В языке запросов 1С прямые математические операции сложения с типом Дата не поддерживаются. Для работы с интервалами дат применяется специальная функция ДОБАВИТЬКДАТЕ().
Синтаксис функции в запросе выглядит следующим образом:
ДОБАВИТЬКДАТЕ(ИсходнаяДата, ТипУвеличения, Количество)
В качестве типа увеличения применяются ключевые слова: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД.
Проанализируем пример использования функции в тексте запроса:
ВЫБРАТЬ
ДокументРеализация.Ссылка КАК Ссылка,
ДокументРеализация.Дата КАК ДатаДокумента,
ДОБАВИТЬКДАТЕ(ДокументРеализация.Дата, ДЕНЬ, 7) КАК СрокПоставки
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументРеализация
ГДЕ
ДокументРеализация.Ссылка В(&МассивОбъектов)
Выясним причину ситуации, когда в запросе написана функция ДОБАВИТЬКДАТЕ, но в итоговом результате всё равно выводится исходная дата без изменений.
Если запрос состоит из нескольких частей, связанных оператором ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ (например, при выборке товаров, услуг и агентских услуг), состав и выражение колонок определяется по первой секции ВЫБРАТЬ. Однако выражение вычисления должно быть прописано во всех объединяемых блоках.
Если в первом блоке указано ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 7) КАК СрокПоставки, а в последующих блоках выбрана просто Дата, то для всех строк из второго и третьего блоков придет исходное значение даты.
Разберем правильную структуру запроса с объединением:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка,
ДОБАВИТЬКДАТЕ(Документ.Дата, ДЕНЬ, 7) КАК СрокПоставки
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Документ.Ссылка,
// Обязательно применяем ДОБАВИТЬКДАТЕ и во всех последующих блоках!
ДОБАВИТЬКДАТЕ(Документ.Дата, ДЕНЬ, 7)
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
Если значение даты не меняется или выводится неверно при заполнении макета табличного документа, рекомендуем выполнить следующие шаги:
СрокПоставки) точно совпадает с именем реквизита в структуре или имени колонки в выборке.Если ПерваяСтрокаДокумента Тогда, иначе расчет выполнится только для первой строки.Область.Параметры.Заполнить(СтрокаВыборки) выполняется после того, как в таблицу или выборку были внесены изменения.КалендарныеГрафики.ПолучитьДатуПоКалендарю().