Содержание:
В этой статье рассмотрим работу со Временем в запросах 1С и встроенном языке 1С 8.3.
1. Дата-Время в процедурах и функциях 1С
Всего во встроенном языке 1С 8.3 существует 7 примитивных типов данных:
1. Число.
2. Строка.
3. Дата.
4. Булево.
5. NULL.
6. Неопределенно.
7. Тип (используется для сравнения с типом объекта метаданных).
Дата может быть как Дата-Дата (это значит, что в переменной есть только год, месяц и день), так и Дата-Время в 1С (это значит, что используется год, месяц, день, час, минута и секунда).
Дата-Дата выглядит как [00010101], где первые четыре символа – это год, потом два символа месяц и еще два символа дня (ГГГГММДД).
А вот Дата-Время в 1С выглядит как [00010101000000], где первые 8 символов это дата, а остальное это время: час, минута, секунда.
Для того чтобы правильно задавать значение Дата, нужно указывать значение переменной в одинарных кавычках. Например:
Для описания даты существует два способа. Один из них с использованием литерала. Литерал пишется в одинарных кавычках.
При необходимости можно указать и время, т.к. в системе 1С:Предприятие 8.3 любая дата содержит в себе и дату, и время. Например:
Второй способ определения даты – это использование функции глобального контекста Дата(<Значение>). В этом случае мы передаем в качестве параметров этой функции то же самое: год, месяц, день через запятую.
Также можно указать время. Если его не указывать, тогда оно будет равно по умолчанию.
В системе 1С:Предприятие 8.3 пустая дата – это самое начало календаря. Варианты записи:
И та и другая запись даст одинаковый результат, и эта дата будет считаться «пустой».
Удобство функции Дата в 1С (<Значение>) в том, что мы можем передавать в нее не конкретные значения, а какие-то переменные. Т.е., иногда мы дату конструируем, собирая разные переменные.
Для даты применимы арифметические операции сложения и вычитания. Операция сложения прибавляет к дате указанное количество секунд, вычитание же действует соответственно.
Также имеются различные свойства и методы. Пример:
В возвращаемом значении указанное Время не будет изменено. При указании Количества месяцев:
а) равного нулю, будет возвращен первый день месяца, указанного в Дата 1С.
б) числом со знаком минус – вычитает из Даты указанное число месяцев.
в) числом – прибавляет к Дате указанное число месяцев.
Однако если в результате вычисления новая Дата не является последним днем месяца, то она будет к нему приведена.
Так как остальные арифметические действия не требуют специальных подборов и проверок, то, например, прибавление к Дате количества дней не выделено в отдельный метод. Поэтому при необходимости расчетов рекомендуется писать свои небольшие вспомогательные функции общего назначения.
Итак, было рассмотрено общее использование Типа Дата в 1С. Далее мы рассмотрим примеры работы, например, при загрузке данных из различных источников, в том числе XML, HTTP-сервис, таблицы Excel. Все они могут передавать значение типа Дата в 1С, однако, как правило, в большинстве случаев, мы их получаем в текстовом виде. А это значит, что при каждом чтении значения требуется правильно написать алгоритм приведение к типам 1С.
На практике, получая данные к обработке, мы видим чаще всего именно текст. Но не всегда значения являются Строкой. И для этих случаев необходимо написать алгоритм приведения к типам 1С. Так как во встроенном языке 1С при выполнении операции присвоения в том числе присваивается и Тип данных, то достаточно распознать и правильно присвоить временной переменной значение с необходимым типом. Для того чтобы это можно было использовать в более чем одном месте, алгоритм можно выделить в общий модуль 1С 8.3. При этом общий модуль 1С 8.3 должен быть со свойствами Клиент, Сервер или Клиент+Сервер.
В следствии такого усложнения требуется сначала проверять «на число». Причем довольно тривиальным способом. А именно, полученное Значение поместить в цикл, где с помощью метода СтрЗаменить() заменяем цифры от 0 до 9, точку и запятую (в программировании и западных системах принято разделять целую и десятичную часть именно точкой, а разряды разделять запятыми) значением «» (т.е. пустым значением). Таким образом, если у нас Значение останется пустым – это точно будет число. Но тогда мы только исключаем Булево и Строку, но не можем исключить Дату. Вот тогда мы будем проверять Значение на тип Дата 1С.
Здесь мы можем проверить «на длину», зная, что Дата — это всегда 8 символов. Иногда входящие данные могут быть «со временем». Тогда мы добавляем еще 6 символов. Таким образом, необходимо будет проверить «на длину», так как нужно будет понять, сколько разделителей будет в данных. В Дате можно заменить разделитель на точку, слэш (« / »), а также убрать его вовсе. Однако «во времени» необходимо будет убрать разделитель или также заменить на слэш и двоеточие, плюс - проверить на разрыв между датой и временем.
В данный момент преобразования типовыми методами не всегда работают как требуется. Поэтому Ваша смекалка при написании алгоритма приведения безусловно поможет.
2. Дата-Время в Запросах 1С
После проведения значения в тип Дата в 1С можно продолжить работать с ним. И теперь рассмотрим применение дата-время в запросах 1С. В Объекте Метаданных Дата-Время в 1С хранится в разных контейнерах. Например, для Документов имеется Стандартный реквизит Дата и тип МоментВремени.
Дата имеет те же свойства, что рассмотрены выше.
МоментВремени – это особое «Время». Оно включает в себя Дата-Время объекта, и его Ссылку. Это сделано для однозначного определения Момента на векторе времени. Так как несколько объектов могут иметь одинаковые Дата-Время (в клиент-серверном варианте работы), то потребовалось уточнение – и тогда добавили Ссылку. Ссылка сама по себе тоже уникальный реквизит, содержащий в числе прочего и GUID объекта.
Таким образом мы имеем не только Дату, но и более точный МоментВремени. И тогда в Запросе мы работаем с объектом для Проведения, то необходимо для большей точности использовать именно МоментВремени.
Сам МоментВремени предназначен для хранения (как описано выше) и получения момента времени объекта. Используется как метод МоментВремени(), возвращающий значение момента времени объекта ПЕРЕД самой позицией Документа на векторе времени (в таком случае говорят о «Границе слева»). Также существует момент времени объекта НЕПОСРЕДСТВЕННО в позиции Документа на векторе времени (в этом случае говорят о «Границе включая»).
Момент времени как часть понятия Времени требуется для правильного поиска данных в БД, с включением или без такового точки Времени. Для этого используется конструкция «Граница». Конструкция выглядит так:
Данная конструкция задает особый параметр Времени, используемый, преимущественно в Запросах. Первый параметр конструкции – это значение Дата-Время в 1С, которое будет взято для определения границы. Второй – это сам вид границы, который будет применяться.
Вид границы может быть:
1. «Включая» — это значит, что граница будет взята на точку Дата-Время в 1С.
2. «Исключая» — это значит, что граница будет взята ДО точки Дата-Время, т.е. «Граница слева».
Вообще эта ситуация довольно сложна в понимании. Ведь как можно считать саму секунду, но не включая ее – не так очевидно. Для большего понимания нарисуем:
На Рисунке схематично показано, что можно считать Границей Включая и Исключая. При этом если мы исключаем из границы точку времени, то все объекты, у которых момент времени попадает на такую точку, будут игнорированы. С включением в границу все строго наоборот.
Такая точность требуется для построения запроса с использованием Регистров накоплений, чтобы однозначно понимать вовлеченные документы в рамках указанной в параметрах границы.
Также работа с типом Дата в Запросах похожа на описание на встроенном языке в процедурах и функциях 1С 8.3. Однако есть некоторые ограничения по работе внутри Запроса. Поэтому в конструкторе Произвольных выражений можно вычленять и оперировать составными частями Дата-Время, используя широкий набор функций, например: ГОД, ЧАС, МИНУТА, ДОБАВИТЬКДАТЕ, РАЗНОСТЬДАТ, ДАТАВРЕМЯ и другие. Описание каждого метода можно с легкостью найти в сети и справочной информации.
Видим, что работа с Датой является непростой и имеет множество тонкостей. Обследуя поставленную задачу, нельзя пренебрегать такими тонкостями, чтобы в результате разработанного алгоритма не возникали ошибки.
Специалист компании ООО «Кодерлайн»
Каплин Иван