Дата – тип данных, который задает число, месяц, год (обязательно) и часы, минуты и секунды (не обязательно) по григорианскому календарю.
На прошлых занятиях мы изучили примитивные типы данных Число и Строка, ознакомьтесь с этими материалами, прежде чем приступить к изучению этого.
В системе 1С:Предприятие 8 для хранения и управления данными используются литералы – внутренний формат данных, который удобен компьютеру, но не всегда нагляден для человека. И если для Числа и Строки литералами являлись соответственно цифры и буквы, то для Даты это строка цифр, заключенная в одинарные кавычки вида 'ГГГГММДДччммсс', где:
- ГГГГ - четыре цифры года (включая тысячелетие и век);
- ММ - две цифры месяца;
- ДД - две цифры даты;
- чч - две цифры часа (в 24-х часовом формате);
- мм - две цифры минут;
- сс - две цифры секунд;
В литерале даты игнорируются все значения, отличные от цифр. Разделители в литерале можно указывать для упрощения ввода даты.
Дата('2019.03.23 10:45:25') = "23.03.2019 10:45:25"
Дата('2019\03\23-10~45~25') = "23.03.2019 10:45:25"
Для работы с примитивными данными могут применяться функции Глобального контекста – это функции, не привязанные к какому-либо объекту и работающие непосредственно с реквизитами. Свои функции Глобального контекста есть для Строки (сократить, объединить, разделить строки и др.), Числа (округлить, вычислить синус угла и др.), Даты (получить из даты год, день, получить текущую дату или дату конца года и др.), и других типов данных.
Рекомендуем ознакомиться с функциями Глобального контекста для примитивных данных в синтаксис-помощнике.
Использование функции Глобального контекста с примитивным типом данных Дата
Для примера возьмем функцию ДеньНедели, которая определяет номер дня недели для указанной даты, где 1 – понедельник, а 7 – воскресенье.
С помощью функции создадим обработку, определяющую, в какой день недели родился человек.
Создадим внешнюю обработку с двумя реквизитами:
- ДеньРождения типа Дата
- НазваниеДняНедели типа Строка
И перенесем реквизиты на форму.
Ранее мы задавали процедуры, связанные с командами, но запускать процедуру может не только кнопка. Процедура может запускаться при определенных условиях, например, при изменении реквизита. В данном случае сделаем так, чтобы после введения даты автоматически запускалась процедура расчета дня недели.
Для этого надо правой клавишей мышки щелкнуть по реквизиту ДатаРождения и в появившемся контекстном меню выбрать событие ПриИзменении:
Выберем создание обработчика события на клиенте.
Платформа 1С:Предприятие 8 автоматически ввела часть кода обработчика, связанную с условием запуска процедуры.
Чтобы получить день недели, код должен будет содержать следующие части:
- Массив данных, в котором будут храниться названия дней недели.
- Функцию ДеньНедели, которая вернет нам порядковый номер дня недели.
- Функцию, которая будет устанавливать соответствие между порядковым номером дня недели и элементом массива данных и выводить итоговые данные строкой.
Массив данных – это универсальная коллекция значений. Нумерация элементов массива начинается с 0 в квадратных скобках. Общее число элементов массива задается в круглых скобках. В массиве могут быть любые данные, в данном случае нам необходима Строка:
Массив=Новый Массив (7);
Массив[0]="понедельник";
Массив[1]="вторник";
Массив[2]="среда";
Массив[3]="четверг";
Массив[4]="пятница";
Массив[5]="суббота";
Массив[6]="воскресенье";
Теперь нам с помощью функции ДеньНедели получить число, возвращаемое функцией от даты рождения.
Число=ДеньНедели(ДеньРождения);
Теперь из массива вытащим название дня недели, соответствующее реквизиту Число. При этом переменная Число может получать значения от 1(понедельник) до 7(воскресенье), поэтому для получения названия дня недели из массива уменьшим Число на 1 и присвоим полученное значение реквизиту формы НазваниеДняНедели.
Итоговый код обработчика будет выглядеть следующим образом:
Форматирование данных
Чтобы выводить реквизиты в удобной и понятной форме, используется функция Формат. Так, например, с помощью этой функции вы можете задать короткий или длинный формат отображения даты, со временем или без. Также можно форматировать и другие типы данных, например, Число (настраивать представление разрядов, отрицательных чисел, и др). Вы можете не форматировать данные перед выводом, тогда будет использоваться стандартный формат.
Ознакомьтесь с детальным описанием функции Формат в синтаксис-помощнике Глобальный контекст – Функции форматирования – Формат.
Для иллюстрации примера форматирования даты создадим функцию-обработчик &НаКлиенте, которая будет выводить дату в нужном нам формате. Для этого в обработке создадим:
- Реквизит ФорматированнаяДата
- Поле ФорматированнаяДата (то есть перенесем на форму соответствующий реквизит)
- Команду ФорматироватьДату
- Кнопку ФорматироватьДату (то есть перенесем на форму соответствующую команду)
Далее приступим к написанию кода обработчика. Код функции выглядит так:
Формат(Значение, ФорматнаяСтрока), где Значением может быть реквизит, а ФорматнаяСтрока – это набор правил форматирования вида "Имя=Значение; ".
Правило форматирования даты задается Именем ДФ, а Значение задается следующим синтаксисом:
- д (d) - день месяца (цифрами) без лидирующего нуля;
- дд (dd) - день месяца (цифрами) с лидирующим нулем;
- МММ (MMM) - краткое название месяца;
- ММММ (MMMM) - полное название месяца;
- г (y) - номер года без века и лидирующего нуля;
- гг (yy) - номер года без века с лидирующим нулем;
- гггг (yyyy) - номер года с веком
- И др.
При этом все другие символы, используемые при написании значения будут использованы как есть. То есть их можно применять как разделители и комментарии (исключение – символы, применяемые в синтаксисе, их нужно брать в одинарные кавычки), например:
- ""дд/МММ/гггг"" отобразится как 01/01/2020
- ""дд ММММ гггг ‘г.’"" отобразится как 01 января 20 г.
В итоге мы оформили команду следующим образом:
Вы можете использовать собственные правила форматирования и внести изменения в наш вариант. Функция Формат отформатирует дату рождения в строку и присвоит реквизиту ОтформатированнаяДата.
Зайдите в 1С в пользовательском режиме и загрузите обработку, чтобы протестировать.
Примитивные данные типа Дата могут участвовать в различных вычислениях.
Например, необходимо получить количество дней, оставшихся до Нового года.
Для иллюстрации этого примера создадим реквизит ОсталосьДоНовогоГода типа Строка и допишем в процедуре обработчике ДатаРожденияПриИзменении(Элемент)
Код, который заполнит этот реквизит остатком дней до нового года:
В заключение хотим сказать, что представленные механизмы могут рассчитывать, например, возраст сотрудников, день их рождения, который можно связать с их поздравлением, рабочий стаж и т.д. В качестве самостоятельного задания вы можете попытаться реализовать одну из этих задач.
Освойте навыки разработчика 1С на очных специализированных курсах от крупнейшей компании-франчайзи 1С.