Склеить дату и время 1с

Обновлено: 06.07.2024

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

В начале скажем, что значение типа дата в 1С содержит точную (с точностью до 0,1 миллисекунды) дату григорианского календаря.

Типовой порядок частей даты принятый в 1С — год, месяц, день, час, минута, секунда.

Собственно простейший способ создания новой переменной типа дата является приравнивание к переменной строки цифр в одинарных кавычках (обязательно) вида ‘ГГГГММДДччммсс’ где:

  • ГГГГ — четыре цифры года (включая тысячелетие и век);
  • ММ — две цифры месяца;
  • ДД — две цифры даты;
  • чч — две цифры часа (в 24-х часовом формате);
  • мм — две цифры минут;
  • сс — две цифры секунд.

Часы, минуты и секунды можно не указывать, при этом они приравниваются к нулю.

Функции работы с датами

Функция Дата() служит для создания значения типа “Дата”. Использовать ее можно двумя способами:

  • Дата(x) — где параметр “x” это строка вида “ГГГГММДДччммсс”, часы, минуты и секунды можно опустить, т.е. преобразуем строку в дату;
  • Дата(x, y, z, w, v, c) — в этом случае параметры “x”, “y”, “z”, “w”, “v” и “c” являются числами и означают год, месяц, день, час, минуту и секунду соответственно. Как и в предыдущем случае час, минуту и секунду можно опустить.

ТекущаяДата

Функция ТекущаяДата() просто возвращает текущую дату того компьютера на котором она исполняется. В клиент-серверных системах будет разумно инкапсулировать эту функцию в общем модуле (с исполнением на сервере) и использовать ее только таким образом.

ТекущаяУниверсальнаяДатаВМиллисекундах

Функция ТекущаяУниверсальнаяДатаВМиллисекундах() позволяет узнать дату в миллисекундах. Данная функция доступна начиная с версии платформы 8.2.17. Замечание о клиент-серверных системах из функции выше справедливо и для этой функции.

Год, Месяц, День, Час, Минута, Секунда

Функции Год(x), Месяц(x), День(x), Час(x), Минута(x) и Секунда(x) возвращают соответствующую часть переданной им даты “x” в виде числа.

Начало…

Функции вида “Начало…(x)” получают дату в параметре “x” и возвращают дату начала периода времени в соответствии с названием конкретной функции. Существуют следующие функции:

  • НачалоГода;
  • НачалоКвартала;
  • НачалоМесяца;
  • НачалоНедели;
  • НачалоДня;
  • НачалоЧаса;
  • НачалоМинуты.

Конец…

Функции вида “Конец…(x)” получают дату в параметре “x” и возвращают дату окончания периода времени в соответствии с названием конкретной функции. Существуют следующие функции:

  • КонецГода;
  • КонецКвартала;
  • КонецМесяца;
  • КонецНедели;
  • КонецДня;
  • КонецЧаса;
  • КонецМинуты.

НеделяГода, ДеньГода

Функции НеделяГода(x) И ДеньГода(x) возвращают соответственно номер недели и номер дня в году для указанной даты “x”.

ДеньНедели

Функция ДеньНедели(x) возвращает номер дня недели для указанной даты “x”.

ДобавитьМесяц

Функция ДобавитьМесяц(x, y) добавляет к дате “x” количество месяцев “y”, которое может быть отрицательным, в этом случае происходит вычитание месяцев из даты “x”.

МоментВремени

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

ВвестиДату

Функция ВвестиДату(x, y, z) вызывает диалог для ввода даты, введенная дата записывается в переменную “x”, кроме этого можно указать подсказку “y”, а также какую часть даты нужно ввести “z” Функция возвращает Истина — если ввод был произведен, Ложь — если пользователь отказался от ввода.

Выглядит это окно примерно так:

Окно ввода даты

Окно ввода даты

Типовые задачи представления данных

Разность даты в днях, количество дней между датами

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

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

Разница между датами в месяцах, количество месяцев между датами

Здесь все в точности также, как и в предыдущем пункте.

Прибавить день к дате, вычесть день из даты, отнять от даты день

Прибавить месяц к дате, вычесть месяц из даты, отнять месяц от даты

Для прибавления/вычитания месяцев существует встроенная функция:

День недели по дате

Сравнение дат

Дата равна нулю (проверка на заполненность), проверка на пустую дату

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

(оценок: 14, средняя оценка: 4,50 из 5)

При работе с датами 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С

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция Формат в 1С 8.3 предоставляет достаточно интересный инструмент разработчику для форматирования значений. Особенно часто эта функция используется для вывода примитивных типов данных (даты, времени, чисел, строки, булево) в нужном формате.

Рассмотрим подробнее функцию и способ составления форматной строки.


Функция Формат()

Синтаксис функции достаточно прост:

Значение — форматируемое значение, Форматная строка — строка, заданная определенным образом, из которой формируется правило обработки формата.

Самое интересное — форматная строка. Рассмотрим её подробнее.

Конструктор форматной строки

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


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

Получите 267 видеоуроков по 1С бесплатно:


Где необходимо выбрать нужную Вам вкладку в зависимости от типа данных — Число, Дата или Булево.

Рассмотрим использование функции на примерах.

Формат даты в 1С на примере месяца: прописью, без времени

Получить формат даты без времени:

Формат даты 1С, где месяц прописью:

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

Примеры формата числа

Получим формат числа с двумя точками после запятой:

Число без неразрывных пробелов:

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

Округление числа (не математическое) до целых:

Вывод лидирующих нулей без неразрывных пробелов:

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

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

А) Как дату для дальнейшего использования

В этом случае лучше всего воспользоваться функцией НачалоМинуты(), например, так:

Б) Как строку для вывода на печать

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

Либо воспользоваться функцией Формат() и в одно действие получить нужное представление даты:

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Формат

Описание:

Формирует удобное для чтения представление значений. Полезно использование в отчетах и при прочем визуальном отображении значений.

Синтаксис:

Параметры:

Форматная строка представляет собой строковое значение, включающее параметры форматирования.

Если параметр не задан, то применяется стандартное форматирование, которое в основном соответствует преобразованию значения к строке. Однако для значений типа Число и Дата по умолчанию (0 и 01.01.0001 00:00:00 соответственно) будет выдаваться пустая строка.

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

В этой статье рассмотрим работу со Временем в запросах 1С и встроенном языке 1С 8.3.

1. Дата-Время в процедурах и функциях 1С

Всего во встроенном языке 1С 8.3 существует 7 примитивных типов данных:

7. Тип (используется для сравнения с типом объекта метаданных).

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

Дата-Дата выглядит как [00010101], где первые четыре символа – это год, потом два символа месяц и еще два символа дня (ГГГГММДД).

А вот Дата-Время в 1С выглядит как [00010101000000], где первые 8 символов это дата, а остальное это время: час, минута, секунда.

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



Для описания даты существует два способа. Один из них с использованием литерала. Литерал пишется в одинарных кавычках.

При необходимости можно указать и время, т.к. в системе 1С:Предприятие 8.3 любая дата содержит в себе и дату, и время. Например:



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

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

В системе 1С:Предприятие 8.3 пустая дата – это самое начало календаря. Варианты записи:



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

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

Также имеются различные свойства и методы. Пример:



В возвращаемом значении указанное Время не будет изменено. При указании Количества месяцев:

а) равного нулю, будет возвращен первый день месяца, указанного в Дата 1С.

б) числом со знаком минус – вычитает из Даты указанное число месяцев.

в) числом – прибавляет к Дате указанное число месяцев.

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

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

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





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

2. Дата-Время в Запросах 1С

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

Дата имеет те же свойства, что рассмотрены выше.

Таким образом мы имеем не только Дату, но и более точный МоментВремени. И тогда в Запросе мы работаем с объектом для Проведения, то необходимо для большей точности использовать именно МоментВремени.



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

Вид границы может быть:

Вообще эта ситуация довольно сложна в понимании. Ведь как можно считать саму секунду, но не включая ее – не так очевидно. Для большего понимания нарисуем:



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

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



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

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

Читайте также: