Текущая дата 1С

v8: Вычисление разности дат в годах, днях и месяцах запросом

Ключевые слова: РазностьДат, разность дат, компоновка данных, стаж, запрос, ЗУП
Этот код можно использовать в расчитываемом поле компановки данных, а если разбить на три части (отдельно расчет годом, отдельно — месяцев, отдельно — дней), то и в обычном запросе.
В коде &Период — это дата, которой заканчивается отсчет, а ДанныеОРаботе.ДатаПриема — дата, с которой начинается отсчет.
Алгоримт работы аналогичен функции из ЗУП’а
Текст функции:
// Процедура вычисляет количество лет, месяцев и дней между двумя датами
//
// Параметры
// Дата1 – дата, первая дата (более поздняя, часто текущая, стаж определяется по состоянию на эту дату)
// Дата2 – дата, вторая дата (ранняя дата, с нее начинается «течение» стажа)
// Лет – Число, в этот параметр будет записано кол-во лет между двумя датами (Дата1-Дата2)
// Месяцев – Число, в этот параметр будет записано кол-во месяцев между двумя датами (Дата1-Дата2)
// Дней – Число, в этот параметр будет записано кол-во дней между двумя датами (Дата1-Дата2)
//
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт
Лет = 0;
Месяцев = 0;
Дней = 0;
Если Дата1 > Дата2 Тогда
ВременнаяДата = Дата1;
Если День(ВременнаяДата) < День(Дата2) Тогда
Дней = (ВременнаяДата — ДобавитьМесяц(ВременнаяДата,-1))/86400;
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
КонецЕсли;
Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
Месяцев = 12;
КонецЕсли;
Лет = Макс( Год(ВременнаяДата) — Год(Дата2), 0);
Месяцев = Макс(Месяцев + Месяц(ВременнаяДата) — Месяц(Дата2), 0);
Дней = Макс(Дней + День(ВременнаяДата) — День(Дата2), 0);
// скорректируем отображаемое значение, если «вмешалось» разное количество дней в месяцах
Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
Дней = Дней + (День(КонецМесяца(Дата2)) — День(НачалоМесяца(Дата2))) — (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) — День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
КонецЕсли;
КонецЕсли;
КонецПроцедуры // РазобратьРазностьДат
Текст кода вычисляемого поля копоновки данных:
СТРОКА(
ВЫБОР
КОГДА Год(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ,»МЕСЯЦ»,-12)
ИНАЧЕ
ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) — Год(ДанныеОРаботе.ДатаПриема) > 0
ТОГДА Год(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ,»МЕСЯЦ»,-12)
ИНАЧЕ
ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)

ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) — Год(ДанныеОРаботе.ДатаПриема)
ИНАЧЕ 0
КОНЕЦ) + » г. «
+СТРОКА(
ВЫБОР
КОГДА ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА 12
ИНАЧЕ 0
КОНЕЦ + Месяц(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ,»МЕСЯЦ»,-12)
ИНАЧЕ ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) — Месяц(ДанныеОРаботе.ДатаПриема) > 0
ТОГДА ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА 12
ИНАЧЕ 0
КОНЕЦ + Месяц(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ,»МЕСЯЦ»,-12)
ИНАЧЕ
ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) — Месяц(ДанныеОРаботе.ДатаПриема)
ИНАЧЕ 0
КОНЕЦ) +» мес. «
+ СТРОКА(ВЫБОР
КОГДА (ВЫБОР
КОГДА ДЕНЬ(&Период) < ДЕНЬ(ДанныеОРаботе.ДатаПриема)
ТОГДА РазностьДат(ДобавитьКДате(&Период,»МЕСЯЦ»,-1),&Период,»ДЕНЬ»)
ИНАЧЕ 0
КОНЕЦ + День(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ,»МЕСЯЦ»,-12)
ИНАЧЕ ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ
КОНЕЦ) — День(ДанныеОРаботе.ДатаПриема)) > 0
ТОГДА ВЫБОР
КОГДА ДЕНЬ(&Период) < ДЕНЬ(ДанныеОРаботе.ДатаПриема)
ТОГДА РазностьДат(ДобавитьКДате(&Период,»МЕСЯЦ»,-1),&Период,»ДЕНЬ»)
ИНАЧЕ 0
КОНЕЦ + День(ВЫБОР
КОГДА МЕСЯЦ(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)
ИНАЧЕ &Период
КОНЕЦ,»МЕСЯЦ»,-12)
ИНАЧЕ ВЫБОР
КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
ТОГДА ДобавитьКДате(&Период,»МЕСЯЦ»,-1)

Дата — один из примитивных типов данных в системе 1С:Предприятие. Дата всегда имеет формат год, месяц, день, час, минута, секунда. Таким образом, переменная типа дата содержит не только дату, но и время.

Создать переменную с типом дата можно несколькими способами:

Способ 1:

Присвоение переменной значения типа ‘ГГГГММДДччммсс’ или ‘ГГГГ.ММ.ДД:чч:чч:сс’

‘20100304235959’ — вернет дату 04.03.2010 23:59:59.

‘2011.10.09:22:10:12’ — вернет дату 09.10.2011 22:10:12.

Способ 2:

Использование функции глобального контекста Дата (Год, Месяц, День, час, минуты, секунды).

Дата(2010, 07, 14, 12, 13, 14) — вернет значение 14.07.2010 12:13:14

Этой же функцией можно преобразовать строку в дату.

Дата(20100714121314) — вернет значение 14.07.2010 12:13:14

Способ 3 (для запросов):

Использование выражения ДАТАВРЕМЯ (Год, Месяц, День, час, минута, секунда)

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

Дата (2010, 07, 14) — вернет значение 14.07.2010 0:00:00

Способ 4:

Еще можно попросить пользователя ввести нужную дату. Для этого необходимо воспользоваться функцией ВвестиДату(Дата, Подсказка, ЧастьДаты). Первый параметр задает переменную, которой будет присвоено введенное значение. Второй параметр — это заголовок диалогового окна, третий параметр определяет, какую часть типа дата необходимо ввести. Он может принимать следующие значения:

  • ЧастиДаты.Дата — будут введены только год, месяц и день;
  • ЧастиДаты.Время — будут введены только часы, минуты, секунды. В этом случае дата будет иметь вид 0001.01.01 чч:мм:сс.
  • ЧастиДаты.ДатаВремя — будут введены все составляющие даты и времени.

Способ 5 (получить текущую дату и время)

Дата=ТекущаяДата();

Проверка пустой даты

Часто бывает необходимо проверить, введена дата или нет. Пустая дата — это первое января 1 года, 0 часов, 0 минут, 0 секунд. Проверка может выглядеть следующим образом:

Если ПроверяемаяДата=Дата(1,1,1) Тогда
//действие при пустой дате
КонецЕсли;

Использование даты в реквизитах

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

  • дату, тогда время всегда равно 00:00:00;
  • только время, тогда дата равна 01.01.0001;
  • дату и время.

Получение отдельных составляющих даты

Получить год:

Результат=Год(Дата);

Получить месяц:

Результат=Месяц(Дата);

Получить номер дня в месяце:

Результат=День(Дата);

Получить номер дня в году:

Результат=ДеньГода(Дата);

Получить номер дня в неделе:

Результат=ДеньНедели(Дата);

Получить номер недели в году:

Результат=НеделяГода(Дата);

Получить час:

Результат=Час(Дата);

Получить минуту:

Результат=Минута(Дата);

Получить секунду:

Результат=Секунда(Дата);

Операции по преобразованию дат

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

Результат=Дата + 1; //Прибавили секунду
Результат=Дата + 2*60; //Прибавили 2 минуты
Результат=Дата + 3*60*60*24; //Прибавили 3 дня

Прибавить или отнять от даты один или несколько месяцев:

Результат=ДобавитьМесяц(Дата, 2); //Добавляет к дате 2 месяца
Результат=ДобавитьМесяц(Дата, -2) //Отнимает от даты 2 месяца

Получить конец или начало периода:

Результат=НачалоКвартала(Дата); // Возвращает дату начала квартала, время 00:00:00
Результат=КонецКвартала(Дата); //Возвращает дату конца квартала, время 23:59:59
Результат=НачалоМесяца(Дата); // Возвращает дату начала месяца, время 00:00:00
Результат=КонецМесяца(Дата); //Возвращает дату конца месяца, время 23:59:59
Результат=НачалоНедели(Дата); // Возвращает дату начала недели, время 00:00:00
Результат=КонецНедели(Дата); //Возвращает дату конца недели, время 23:59:59
Результат=НачалоДня(Дата); // Дата остается прежней, время 00:00:00
Результат=КонецДня(Дата); // Дата остается прежней, время 23:59:59
Результат=НачалоЧаса(Дата); //Дата и час остаются прежними, минуты и секунды 00:00
Результат=КонецЧаса(Дата); //Дата и час остаются прежними, минуты и секунды 59:59
Результат=НачалоМинуты(Дата); //Дата, час и минута остаются прежними, секунды 00
Результат=КонецМинуты(Дата); //Дата, час и минута остаются прежними, секунды 59

Печать (Ctrl+P)

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

&НаКлиенте Функция РазностьМеждуДатамиВГадах(Дата1,Дата2) Возврат Цел(РазностьМеждуДатамиВМесяцах(Дата1,Дата2)/12); КонецФункции &НаКлиенте Функция РазностьМеждуДатамиВМесяцах(Дата1,Дата2) Год1 = Год(Дата1); Год2 = Год(Дата2); Месяц1 = Месяц(Дата1); Месяц2 = Месяц(Дата2); День1 = День(Дата1); День2 = День(Дата2); Результат = (Год2 — Год1) * 12 + Месяц2 — Месяц1; Если Результат < 0 Тогда Результат = 0 — Результат; КонецЕсли; Если ((Дата1 > Дата2) И (День1 < День2)) ИЛИ ((Дата1 < Дата2) И (День1 > День2)) Тогда Результат = Результат — 1; КонецЕсли; Возврат Результат; КонецФункции

При расчете возраста в запросе нужно использовать функцию работы с датой языка запроса РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>), где тип – это строка «ГОД”

Момент времени:
Фирма 1С описывает так:
Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время, а также ссылку на объект базы данных. Используется в качестве значений свойств и параметров методов других объектов, имеющих тип МоментВремени.
Момент времени используется в тех случаях, когда важно различать моменты времени для объектов, имеющих одинаковую дату и время, например для сравнения положений документов на временной оси.
А своими словами:
Момент времени — комбинация даты и ссылки на документ. Позволяет разделить и упорядочить документы в пределах одной секунды, выстраивая все документы в однозначную последовательность. Получение данных при проведении на момент времени гарантирует, что будут учтены движения сделанные в ту же секунду что и проводимый документ, но находящиеся перед ним.
Но есть особенность — документы проведенные в одну и ту же секунду располагаются в произвольном порядке, а не в порядке их физического создания (как было в 7.7).
МоментВремени() — это момент непосредственно ПЕРЕД позицией документа (аналог РассчитатьРегистрыНа(ТекущийДокумент() в 7-рке), а если необходимо получить момент непосредственно после позиции документа, то используйте объект Граница
Код 1C v 8.х МоментСразуПослеДокумента = Новый Граница(ДокументСсылка,ВидГраницы.Включая)
Код 1C v 8.х // Пример создает момент времени по дате и ссылке на объект в базе данных.
Момент = Новый МоментВремени(ТекДокумент.Дата, ТекДокумент.Ссылка);
При получение остатков:
«Момент времени» — виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя ДАТУ и ССЫЛКУ НА ДОКУМЕНТ)
<Виртуальная> таблица остатков не хранится в БД, а строится в момент обращения к ней.
1. подбирается больший или равный значению ПАРАМЕТР момент времени, на который РАССЧИТАНЫ остатки
2. на этот момент получаются остатки из таблицы итогов
3. если момент времени, на который считаются остатки, не совпадает с моментом времени итогов, то остатки ДОСЧИТЫВАЮТСЯ по движениям.
Граница:
Предназначен для получения и хранения границы некоторого интервала значений. Содержит граничное значение интервала, а также признак включения или исключения граничного значения в интервал.
Используется в качестве значений свойств и параметров методов других объектов, имеющих тип Граница.
Граница используется в тех случаях, когда важно указание включения или исключения граничного значения, например при получении остатков и оборотов регистров накопления, срезов и значений регистров сведений, для задания интервалов запросов.
ВидГраницы — Определяет набор видов границ по отношению к граничному значению:
ВидГраницы.Включая — Граница включает граничное значение.
ВидГраницы.Исключая — Граница исключает граничное значение.
Код 1C v 8.х Граница = Новый Граница(Дата, ВидГраницы.Включая);
Запрос.УстановитьПараметр(«КонГраница», Граница);
Пример получения остатков на дату документа, включая его движения
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(&МомВрем, Физлицо = &Физик) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки»;
МомВрем = Документы.НачислениеЗарплатыРаботникамОрганизаций.НайтиПоНомеру(«00012″,»31.12.2009 23:59:59»);
Запрос.УстановитьПараметр(«МомВрем», Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр(«Физик», Справочники.ФизическиеЛица.НайтиПоКоду(«365»));
ВывестиРезультат(Запрос.Выполнить());
Пример получения остатков на дату документа, но до его движений
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(&МомВрем, Физлицо = &Физик) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки»;
МомВрем = Документы.НачислениеЗарплатыРаботникамОрганизаций.НайтиПоНомеру(«00012″,»31.12.2009 23:59:59»);
Запрос.УстановитьПараметр(«МомВрем», Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Исключая));
// или так: Запрос.УстановитьПараметр(«МомВрем», МомВрем.МоментВремени());
Запрос.УстановитьПараметр(«Физик», Справочники.ФизическиеЛица.НайтиПоКоду(«365»));
ВывестиРезультат(Запрос.Выполнить());
Информация взята с сайта http://helpf.pro

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

Мы попытаемся как можно подробнее рассказать вам об тех запросах, которые связанны с соединением, объединением, а также с соединением запросов. Давайте с помощью примеров попытаемся ответить на вопрос: каким образом можно получить последние документы в 1С запросе. Итак, давайте все таки начнем.

Для начала следует сортировать документы по убыванию даты, для этого вам понадобится воспользоватся конструкцией «ВЫБРАТЬ ПЕРВЫЕ 1»:

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

Каким образом можно сделать запрос, таким образом, чтобы он вернул документы по всем контрагентам, а не по одному конкретному?
Для решение данной задачи нужно будет воспользоватся функцией МАКСИМУМ.

Запрос = Новый Запрос;
Запрос.Текст = ”
|ВЫБРАТЬ
| ПоследниеДокументыКонтрагентов.Ссылка,
| ПоследниеДокументыКонтрагентов.Контрагент
|ИЗ Документ.РеализацияТоваровУслуг КАК ПоследниеДокументыКонтрагентов
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| Доки.Контрагент КАК Контрагент,
| МАКСИМУМ(Доки.Дата) КАК ДатаПоследнегоДокумента
| ИЗ Документ.РеализацияТоваровУслуг КАК Доки
|СГРУППИРОВАТЬ ПО Доки.Контрагент)
|КАК ДатыПоследнихДокументовКонтрагентов
|ПО ПоследниеДокументыКонтрагентов.Контрагент =
|ДатыПоследнихДокументовКонтрагентов.Контрагент
|И ПоследниеДокументыКонтрагентов.Дата =
|ДатыПоследнихДокументовКонтрагентов.ДатаПоследнегоДокумента”;
РезультатЗапроса = Запрос.Выполнить();

Этот запрос способен выбрать последние документы по всем контрагентам.

Сергей Лунев

Тип «Дата» в 1С входит в число 4 основных типов данных наряду с числом, строкой и булево. В конфигурациях даты встречаются повсеместно – при разработке невозможно избежать работы с этим типом данных. Поэтому лучше начинать писать запросы, уже понимая, как обрабатывать даты, какие есть возможности для работы с ними, как они хранятся, а до этого «безопаснее» использовать услуги программистов по доработке 1С, которые предоставляют большинство компаний-франчайзи. Рассмотрим на примерах все нюансы написания запросов с различными датами.

Примеры работы с датами в запросах 1С

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

  1. Передать через параметр. Получить текущую дату сеанса можно только этим методом;
  2. Получить дату в запросе из поля выборки;
  3. Преобразовать из числовых значений с помощью функции ДАТАВРЕМЯ().

Самой распространенной задачей при работе с документами является проверка на пустую дату в запросе 1С. В этом случае легче всего сравнить переменную или поле с пустой датой, которая получается с помощью функции ДАТАВРЕМЯ(1,1,1):

Аналогичной командой можно получить произвольную дату и время в запросе. При этом их можно указать с точностью до секунды, задав в качестве параметров 6 чисел. Если же используется только 3 числа, то часы, минуты и секунды будут приравнены к 0 (начало дня). Например, нам необходимо в запросе выбрать документы за первые 10 дней января 2018 года:

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

  • НАЧАЛОПЕРИОДА. В качестве параметров указывается дата и промежуток времени, в разрезе которого необходимо получить начало даты. Используется, чтобы преобразовать дату к формату без времени. Для этого необходимо задать второй параметр – «ДЕНЬ»;
  • КОНЕЦПЕРИОДА. Аналогичная команда, возвращающая последнюю дату в разрезе указанных в параметрах единиц;
  • ДОБАВИТЬКДАТЕ. Позволяет получить дату, большую на заданное количество указанных единиц времени. В качестве параметров функции указывают дату, единицу измерения времени и число;
  • РАЗНОСТЬДАТ. Получает разницу между датами в указанных единицах измерения;
  • ДЕНЬНЕДЕЛИ. Вернет порядковый номер одного из дней недели.

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

Преобразование типов в запросе 1С из числа или строки в дату – трудоемкое занятие. Из чисел можно получить дату с помощью функции ДАТАВРЕМЯ, из строки – комбинируя функцию ПОДСТРОКА и конструкцию ВЫБОР КОГДА ТОГДА ИНАЧЕ. Исходя из этого, разработчики предпочитают получать дату из других типов в модуле и передавать ее в запрос с помощью параметра. К сожалению, это не всегда реализуемо, поэтому приходится менять формат даты в запросе.

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

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

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

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

Хранение дат в системе

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

Переменные типа «дата» всегда представляют дату с секундами. Отсчет дат ведется с Рождества Христова (наша эра), т.е. с 01.01.0001 00:00:00 по Григорианскому календарю. Начальная дата — это не совсем дата. Это значение в системе используется для представления «пустой даты» (аналог пустой ссылки для ссылочных типов или пустой строки «» для строкового типа).