Тип «Дата» и операции с датами
Дата – это первый необычный тип данных, с которым вам придется столкнуться. В повседневной жизни вы используете даты очень часто и часто делаете с ними какие-то операции. Но в жизни вы привыкли воспринимать даты отдельными частями.
Например, когда вас спрашивают: «Сколько вам лет?», вы из одного года вычитаете другой год. То есть из одного числа вычитаете другое. Когда вас спрашивают, через сколько минут начнется фильм, вы тоже из одного числа (количество минут) вычитаете другое число (количество минут).
В «1С:Предприятии» не так. В «1С:Предприятии» значение типа Дата – это всегда календарная дата вместе со временем с точностью до секунд. Например, «31.03.2016 12:25:59». Это значит «двенадцать часов двадцать пять минут пятьдесят девять секунд тридцать первого марта две тысячи шестнадцатого года».
Чтобы убедиться в этом, вы можете выполнить простой пример. Напишите в модуле инструкцию, которая показана на рисунке 3.61. Когда будете писать ТекущаяДата(), не забывайте пользоваться контекстной подсказкой.
Рис. 3.61. Текущая дата
Установите точку останова на строке КонецПроцедуры, запустите «1С:Предприятие» в режиме отладки и посмотрите значение переменной Сейчас. В ней будет текущее время, установленное на вашем компьютере.
Значения типа Дата, так же как числа и строки, можно записывать прямо в тексте программы. Это используется не очень часто, но используется. Поэтому посмотрите, как выглядит литерал типа Дата (рис. 3.62).
Рис. 3.62. Литерал типа «Дата»
Он обязательно обрамляется символами одинарная кавычка – «’». А внутри разные части даты указываются в такой последовательности: год, месяц, день, час, минуты, секунды. При этом вы можете отделять их друг от друга какими-нибудь символами, чтобы легче читалось, или не отделять. И так, и так будет правильно. Лишь бы соблюдалась последовательность, в которой они указаны. Попробуйте.
Как я уже говорил, литералы типа Дата используют не часто. Потому что выглядят они довольно сложно, а читать их не очень удобно. Гораздо чаще для работы с датами используют функции встроенного языка. Просто запомните это название. Позже я объясню, что это такое.
Посмотреть, какие есть функции для работы с датами, очень просто. Для этого вам понадобится синтакс-помощник, который я уже упоминал раньше. Чтобы его открыть, нужно нажать на кнопку Синтакс-помощник в командной панели наверху (рис. 3.63).
Рис. 3.63. Открыть синтакс-помощник
Синтакс-помощник открывается в правой стороне экрана, на том же месте, что и палитра свойств. Чтобы переключаться между ними, используйте закладки, расположенные в нижней части экрана (рис. 3.64).
Рис. 3.64. Переключение между синтакс-помощником и палитрой свойств
Синтакс-помощник – это большой справочник по встроенному языку. В верхнем окне находится его «оглавление». В нем вы можете выбрать интересующий вас раздел и дважды щелкнуть на нем мышью. Тогда в нижнем окне откроется содержимое этого раздела (рис. 3.65).
Рис. 3.65. Содержимое раздела в синтакс-помощнике
Если вам не хватает места в верхнем или нижнем окне, вы можете потянуть мышью за левую границу синтакс-помощника, и он станет шире. Также вы можете изменять высоту верхнего и нижнего окна. Для этого нужно подвести курсор к границе верхнего окна, чтобы он изменил свой вид на стрелку. А затем потянуть мышью (рис. 3.66).
Рис. 3.66. Изменение вертикального размера окон
Встроенные функции, предназначенные для работы с датами, находятся в разделе Глобальный контекст – Функции работы со значениями типа Дата (рис. 3.67).
Рис. 3.67. Функции для работы со значениями типа «Дата»
А кроме них в разделе Функции преобразования значений находится еще одна полезная функция – Дата() (рис. 3.68). С ней вы познакомитесь прямо сейчас.
Рис. 3.68. Функция «Дата()»
Она создает значение типа Дата из года, месяца, дня и т. д., которые вы перечислите в скобках через запятую. Попробуйте.
После первой строки примера вставьте пустую строку и напишите в ней НачалоЗанятийВчера = (рис. 3.69). Не забывайте пользоваться контекстной подсказкой!
Рис. 3.69. Начало строки
А теперь вы поступите очень интересно. Синтакс-помощник не только рассказывает, из чего состоит встроенный язык, но и помогает писать программы. Поэтому вы не будете писать слово Дата, а просто перетащите его мышью из окна синтакс-помощника в вашу программу (рис. 3.70).
Рис. 3.70. Перетащите функцию в текст программы
Платформа вставит в программу «заготовку» этой функции. Вам останется только дописать ее содержимое (рис. 3.71).
Рис. 3.71. «Заготовка» функции
Поставьте курсор внутрь скобок, наберите 2016 и поставьте запятую.
Рис. 3.72. Контекстная подсказка функции
Появится контекстная подсказка. Она подскажет вам, что нужно написать в скобках. Год вы уже написали. Теперь нужно написать месяц. Поэтому он и выделен жирным шрифтом.
А тип у этого «месяца» – Число. Значит, вы можете написать не 03, как было выше, а просто 3. Как только вы поставите запятую после тройки, подсказка изменится. Теперь она будет говорить вам, что нужно ввести день (рис. 3.73).
Рис. 3.73. Подсказка следующего параметра
СОВЕТ Сразу возьмите себе за правило ставить пробелы после запятой. Тогда текст программы будет читаться легко. |
Вот так, пользуясь контекстной подсказкой, допишите инструкцию до конца. Не забудьте закончить ее точкой с запятой.
После этого запустите «1С:Предприятие» в режиме отладки и убедитесь, что в переменной НачалоЗанятийВчера то же значение, которое было и в предыдущем примере. Однако с функцией Дата() текст выглядит и читается лучше (рис. 3.74).
Рис. 3.74. Использование функции «Дата()»
СОВЕТ Если окно контекстной подсказки параметров закрылось, вы в любой момент можете снова открыть его. Для этого используйте комбинацию клавиш Ctrl + Shift + Пробел. |
ПОДРОБНЕЕ Подробнее вы можете прочитать про сочетания клавиш для работы с текстом программ во встроенной справке (командная панель сверху): Справка – Содержание справки – Сочетания клавиш (Конфигуратор) – Редактор текстовых документов и модулей. |
Теперь вернемся к функциям для работы с датами. Одну из них вы уже знаете и использовали. Это функция ТекущаяДата() (см. рис. 3.61).
Очень часто в «1С:Предприятии» вам могут понадобиться такие даты, как начало некоторого дня и конец некоторого дня. Для их получения существуют две функции с аналогичными именами: НачалоДня() и КонецДня(). Познакомьтесь с тем, где в «1С:Предприятии» день начинается и где он заканчивается.
В одну переменную поместите текущую дату, а в другую переменную – результат функции НачалоДня(), примененной к первой переменной (рис. 3.75).
Рис. 3.75. Начало дня
Запустите «1С:Предприятие» в режиме отладки и посмотрите, чему равно НачалоСегодня. Это будет сегодняшняя дата и нулевое время. Например, 31.03.2016 0:00:00.
СОВЕТ В «1С:Предприятии» довольно часто встречаются прикладные задачи, когда нужно знать дату, но точное время не важно. Например, вам нужно отмечать в календаре, ходили вы в этот день в школу (на работу) или не ходили. Вам не важно, в какое именно время проставляется такая отметка. Важно лишь то, что она есть в этот день. Или ее нет. В таких случаях в качестве даты такой отметки обычно используют начало дня. |
Теперь посмотрите, чему равен конец дня. Создайте другую переменную, в которую будет помещен результат функции КонецДня(). Но внутри скобок у этой функции напишите не имя переменной ТекДата, а саму функцию ТекущаяДата() (рис. 3.76).
Рис. 3.76. Использование результата функции в качестве параметра
Так тоже можно делать. Потому что внутри скобок может быть не только литерал или переменная, но и выражение. То есть некоторая формула, результатом которой может быть значение. Например, функция, возвращающая значение.
Запустите «1С:Предприятие» в режиме отладки и посмотрите, чему равно НачалоСегодня. Это будет сегодняшняя дата и время 23:59:59. Например, 31.03.2016 23:59:59.
Теперь познакомьтесь с тем, какие операции можно выполнять с датами. Для значений типа Дата и типа Число во встроенном языке определены операции сложения и вычитания. То есть к дате можно прибавить некоторое количество секунд. Это используется для того, чтобы прибавить или убавить какой-то фиксированный промежуток времени.
Например, в одной переменной у вас находится текущее время. Как в другой переменной получить время на один час больше? Попробуйте выполнить это самостоятельно.
Для сравнения посмотрите на рисунок 3.77.
Рис. 3.77. Дата на час больше
Чтобы получить дату на час больше, нужно к дате прибавить 60 раз по 60 секунд. То есть то количество секунд, которое содержится в одном часе.
Операция сложения (вычитания) даты с числом часто используется тогда, когда нужно получить начало следующего дня или конец предыдущего дня. Поскольку они отличаются всего на одну секунду, нужно эту секунду прибавить или отнять.
Попробуйте самостоятельно получить конец предыдущего дня. А потом сравните свой вариант с тем, что показано на рисунке 3.78.
Рис. 3.78. Конец предыдущего дня
Еще одна операция, которая определена для значений типа Дата, – это вычитание. Из одной даты можно вычесть другую дату. Что получится в этом случае?
Правильно. В результате получится некоторое количество секунд. К сожалению, во встроенном языке нет никакой функции, которая могла бы преобразовать количество секунд к виду, привычному для нас. Например: от одной даты до другой «прошло 2 месяца, 11 дней, 5 часов и 48 минут». И в рамках этой книги решать такие задачи вам не понадобится.
Но если вам интересно, вы можете попробовать самостоятельно написать программу из нескольких инструкций, которая будет это делать. Для этого вам потребуются операция деления, функция получения целой части Цел() и операция получения остатка от деления %.
3.15. Задание простое Запишите начало дня 2 сентября 2016 года с помощью литерала даты. |
3.16. Задание простое Запишите начало дня 2 сентября 2016 года с помощью функции Дата(). |
3.17. Задание простое В одной переменной сохраните произвольную дату. В другой переменной вычислите начало следующего понедельника для произвольной даты. |
3.18. Задание сложное В одной переменной сохраните произвольную дату. В другой переменной вычислите девять утра для произвольной даты. |
3.19. Задание сложное Разность двух дат представьте в виде количества часов, минут и секунд. Например, «3 ч. 29 мин. 40 с». |