1с разность дат количество дней

Как посчитать количество дней между датами в 1С

1. В коде модулей

В частном случае в коде модулей требуется вычислить разность между датами, приведенными к началу дня. Результат будет вычислен в секундах, следовательно, его потребуется перевести в дни:

1с разность дат количество дней

Рисунок 1. Пример использования в коде модуля

2. В тексте запросов 1С 8.3

Язык запросов 1С 8.3 также поддерживает ряд специализированных функций для операций с датами, среди которых имеется РАЗНОСТЬДАТ, предназначенная как раз для того, чтобы определить разность между датами, переданными ей, с указанием основной единицей измерения времени:

1с разность дат количество дней

Рисунок 2. Синтаксис функции в языке запросов

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

1с разность дат количество дней

Рисунок 3. Пример использования в языке запросов

3. В системе компоновки данных (СКД) 1С

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

Источник

Еще раз о рабочих днях. Быстрый способ расчета в запросах

Работа с производственными календарями, рабочими графиками часто встречается в практике разработки. Большинство задач можно свести к двум: 1) Добавить к дате (отнять от даты) некоторое количество рабочих дней и 2) найти разницу в рабочих днях между двумя датами. Несмотря на кажущуюся простоту, в этих задачах достаточно подводных камней, как методических, так и технологических. Естественно эта тема не была обойдена вниманием разработчиков типовых конфигураций и членов нашего сообщества. Простой поиск дает несколько результатов:

На мой взгляд, предлагаемые решения обладают теми или иными недостатками. В их числе:

Предлагаю свой вариант решения.

Постановка задачи:

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

Решение:

Решение поставленной задачи неожиданно получилось довольно простым.

Для учета рабочих графиков (производственных календарей) используем вспомогательный регистр сведений:

1с разность дат количество дней

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

1с разность дат количество дней

Теперь для нахождения разницы дат нам надо в регистре найти два числа, соответствующие этим датам и определить их разницу. Для добавления к дате некоторого числа рабочих дней, надо в регистре найти соответствующее дате число, добавить к нему число рабочих дней, и по результату найти в регистре соответствующую дату рабочего дня. Осталось учесть упомянутые выше сложности и получим следующее:

Примеры использования

Как видим запросы получаются довольно простыми, не используются ни временные таблицы, ни группировки с агрегатными функциями, ни постобработка. Ничего не мешает производить расчет в запросе для нескольких записей. В прилагаемом файле реализован пример отчета по выполненным работам: дана дата начала, предполагаемая плановая продолжительность работы и фактическая дата завершения, определяется плановая дата завершения и отставание факта от плана.

1с разность дат количество дней

Может возникнуть вопрос: оправдано ли с точки зрения производительности использование дополнительного регистра такой структуры, ведь при изменении флага рабочего/выходного дня надо пересчитывать все записи с большей датой? Я считаю, что вполне. Во-первых, изменение производственного календаря происходит обычно не чаще одного раза в месяц, а полный пересчет и сохранение набора записей за 100 лет(

40000 записей) по выбранному графику занимает считанные секунды. А во-вторых, выгода от использования быстрого массового расчета как правило с лихвой перекроет все время, потраченное на предварительную подготовку.

А что же БСП?

Опытный разработчик, использующий БСП, может сказать: «Так ведь в БСП реализовано почти что то же самое!». Да, действительно в БСП есть аналогичный регистр:

1с разность дат количество дней

UPD 25.06.2019:

К статье приложена информационная база, в которой реализован описанный функционал, примеры отчетов, а также процедура заполнения и пересчета регистра.

Источник

РазностьДат()

Сами формулы можешь нарисовать красивей. Но ход мыслей расчета я думаю понятен.

(4) Zircool,
Вот с этого и надо было начинать.
Берем разность дат в часах и отнимаем разность дат в днях с погрешностью в 4 часа (т.к. нам нужно в сутках 20 часов).
строка в запросе будет выглядеть следующим образом

Здесь немного другая ситуация. Смотрите например у нас 2 даты:
02.05.2012 20:00:00 и 03.05.2012 20:10:00

Получается что второго числа человек отработал 4 часа а третьего 20 часов в сумме должено получиться 24 часа, а в отчете пишет 20, т.к. 24 принимает за 20. Должно идти сокращение до 20 часов, если это сутки. Т.е. если человек отработал бы 3.05.2012 23 часа, должно взяться 20 часов.

(5) Zircool,
От блин! Что ж ты как пользователь!?
Нужную вводную информацию по частям выдаешь?
Надо было сразу описание задачи написать. (полностью)

Алгоритм описанный выше (для запроса) имеет только одну маленькую погрешность.

Расчет именно того самого «хвостика».
Т.е. когда сутки были полные. тут и гадать не стоит берем за аксиому что когда полные сутки то 24-4 = 20 часов.
А вот если тот самый преславутый «хвостик» те самые последние часы последних суток.
Тут нужно добавить следующее:
Если «хвостик» по часам меньше 20, то оставляем как есть, а если больше то вместо него ставим 20 часов.

Сначала считаем количество полных суток:

ВторойДень = НачалоДня(Дата1)+ 86400.

(округляй либо конечный результат, либо промежуточный)

(8) brunhilda,
Если для данной задачи. Точкой перевала суток будет время именно 00:00
То твой алгоритм правильней чем мой.

Если точкой перевала суток считать время в составе первой даты(начало периода), то достаточно моего.

Но по уму, твой алгоритм правильней.
Сутки все таки начинаются с 00:00 и поэтому всегда будет «предхвостик» в начале перед следующими полными сутками.
Но если у них в сутках 20 часов, то фиг его знает с какого времени у них сутки начинаются 🙂

При твоих условиях и в запросе это будет выглядеть так:

Ребят спасибо за помощь, в датах у меня большой пробел)))

02.05.2012 8:00:00 | 02.05.2012 20:00:00 | 16,00

Дата1 = Выборка.ДатаВыезда;
Дата2 = Выборка.ДатаВозвращения;

Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда

ВторойДень = НачалоДня(Дата1)+ 86400;
КоличествоСуток = (НачалоДня(Дата2)-ВторойДень)/86400;

Результат = КоличествоСуток*20+ХвостикВначале+ХвостикВКонце;
ЗП = Результат * 77;

Источник

Как посчитать количество месяцев между датами 1С

Функция РАЗНОСТЬДАТ() в запросе

Рассчитать количество месяцев между датами в системе 1с проще всего в запросе, здесь разработчику доступна замечательная функция РАЗНОСТЬДАТ(). Функция рассчитывает календарную разницу между датами в заданной единице измерения.

Где параметр это единица измерения, в которой необходимо получить результат функции (Год, Квартал, Месяц, День, Час, Минута, Секунда).

Пример №1

Пример №2

Примеры способов расчёта в коде

Для решения таких задач в модулях программы 1С, нет специальной функции, и в какой-то степени приходится изобретать «велосипед».

Пример №1

С использование функций Год(), Месяц():

Пример№2

Интересный пример расчёта количества месяцев с помощью рекурсии с использование функции НачалоМесяца().

Возможные ошибки

Для расчётов временных промежутков между датами следует не путать местами начальную и конечную даты, в противном случае можно получить результат со знаком минус.

Пример:

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Источник

Программирование в 1С для всех

В этой статье научимся узнаем, как работают даты в 1С. Тип Дата — это один из примитивных типов 1С 8.3. При помощи этого типа в программе 1С можно задать дату (например, 10 ноября 2019 года), время (например, 12 часов 32 минуты 45 секунд), а также дату с временем (например, 10 ноября 2019 года 12 часов 32 минуты 45 секунд). В этой статье мы научимся создавать переменные с типом дата, создавать реквизиты объектов с типом дата и работать на форме с этим типом. А также научимся выполнять элементарные операции над датами.

Создаем программно даты в 1С

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

ГГГГ – цифры года даты,

ММ — цифры месяца даты

ДД – цифры дня даты

ЧЧ – цифры часа от 0 до 23

ММ – цифры минут от 0 до 59

СС – цифры секунд от 0 до 59

Причем, дату можно задать в полном формате с минутами и секундами, а также без указания минут и секунд. То есть, вот так:

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

Рассмотрим, примеры. Создадим дату со временем, дату без времени и время с пустой датой. И также все это выведем методом Сообщить. Хотя, метод Сообщить и принимает в качестве параметра тип строка, мы можем и передать в него дату, платформа 1С автоматически её конвертирует в строку.

И посмотрим, как это все вывелось.

1с разность дат количество дней

Таким образом, в платформе 1С у нас хранится дата в полном размере (год, месяц, день, час, минута, секунда). Если нам нужна просто дата, то час, минута и секунда равны нулю (при программном создании дат их можно не задавать), а если нам нужно просто время без даты, то год, месяц и день равны 1 (при программном создании даты их следует указывать).

Разберем еще один способ создания переменной с типом дата, это использование метода Дата. Этот метод имеет два варианта синтаксис:

СтрокаДаты – строка, которая задаётся в уже знакомом нам формате «ГГГГММДДЧЧММСС», принципы задания строки аналогичны принципам задания даты в ординарных кавычках.

Год – цифра года даты,

Месяц – цифра месяца даты,

День – цифры дня даты,

Минута – цифры минуты

Секунда – цифры секунды.

Первый три параметра являются обязательными.

Если нам нужно задать, просто дату (без времени), то будет следующий синтаксис.

А если нужно задать время, то года, месяц и день будут равны 1:

Переделаем предыдущий пример.

Здесь я использовал два синтаксиса метода Дата. Первый синтаксис, по сути, преобразует строку в дату (строка естественно должна быть задана по правилам). Второй синтаксис, позволяет задать дату при помощи типа число.

Реквизит с типом дата в объектах 1С

Для того, чтобы какой-то реквизит объекта 1С 8.3 был датой, достаточно указать ему соответствующий тип. Например, как мы это делаем со справочником.

1с разность дат количество дней

Причем у любого реквизита с типом дата имеется состав даты. Это Дата, Время и Дата и время.

1с разность дат количество дней

В зависимости от того, какой состав даты выбран, такой вид даты и можно будет указать в форме объекта.

1с разность дат количество дней

1с разность дат количество дней

Состав даты Дата и время.

1с разность дат количество дней

Причем, не имеет значения, какой состав даты выбран, дата запишется полностью в формате ГГГГММДДЧЧММСС. Просто в зависимости от состава даты, или время будет равняться нулю (если выбран состав даты Дата), или год, месяц, день будут равняться единицы.

Дата на управляемой форме 1С

На управляемую форме 1С можно поместить реквизит с типом дата, у которого, также, имеется возможность выбрать состав даты: Дата, Время, Дата и время.

1с разность дат количество дней

Если мы поместим этот реквизит на форму, то он разместится в виде поля ввода.

1с разность дат количество дней

Причем у этого поля ввода имеется справа кнопка, при нажатии на которую будет открыто окно выбора даты.

1с разность дат количество дней

Это окно появляется в том случае, если состав даты реквизита или Дата, или Дата и время.

А отвечает за появление этой кнопки свойство поля ввода «Кнопка выбора».

1с разность дат количество дней

Посмотрим, как записывается дата, в зависимости от значения состава даты.

Для этого у поля ввода я создам событие при изменении.

1с разность дат количество дней

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

Посмотрим, что вернет этот метод, когда состав даты реквизита — Дата.

1с разность дат количество дней

Когда состав даты реквизита — Время

1с разность дат количество дней

Когда состав даты реквизита – Дата и время

1с разность дат количество дней

Вы убедились наглядно, что независимо от состава даты, у нас дата всегда записывается в формате ГГГГММДДЧЧММСС.

Разность дат в 1С

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

Например, создадим две даты разностью в минуту, вычтем одну из другой.

И посмотрим, какая разница.

1с разность дат количество дней

Мы получили количество секунд разности между Дата2 и Дата1. Если мы вычтем наоборот.

То поскольку Дата2 раньше на временной оси, чем Дата1, то получим разность с отрицательным знаком.

1с разность дат количество дней

Прибавить дату 1С

Мы также, можем прибавить к дате нужное количество секунда. Делается это просто: к определенной дате, прибавляется то количество секунд, которое нам нужно.

Например, прибавим к дате минуту, час, день.

Посмотрим на результат:

1с разность дат количество дней

Также можно и вычесть дату.

Посмотрим на результат:

1с разность дат количество дней

Этим способом рекомендую прибавлять к датам и вычитать из дат небольшие значения (до дня), для прибавления месяцев и выше, в платформе 1С имеется способ, который будет рассмотрен в следующей статье.

Другие статьи о примитивных типах:

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

1с разность дат количество дней

Книга написана понятным и простым языком — для новичка.

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

1с разность дат количество дней

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *