1с операции с датами

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

При создании даты из строки («приведение к дате») можно указать в локализованном формате (день.месяц.год часы:минуты:секунды), но только полностью.

Например:

//Работа с датами 1С - преобразовать дату в 1С из частей - год, месяц, день (плюс необязательно время) Дата = Дата(2012,10,30); //без времени Дата = Дата(2012,10,30,12,00,00); //со временем //Работа с датами 1С - преобразовать дату в 1С из строки, разные способы Дата = Дата("20121030"); //год, месяц, день Дата = Дата("30.10.2012 12:00:00"); //локализованный формат, только полностью //Работа с датами 1С - указание значения даты без приведения, напрямую Дата = "20121030"; //без времени Дата = "20121030120000"; //со временем

Работа с датами 1С - Пустая дата 1С

Чтобы проверить дату 1С на заполненность – ее сравнивают с «пустой датой». При наличии в справочнике/документе реквизита с типом дата, если пользователь не заполнил это поле, то ее значение также будет – «пустая дата».

«Пустая дата» - это 01.01.0001 00:00:00.

Например:

ПустаяДата = "00010101000000"; Если НужнаяДата = "00010101000000" Тогда Сообщить("Вы не заполнили очень нужную дату"); КонецЕсли;

Работа с датами 1С - Дата в реквизитах (справочников, документов и т.п.)

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

Только дату (время тогда всегда равно 00:00:00)
Только время (дата тогда всегда равна 01.01.0001)
Дату и время

Получение даты

Для получения даты и времени используется функция 1С ТекущаяДата().

Очень важно место – где вызывается эта функция – на клиенте или на сервере. Подробнее см. тему «Режим исполнения/Исполнение». Часто бывает, что на клиентских машинах время немного разное, поэтому стараются везде использовать серверное время – даже если оно установлено на сервере не верно, то хотя бы у всех клиентов будет одинаковое неверное время.

Для того, чтобы получить серверную дату (дату, установленную в операционной системе компьютера сервера), обычно в конфигурации создают общий модуль с установленной галочкой «Сервер» в свойствах, и в нем создают функцию

//функция расположена в общем модуле, например с именем СерверныеФункции //в свойствах общего модуля установлена галочка «Сервер» и не установлена галочка «Клиент» Функция ПолучитьДатуСервера() Экспорт Возврат ТекущаяДата(); КонецФункции //вызов этой функции для использования из другого модуля выглядит так ДокументОбъект.Дата = СерверныеФункции.ПолучитьДатуСервера(); //ИмяМодуля.ИмяФункции()

Также в тонком клиенте непосредственно у функций модулей указывается где она будет исполнена:

Начало и конец дня

Для даты «30.10.2012»:

дата начала дня выглядит так «30.10.2012 00:00:00»
дата конца дня выглядит так «30.10.2012 23:59:59»

Используется в отчетах и запросах, требующих получить данные за период – день, месяц, год.

Так например период с «01.01.2012 00:00:00» по «31.01.2012 00:00:00» неверен, так как не включает в себя один день месяца (но включает в себя одну секунду последнего дня месяца).

Работа с датами 1С - Сравнение дат

Дата содержит дату и время. При сравнении дат (без учета времени) их обычно приводят к началу дня (месяца, года).

Например:

Дата1 = Дата("30.10.2012 12:00:00"); Если НачалоДня(Дата1) = НачалоДня(ДокументСсылка.Дата) Тогда Сообщить("Документ введен заданной датой"); КонецЕсли; На всякий случай, пример сравнения даты в периоде: Если ДокументСсылка.Дата >= НачалоМесяца(ТекущаяДата()) и ДокументСсылка.Дата <= КонецМесяца(ТекущаяДата()) Тогда Сообщить("Документ введен в текущем месяце"); КонецЕсли;

Работа с датами 1С - Изменение даты

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

Например:

СНачалаДня = ТекущаяДата() – НачалоДня(ТекущаяДата()); Сообщить("С начала дня прошло " + Строка(СНачалаДня) + " секунд"); Сообщить("С начала дня прошло " + Строка(СНачалаДня/60) + " минут"); Сообщить("С начала дня прошло " + Строка(СНачалаДня/60/60) + " часов");

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

НачалоЭтогоДня = НачалоДня(ТекущаяДата()); НачалоПредыдущегоДня = НачалоДня(НачалоЭтогоДня – 1); //убираем секунду – делая «вчера» и берем начало дня у «вчера» НачалоПредыдущегоДня = НачалоЭтогоДня – 24*60*60; //другой способ – отнимаем 24 часа – 24(часа)*60(получились минуты)*60(секунды)

Работа с датами 1С - Момент времени

Момент времени – это расширенное представление даты, применимое к документам (и соответственно регистрам).

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

Момент времени можно получить у документа следующими способами:

//способ 1 МоментВремениДокумента = ДокументСсылка.МоментВремени(); Также можно сравнить момент времени с датой/временем: МоментВремениЭталон = Новый МоментВремени(НачалоДня(ТекущаяДата())); Если ДокументСсылка.МоментВремени().Сравнить(МоментВремениЭталон) = -1 Тогда Сообщить("Документ введен раньше, чем сегодня"); КонецЕсли; //Если документ введен сегодняшней датой в 00:00:00, то он все равно введен - сегодня

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

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

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

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

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

ДАТАВРЕМЯ (1, 1, 1)

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

ВЫБРАТЬ ПоступлениеНаРасчетныйСчет.Ссылка КАК Ссылка ИЗ Документ.ПоступлениеНаРасчетныйСчет КАК ПоступлениеНаРасчетныйСчет ГДЕ ПоступлениеНаРасчетныйСчет.Дата МЕЖДУ ДАТАВРЕМЯ(2018, 1, 1, 0, 0, 0) И ДАТАВРЕМЯ(2018, 1, 10, 23, 59, 59)

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

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

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

ВЫБОР КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 1 ТОГДА "понедельник" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 2 ТОГДА "вторник" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 3 ТОГДА "среда" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 4 ТОГДА "четверг" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 5 ТОГДА "пятница" КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 6 ТОГДА "суббота" ИНАЧЕ "Воскресенье" КОНЕЦ

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

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

Тип: Число; Дата; Булево. Форматируемое значение. <ФорматнаяСтрока> (необязательный) Тип: Строка. Форматная строка представляет собой строковое значение, включающее параметры форматирования. Параметры форматирования перечисляются через символ «;». Наличие параметра означает отличие форматирования от стандартного. Если параметр не задан, то применяется стандартное форматирование, которое в основном соответствует преобразованию значения к строке. Однако для значений типа Число и Дата по умолчанию (0 и 01.01.0001 00:00:00 соответственно) будет выдаваться пустая строка. Каждый параметр задается именем параметра, символом «=» и значением параметра. Значение параметра может указываться в одинарных или двойных кавычках. Это необходимо, если значение параметра содержит символы, используемые в синтаксисе форматной строки. Внутри значения параметра могут указываться произвольные символы, которые при формировании результирующей строки будут отображаться как есть. Таким образом, например, можно указывать разделители часов, минут и секунд при форматировании времени. Если эти символы совпадают со значениями форматной строки, их необходимо заключать в одинарные кавычки. Имена и значения параметров форматной строки: Л (L) — имя языка, страны, для которых будет выполняться стандартное форматирование. Доступные имена языков расположены после описания форматной строки. ЧЦ (ND) — общее число отображаемых десятичных разрядов целой и дробной частей. Исходное число округляется при этом в соответствии с правилами округления Окр15как20. Если указан этот параметр, то для отображения дробной части числа обязательно указание параметра ЧДЦ, иначе дробная часть отображаться не будет. ЧДЦ (NFD) — число десятичных разрядов в дробной части. Исходное число округляется при этом в соответствии с правилами округления Окр15как20. ЧС (NS) — сдвиг разрядов: положительный — деление, отрицательный — умножение. Другими словами, это означает, что исходное число будет умножено или поделено на 10*С, где С — значение параметра по модулю. ЧРД (NDS) — символ-разделитель целой и дробной части. ЧРГ (NGS) — символ-разделитель групп целой части числа. Если в качестве разделителя использовать пустую строку, то в этом случае разделителем будет символ неразрывного пробела. ЧН (NZ) — строка, представляющая нулевое значение числа. Если не задано, то представление в виде пустой строки. Если задано «ЧН=», то в виде «0». Не используется для числовых полей ввода. ЧВН (NLZ) — нужно ли выводить лидирующие нули. Значение данного параметра не задается, собственно наличие параметра определяет вывод лидирующих нулей. ЧГ (NG) — порядок группировки разрядов числа. В качестве значения указываются числа, через запятую, обозначающие количество группируемых разрядов справа налево. Имеют смысл только два первых числа. Первое из них указывает первичную группировку, то есть ту, которая будет использована для наименее значимых разрядов целой части числа. Если второе число не указано, то будут сгруппированы только наименее значимые разряды. Если в качестве второго числа задан 0, то для всех разрядов целой части числа будет применено значение указанное для первичной группировки. Если в качестве второго числа используется значение, отличное от 0, то это значение будет использовано для группировки всех разрядов, кроме уже сгруппированных наименее значимых. ЧО (NN) — представление отрицательных чисел. 0 (0) — строка вида «(1,1)»; 1 (1) — строка вида «-1,1»; 2 (2) — строка вида «- 1,1»; 3 (3) — строка вида «1,1-«; 4 (4) — строка вида «1,1 -«. ДФ (DF) — формат даты. д (d) — день месяца (цифрами) без лидирующего нуля; дд (dd) — день месяца (цифрами) с лидирующим нулем; ддд (ddd) — краткое название дня недели *); дддд (dddd) — полное название дня недели *); М (M) — номер месяца (цифрами) без лидирующего нуля; ММ (MM) — номер месяца (цифрами) с лидирующим нулем; МММ (MMM) — краткое название месяца *); ММММ (MMMM) — полное название месяца *); к (q) — номер квартала в году; г (y) — номер года без века и лидирующего нуля; гг (yy) — номер года без века с лидирующим нулем; гггг (yyyy) — номер года с веком; ч (h) — час в 12 часовом варианте без лидирующих нулей; чч (hh) — час в 12 часовом варианте с лидирующим нулем; Ч (H) — час в 24 часовом варианте без лидирующих нулей; ЧЧ (HH) — час в 24 часовом варианте с лидирующим нулем; м (m) — минута без лидирующего нуля; мм (mm) — минута с лидирующим нулем; с (s) — секунда без лидирующего нуля; сс (ss) — секунда с лидирующим нулем; вв (tt) — отображение половины дня AM/PM (действительно только для языков конфигурирования, поддерживающих 12 часовой вариант представления времени). Примечание: *) — не используется для форматной строки поля ввода даты. ДЛФ (DLF) — локальный формат даты. Указывается вариант отображения частей даты. Д (D) — дата (цифрами); ДД (DD) — длинная дата (месяц прописью); В (T) — полное время, дата может объединяться со временем; ДВ (DT) — дата время. Пример: выражение Формат(‘20051120140323’,»ДЛФ=ДДВ») имеет значение «20 ноября 2005 г. 14:03:23″. Важно! Порядок следования опций форматной строки для ДЛФ <дата + время> (ДВ или ДДВ) не может быть изменен. ДП (DE) — строка, представляющая пустую дату (например, Формат(‘00010101000000’ ,»ДП=»»пустая дата»»») вернет строку «пустая дата»). БЛ (BF) — строка, представляющая логическое значение Ложь. БИ (BT) — строка, представляющая логическое значение Истина. Примечание. Использование параметров для поля ввода: параметр ДП (DE) не используется; параметр ДЛФ (DLF) используется только со значениями Д (D), В(T) и ДВ (DT). Возвращаемое значение: Тип: Строка. Строка, полученная в результате форматирования переданного значения. Описание: Формирует удобное для чтения представление значений. Полезно использование в отчетах и при прочем визуальном отображении значений. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). Список языков: af Африкаанс af_NA (af_NA) Африкаанс (Намибия) af_ZA Африкаанс (Южная Африка) am Амхарский am_ET Амхарский (Эфиопия) ar Арабский ar_AE Арабский (Объединенные Арабские Эмираты) ar_BH Арабский (Бахрейн) ar_DZ Арабский (Алжир) ar_EG Арабский (Египет) ar_IQ Арабский (Ирак) ar_JO Арабский (Иордания) ar_KW Арабский (Кувейт) ar_LB Арабский (Ливан) ar_LY Арабский (Ливия) ar_MA Арабский (Марокко) ar_OM Арабский (Оман) ar_QA Арабский (Катар) ar_SA Арабский (Саудовская Аравия) ar_SD Арабский (Судан) ar_SY Арабский (Сирия) ar_TN Арабский (Тунис) ar_YE Арабский (Йемен) as Ассамский as_IN Ассамский (Индия) az Азербайджанский az_AZ Азербайджанский (Азербайджан) az_Cyrl Азербайджанский (Кириллица) az_Cyrl_AZ Азербайджанский (Кириллица, Азербайджан) az_Latn Азербайджанский (Латиница) az_Latn_AZ Азербайджанский (Латиница, Азербайджан) be Белорусский be_BY Белорусский (Беларусь) bg Болгарский bg_BG Болгарский (Болгария) bn Бенгальский bn_IN Бенгальский (Индия) ca Каталанский ca_ES Каталанский (Испания) cs Чешский cs_CZ Чешский (Чешская Республика) cy Валлийский cy_GB Валлийский (Великобритания) da Датский da_DK Датский (Дания) de Немецкий de_AT Немецкий (Австрия) de_BE Немецкий (Бельгия) de_CH Немецкий (Швейцария) de_DE Немецкий (Германия) de_LI (de_LI) Немецкий (Лихтенштейн) de_LU Немецкий (Люксембург) el Греческий el_CY (el_CY) Греческий (Кипр) el_GR Греческий (Греция) en Английский en_AU Английский (Австралия) en_BE Английский (Бельгия) en_BW Английский (Ботсвана) en_BZ (en_BZ) Английский (Белиз) en_CA Английский (Канада) en_GB Английский (Великобритания) en_HK Английский (Гонконг, (Область с Особым Административным Управлением, Китай)) en_IE Английский (Ирландия) en_IN Английский (Индия) en_JM (en_JM) Английский (Ямайка) en_MH (en_MH) Английский (Маршалловы Острова) en_MT Английский (Мальта) en_NA (en_NA) Английский (Намибия) en_NZ Английский (Новая Зеландия) en_PH Английский (Филиппины) en_PK Английский (Пакистан) en_SG Английский (Сингапур) en_TT (en_TT) Английский (Тринидад и Тобаго) en_US Английский (Соединенные Штаты Америки) en_VI Английский (Американские Виргинские Острова) en_ZA Английский (Южная Африка) en_ZW Английский (Зимбабве) es Испанский es_AR Испанский (Аргентина) es_BO Испанский (Боливия) es_CL Испанский (Чили) es_CO Испанский (Колумбия) es_CR Испанский (Коста-Рика) es_DO Испанский (Доминиканская Республика) es_EC Испанский (Эквадор) es_ES Испанский (Испания) es_GT Испанский (Гватемала) es_HN Испанский (Гондурас) es_MX Испанский (Мексика) es_NI Испанский (Никарагуа) es_PA Испанский (Панама) es_PE Испанский (Перу) es_PR Испанский (Пуэрто-Рико) es_PY Испанский (Парагвай) es_SV Испанский (Сальвадор) es_US Испанский (Соединенные Штаты Америки) es_UY Испанский (Уругвай) es_VE Испанский (Венесуэлла) et Эстонский et_EE Эстонский (Эстония) eu Баскский eu_ES Баскский (Испания) fa Персидский fa_AF Персидский (Афганистан) fa_IR Персидский (Иран) fi Финский fi_FI Финский (Финляндия) fo Фарерский fo_FO Фарерский (Фарерские острова) fr Французский fr_BE Французский (Бельгия) fr_CA Французский (Канада) fr_CH Французский (Швейцария) fr_FR Французский (Франция) fr_LU Французский (Люксембург) fr_MC (fr_MC) Французский (Монако) fr_SN (fr_SN) Французский (Сенегал) ga Ирландский ga_IE Ирландский (Ирландия) gl Галисийский gl_ES, Галисийский (Испания) gu Гуярати gu_IN Гуярати (Индия) he Иврит he_IL Иврит (Израиль) hi Хинди hi_IN Хинди (Индия) hr Хорватский hr_HR Хорватский (Хорватия) hu Венгерский hu_HU Венгерский (Венгрия) hy Армянский hy_AM Армянский (Армения) hy_AM_REVISED Армянский (Армения, REVISED) id Индонезийский id_ID Индонезийский (Индонезия) is Исландский is_IS Исландский (Исландия) it Итальянский it_CH, Итальянский (Швейцария) it_IT Итальянский (Италия) ja Японский ja_JP Японский (Япония) ka Грузинский ka_GE Грузинский (Грузия) kk Казахский kk_KZ Казахский (Казахстан) kl Гренландский kl_GL Гренландский (Гренландия) kn Каннада kn_IN Каннада (Индия) ko Корейский ko_KR Корейский (Южная Корея) kok Конкани kok_IN Конкани (Индия) ky Киргизский ky_KY Киргизский (Киргизия) lt Литовский lt_LT Литовский (Литва) lv Латышский lv_LV Латышский (Латвия) mk Македонский mk_MK Македонский (Македония) ml Малаялам ml_IN Малаялам (Индия) mr Маратийский mr_IN Маратийский (Индия) ms Малайский ms_BN Малайский (Бруней) ms_MY Малайский (Малайзия) mt Мальтийский mt_MT Мальтийский (Мальта) nb Норвежский букмол nb_NO Норвежский букмол (Норвегия) nl Голландский nl_BE Голландский (Бельгия) nl_NL Голландский (Нидерланды) nn Норвежский нюнорск nn_NO Норвежский нюнорск (Норвегия) om Оромо (Афан) om_ET Оромо (Афан) (Эфиопия) om_KE Оромо (Афан) (Кения) or Ория or_IN Ория (Индия) pa Панджабский pa_IN Панджабский (Индия) pl Польский pl_PL Польский (Польша) ps Пашто (Пушто) ps_AF Пашто (Пушто) (Афганистан) pt Португальский pt_BR Португальский (Бразилия) pt_PT Португальский (Португалия) ro Румынский ro_RO Румынский (Румыния) ru Русский ru_RU Русский (Россия) ru_UA Русский (Украина) sk Словацкий sk_SK Словацкий (Словакия) sl Словенский sl_SI Словенский (Словения) so Сомали so_DJ Сомали (Джибути) so_ET Сомали (Эфиопия) so_KE Сомали (Кения) so_SO Сомали (Сомали) sq Албанский sq_AL Албанский (Албания) sr Сербский sr_BA (sr_BA) Сербский (Босния и Герцеговина) sr_CS Сербский (Сербия и Черногория) sr_Cyrl Сербский (Кириллица) sr_Cyrl_BA (sr_Cyrl_BA) Сербский (Кириллица, Босния и Герцеговина) sr_Cyrl_CS Сербский (Кириллица, Сербия и Черногория) sr_Cyrl_ME (sr_Cyrl_ME) Сербский (Кириллица, Черногория) sr_Cyrl_RS (sr_Cyrl_RS) Сербский (Кириллица, Сербия) sr_Latn Сербский (Латиница) sr_Latn_BA (sr_Latn_BA) Сербский (Латиница, Босния и Герцеговина) sr_Latn_CS Сербский (Латиница, Сербия и Черногория) sr_Latn_ME (sr_Latn_ME) Сербский (Латиница, Черногория) sr_Latn_RS (sr_Latn_RS) Сербский (Латиница, Сербия) sr_ME (sr_ME) Сербский (Черногория) sr_RS (sr_RS) Сербский (Сербия) sv Шведский sv_FI Шведский (Финляндия) sv_SE Шведский (Швеция) sw Суахили sw_KE Суахили (Суахили) sw_TZ Суахили (Танзания) ta Тамильский ta_IN Тамильский (Индия) te Телугу te_IN Телугу (Индия) th Тайский th_TH Тайский (Таиланд) ti Тигриниа ti_ER Тигриниа (Эритрея) ti_ET Тигриниа (Эфиопия) tr Турецкий tr_TR Турецкий (Турция) uk Украинский uk_UA Украинский (Украина) ur Урду ur_PK Урду (Пакистан) uz Узбекский uz_Cyrl Узбекский (Кириллица) uz_Cyrl_UZ Узбекский (Кириллица, Узбекистан) uz_Latn Узбекский (Латиница) uz_Latn_UZ Узбекский (Латиница, Узбекистан) uz_UZ Узбекский (Узбекистан) vi Вьетнамский vi_VN Вьетнамский (Вьетнам) zh Китайский zh_CN Китайский (Китай) zh_Hans Китайский (Hans) zh_Hans_CN Китайский (Hans, Китай) zh_Hans_SG Китайский (Hans, Сингапур) zh_Hant Китайский (Hant) zh_Hant_HK Китайский (Hant, Гонконг (Область с Особым Административным Управлением, Китай)) zh_Hant_MO Китайский (Hant, Макао (Область с Особым Административным Управлением, Китай)) zh_Hant_TW Китайский (Hant, Тайвань) zh_HK Китайский (Гонконг (Область с Особым Административным Управлением, Китай)) zh_MO Китайский (Макао (Область с Особым Административным Управлением, Китай)) zh_SG Китайский (Сингапур) zh_TW Китайский (Тайвань)

Очень часто в запросах 1С приходится работать с датами. Особенно когда запрос строится к объектам метаданных в которых содержится периодическая информация. Как правило это регистры (сведений, накопления, расчета, бухгалтерии). Рассмотрим наиболее часто используемые функции языка запросов 1С для работы с датами. Примеры будем строить на основе регистра сведений РаботникиОрганизаций Конфигурации ЗУП редакция 2.5.

  • ДАТАВРЕМЯ

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

    ВЫБРАТЬ ДАТАВРЕМЯ(2016, 1, 1)

    В результате выполнения запроса получаем дату - 01.01.2016
    На самом деле трудно представить ситуацию в которой в запросе дата будет указываться таким образом. Ведь когда надо указать период используются параметры. Но есть случай когда эта функция представляет особую ценность. Это когда нам надо в полях или в условиях запроса указать пустую дату. Напомню, что для языка 1С пустая дата имеет вид - 0001.01.01. Таким образом, чтобы получить пустую дату в запросе достаточно указать ДАТАВРЕМЯ(1, 1, 1) . В качестве примера выберем из регистра сведений РаботникиОрганизаций записи у которых не заполнен ПериодЗавершения :

    ВЫБРАТЬ РаботникиОрганизаций.Период, РаботникиОрганизаций.Сотрудник, РаботникиОрганизаций.Должность, РаботникиОрганизаций.ПодразделениеОрганизации ИЗ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций ГДЕ РаботникиОрганизаций.ПериодЗавершения = ДАТАВРЕМЯ(1, 1, 1)

  • НАЧАЛОПЕРИОДА

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

    ВЫБРАТЬ НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2016, 1, 15), МЕСЯЦ)

    Запрос вернет - 01.01.2016
    А теперь пример. Как известно периодичность у регистра РаботникиОрганизаций один день. Составим запрос в котором вместо действительного периода записей будет отображаться дата начала месяца.

    ВЫБРАТЬ НАЧАЛОПЕРИОДА(РаботникиОрганизаций.Период, МЕСЯЦ) КАК НачалоМесяца, РаботникиОрганизаций.Сотрудник, РаботникиОрганизаций.Должность, РаботникиОрганизаций.ПодразделениеОрганизации ИЗ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций

  • КОНЕЦПЕРИОДА

    Синтаксис такой же как и у начала периода. И как ясно из названия возвращает конец периода по дате и типу периода. Подробно рассматривать не будем. Ограничимся мини примером.
    Запрос:

    ВЫБРАТЬ КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(2016, 1, 15), МЕСЯЦ)

    Возвращает 31.01.2016 23:59:59
    Как видим значение возвращается с точностью до секунды.

  • ДОБАВИТЬКДАТЕ

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

    ВЫБРАТЬ ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2016, 2, 15), МЕСЯЦ, 2)

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

  • РАЗНОСТЬДАТ

    Расчитыват разность между двумя датами в указанных единицах измерения.
    Синтаксис:
    РАЗНОСТЬДАТ(ДатаНачала, ДатаОкончания, ТипПериода)
    Тип периода может принимать значения: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД
    Например:

    ВЫБРАТЬ РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2016, 2, 15), ДАТАВРЕМЯ(2016, 3, 1), ДЕНЬ)

    возвращает 15

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

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

При создании даты из строки («приведение к дате») можно указать в локализованном формате (день.месяц.год часы:минуты:секунды), но только полностью.

Например:
//Работа с датами 1С - преобразовать дату в 1С из частей - год, месяц, день (плюс необязательно время)
Дата = Дата(2012,10,30); //без времени
Дата = Дата(2012,10,30,12,00,00); //со временем

//Работа с датами 1С - преобразовать дату в 1С из строки, разные способы
Дата = Дата("20121030"); //год, месяц, день
Дата = Дата("30.10.2012 12:00:00"); //локализованный формат, только полностью

//Работа с датами 1С - указание значения даты без приведения, напрямую
Дата = "20121030"; //без времени
Дата = "20121030120000"; //со временем

Работа с датами 1С — Пустая дата 1С

Чтобы проверить дату 1С на заполненность – ее сравнивают с «пустой датой». При наличии в справочнике/документе реквизита с типом дата, если пользователь не заполнил это поле, то ее значение также будет – «пустая дата».

«Пустая дата» — это 01.01.0001 00:00:00.

Например:
ПустаяДата = "00010101000000";
Если НужнаяДата = "00010101000000" Тогда
Сообщить("Вы не заполнили очень нужную дату");
КонецЕсли;

Работа с датами 1С — Дата в реквизитах (справочников, документов и т.п.)

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

  • Только дату (время тогда всегда равно 00:00:00)
  • Только время (дата тогда всегда равна 01.01.0001)
  • Дату и время

Получение даты

Для получения даты и времени используется функция 1С ТекущаяДата().

Очень важно место – где вызывается эта функция – на клиенте или на сервере. Подробнее см. тему «Режим исполнения/Исполнение». Часто бывает, что на клиентских машинах время немного разное, поэтому стараются везде использовать серверное время – даже если оно установлено на сервере не верно, то хотя бы у всех клиентов будет одинаковое неверное время.

Для того, чтобы получить серверную дату (дату, установленную в операционной системе компьютера сервера), обычно в конфигурации создают общий модуль с установленной галочкой «Сервер» в свойствах, и в нем создают функцию
//функция расположена в общем модуле, например с именем СерверныеФункции
//в свойствах общего модуля установлена галочка «Сервер» и не установлена галочка «Клиент»
Функция ПолучитьДатуСервера() Экспорт
Возврат ТекущаяДата();
КонецФункции

//вызов этой функции для использования из другого модуля выглядит так
ДокументОбъект.Дата = СерверныеФункции.ПолучитьДатуСервера(); //ИмяМодуля.ИмяФункции()

Также в тонком клиенте непосредственно у функций модулей указывается где она будет исполнена:

Начало и конец дня

Для даты «30.10.2012»:

  • дата начала дня выглядит так «30.10.2012 00:00:00»
  • дата конца дня выглядит так «30.10.2012 23:59:59»

Используется в отчетах и запросах, требующих получить данные за период – день, месяц, год.

Так например период с «01.01.2012 00:00:00» по «31.01.2012 00:00:00» неверен, так как не включает в себя один день месяца (но включает в себя одну секунду последнего дня месяца).

Работа с датами 1С — Сравнение дат

Дата содержит дату и время. При сравнении дат (без учета времени) их обычно приводят к началу дня (месяца, года).

Например:
Дата1 = Дата("30.10.2012 12:00:00");
Если НачалоДня(Дата1) = НачалоДня(ДокументСсылка.Дата) Тогда
Сообщить("Документ введен заданной датой");
КонецЕсли;

На всякий случай, пример сравнения даты в периоде:
Если ДокументСсылка.Дата >= НачалоМесяца(ТекущаяДата()) и
ДокументСсылка.Дата

Работа с датами 1С - Изменение даты

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

Например:
СНачалаДня = ТекущаяДата() – НачалоДня(ТекущаяДата());
Сообщить("С начала дня прошло " + Строка(СНачалаДня) + " секунд");
Сообщить("С начала дня прошло " + Строка(СНачалаДня/60) + " минут");
Сообщить("С начала дня прошло " + Строка(СНачалаДня/60/60) + " часов");

Также мы можем изменить дату, при изменении мы добавляем или отнимаем количество секунд:
НачалоЭтогоДня = НачалоДня(ТекущаяДата());

НачалоПредыдущегоДня = НачалоДня(НачалоЭтогоДня – 1); //убираем секунду – делая «вчера» и берем начало дня у «вчера»

НачалоПредыдущегоДня = НачалоЭтогоДня – 24*60*60; //другой способ – отнимаем 24 часа – 24(часа)*60(получились минуты)*60(секунды)

Работа с датами 1С - Момент времени

Момент времени – это расширенное представление даты, применимое к документам (и соответственно регистрам).

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

Момент времени можно получить у документа следующими способами:
//способ 1
МоментВремениДокумента = ДокументСсылка.МоментВремени();

Также можно сравнить момент времени с датой/временем:
МоментВремениЭталон = Новый МоментВремени(НачалоДня(ТекущаяДата()));
Если ДокументСсылка.МоментВремени().Сравнить(МоментВремениЭталон) = -1 Тогда
Сообщить("Документ введен раньше, чем сегодня");
КонецЕсли;
//Если документ введен сегодняшней датой в 00:00:00, то он все равно введен - сегодня

Работа с датами 1С - Форматирование дат