13.06.2020 Иван Каплин 22922
Работа со Временем в запросах, процедурах и ф...

Содержание:



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


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


Специалист компании ООО «Кодерлайн»

Каплин Иван

 

Наши проекты

ООО «Еврорадиаторы»
ООО «Еврорадиаторы»

Отрасль:
1С:ERP 2.4

Внедренное типовое решение:

Специалисты «Кодерлайн» помогли перенести базу из текущей системы «1С:ERP 2.2» в новую систему «1С:ERP 2.4». ...

Фармацевтическое предприятие «Оболенское»
АО «Фармацевтическое предприятие «Оболенское»

Отрасль:
Фармацевтическая промышленность

Внедренное типовое решение:
1С:Управление производственным предприятием

- Адаптации блоков/подсистем планирования продаж, закупок и казначейства. ...

Внедрение «1С:Зарплата и управление персоналом 8 КОРП» в компании «ПБК»
ООО «Партнер Бухгалтер Консультант»

Отрасль:
Бухгалтерские услуги

Внедренное типовое решение:
1С:Зарплата и управление персоналом

- Интеграция продукта с базой данных оперативного учета Axapta;
- Доработка функционала подсистемы...

Автоматизации бизнес-процессов учета и планирования на базе «1С:ERP Управление предприятием 2.0»
ООО «Буровая сервисная компания «ГРАНД»

Отрасль:
Нефтесервис

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

- Создание полноценной управленческой системы взамен существующих
- Внедрением подсистем «Нормативное планирования», «Мобильное АРМ», «Ре...

ООО «Стейдж Энтертейнмент Россия»
ООО «Стейдж Энтертейнмент Россия»

Отрасль:
Театральная деятельность

Внедренное типовое решение:
Платформа 1С:Предприятие 8

Реализован процесс трансформации данных бухгалтерского учета по РСБУ в данные международного учета (ГААП) на платформе «1С:Предприятие 8»:...

ФГУП «Почта России»
ФГУП «Почта России»

Отрасль:
Почта, доставка

Внедренное типовое решение:
1С:Зарплата и управление персоналом

- Бухгалтерский учет
- Расчет зарплаты и кадровый учет
- Налоговый учет ...

Установка программного продукта БИТ.Финанс для 1С:Бухгалтерия 8
ООО «Джи Эй Си Шиппинг энд Лоджистикс»

Отрасль:
Транспорт

Внедренное типовое решение:
БИТ.Финанс

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

ООО "ОМЗ"
ООО "ОМЗ"

Отрасль:
Металлургическая промышленность, металлообработка

Внедренное типовое решение:
1С:Управление производственным предприятием

Автоматизация бизнес-процессов...

Внедрение системы финансового учета БИТ:Финанс
ООО «Алькор и Ко» (Л’Этуаль)

Отрасль:
Торговля

Внедренное типовое решение:
БИТ.Финанс

- Финансовый учет;
- Поддержка проекта внедрения МСФО;
- Регламентные работы по обслуживанию сервера MS SQL;
- Оптимизация производ...

ООО «ПКП КАБЭЛЕКТРОСНАБ»
ООО «ПКП КАБЭЛЕКТРОСНАБ»

Отрасль:
Производство кабельной продукции

Внедренное типовое решение:
1С:Управление небольшой фирмой 1.6

- Оформление заказов покупателей;
- Управление складскими запасами;
- Анализ запасов/остатков...

Автоматизация документооборота в компании ООО "Ликард"
ООО «Ликард» (ОАО ЛУКОЙЛ)

Отрасль:
Нефтесервис

Внедренное типовое решение:
1С:Документооборот КОРП

- Отказ от бумажного документооборота, от громоздких систем на базе офисного пакета;
- Создан единообразный интерфейс как в офисе, так и...

Внедрение блока расчета себестоимости РАУЗ в 1С:УПП 8
ООО «Пелигрин Матен»

Отрасль:
Производство

Внедренное типовое решение:
1С:Управление производственным предприятием

– Оформление заказов покупателей;
– Взаиморасчеты с покупателями;
– Оформление заказов поставщикам;
– Управление отношениями с ...

Наши соц. сети

Telegram-канал «Koderline 1С» Группа в Вконтакте «Кодерлайн КОРП» Rutube

Остались вопросы - обратитесь к нам!

Впишите свои Имя и Телефон, чтобы мы ответили на все интересующие Вас вопросы.
ФИО*
E-mail*
Телефон*
Сообщение