1С момент времени в запросе

В версии 1С:Предприятия 8, в отличие от версии 1С:Предприятия 7.7, дата включает в себя время с точностью до секунды. То есть дата указывается вместе со временем. Если время не указано явно, то, по умолчанию, оно принимает значение 0 часов, 0 минут, 0 секунд. Разница между датами теперь вычисляется в секундах. Кроме того, эту особенность надо учитывать при указании периодов. Так, если раньше период с 01.01.2003 по 31.01.2003 означал период за весь месяц январь 2003 года, то теперь этот же период будет означать период с первой секунды 1 января 2003 года по первую секунду 31 января 2003 года. То есть период не будет включать почти весь день 31 января, кроме его первой секунды. Для указания в качестве периода всего месяца нужно указать период следующим образом: с 01.01.2003 00:00:00 по 31.01.2003 23:59:59. Указание периода с 01.01.2003 по 01.02.2003 тоже будет не верным, так как в данном случае в период попадет первая секунда 1 февраля 2003.

Обычно пользователь для указания периода вводит даты без указания времени. При этом пользователь, введя период с 01.01.2003 по 31.01.2003, подразумевает период за месяц в целом. Если эти значение передать в системные функции или запрос, то они будут восприняты буквально: с 01.01.2003 00:00:00 по 31.01.2003 00:00:00. Поэтому при передаче конечного периода в системную функцию нужно привести его значение к концу дня. Для приведения конечной границы периода удобно использовать функцию КонецДня. Эта функция возвращает дату равную последней секунде дня, то есть Дата(2003, 1, 31, 23, 59, 59) и КонецДня(Дата(2003, 1, 31)) приводят к одному и тому же результату.

В 1С:Предприятии версии 7.7 была возможность задавать момент времени и период с точностью до документа. Эта возможность была сохранена и развита. Так как теперь документ может записывать движения в разные периоды времени, а не только совпадающие с его собственной датой, для указания момента времени с точностью до документа был введен новый объект МоментВремени, который задается датой и ссылкой на регистратор. При этом дата момента времени не обязательно должна совпадать с датой документа. Для получения момента времени, содержащего дату документа и сам документ, можно воспользоваться методом документа МоментВремени. Например, если нам надо вычислить остатки на документ, то передавать в метод, вычисляющий остатки в качестве параметра, ссылку на документ неправильно. Нужно передать в качестве параметра объект МоментВремени, который можно получить либо методом ссылки документа МоментВремени, либо сконструировав его с помощью оператора Новый.

Читайте также:  2Gb 2rx8 pc2 6400u 666 12 характеристики

Параметры типа Дата и МоментВремени используются в системных функциях и виртуальных таблицах при вычислении остатков и оборотов. Остатки вычисляются на определенный момент времени. При указании момента времени для вычисления остатков, по умолчанию, считается, что момент времени задан исключительно. То есть если в качестве момента времени задана дата 21.11.2003 12:00:00, то остатки будут посчитаны на начало 12 часов 21 ноября 2003 года. Движения, сделанные в этот момент времени, не будут учтены при подсчете остатков. Например, есть следующие записи регистра накопления:

Период Регистратор Вид движения Товар Количество
21.11.2003 11:59:59 Приход товара №1 Приход Холодильник 5
21.11.2003 12:00:00 Расход товара №1 Расход Холодильник 2
21.11.2003 12:00:00 Расход товара №2 Расход Холодильник 1

Посчитав остатки на 21.11.2003 12:00:00, получим, что остаток по товару холодильник равен 5 штукам. Посчитав остатки на 21.11.2003 12:00:01, получим, что остаток по товару холодильник равен 2 штуки. Для того чтобы задать момент времени включительно, нужно воспользоваться объектом Граница. У этого объекта можно явно указать, задан момент времени включительно или исключительно. В предыдущем примере, посчитав остатки на границу заданную, как дата 21.11.2003 12:00:00 и вид границы включительно, получим остаток по товару холодильник равный 2 штукам. Важно отметить, что в данном случае были посчитаны записи и по документу Расход товара №1, и по документу Расход товара №2. Это произошло из-за того, что граница была заданна значением типа дата. Если задать границу моментом времени, состоящим из даты 21.11.2003 12:00:00 и регистратора Расход товара №1, то при подсчете остатков записи по документу расход товара №2 не будут учтены и остаток по товару холодильник будет равен 3 штукам. Следующая схема иллюстрирует расположение границ на оси времени:

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

Читайте также:  Как посмотреть общее время разговоров на Андроид

Момент времени:
Фирма 1С описывает так:
Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время, а также ссылку на объект базы данных. Используется в качестве значений свойств и параметров методов других объектов, имеющих тип МоментВремени.
Момент времени используется в тех случаях, когда важно различать моменты времени для объектов, имеющих одинаковую дату и время, например для сравнения положений документов на временной оси.

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

МоментВремени() – это момент непосредственно ПЕРЕД позицией документа (аналог РассчитатьРегистрыНа(ТекущийДокумент() в 7-рке), а если необходимо получить момент непосредственно после позиции документа, то используйте объект Граница
Код 1C v 8.х

При получение остатков:
"Момент времени" – виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя ДАТУ и ССЫЛКУ НА ДОКУМЕНТ)
таблица остатков не хранится в БД, а строится в момент обращения к ней.
1. подбирается больший или равный значению ПАРАМЕТР момент времени, на который РАССЧИТАНЫ остатки
2. на этот момент получаются остатки из таблицы итогов
3. если момент времени, на который считаются остатки, не совпадает с моментом времени итогов, то остатки ДОСЧИТЫВАЮТСЯ по движениям.

Читайте также:  Укажите расширение файла proba docx

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

ВидГраницы – Определяет набор видов границ по отношению к граничному значению:
ВидГраницы.Включая – Граница включает граничное значение.
ВидГраницы.Исключая – Граница исключает граничное значение.
Код 1C v 8.х

Пример получения остатков на дату документа, включая его движения
Код 1C v 8.х

Пример получения остатков на дату документа, но до его движений
Код 1C v 8.х

Приветсвую вас, уважаемые читатели блога SoftMaker.kz! Использование запросов в 1С помогает справляться с различными задачами, которые возникают на практике. Мы уже рассматривали примеры запросов, связанных с соединением и объединением, а также пакетные запросы. Еще есть целая статья, которая посвящена теме запросов. А сегодня, с помощью примеров, мы рассмотрим, как получить последние документы в 1С запросе. Давайте начнем!

Сортируем документы по убыванию момента времени и используем конструкцию «ВЫБРАТЬ ПЕРВЫЕ 1»:

В результате запрос вернёт одну строку, с данными последнего документа по одному контрагенту. Мы берем не дату, так как в одну секунду может быть много документов, поэтому нельзя быть уверенным, что будет взят последний из этих документов. Поэтому в запросе нужно сортировать по моменту времени и отбор первого документа. Такой запрос вернет последний документ. Момент времени это сочитание даты документа и ссылки, поэтому можно написать и так:

А как сделать запрос, который вернёт последние документы по всем контрагентам, а не по одному конкретному?

Используем функцию МАКСИМУМ в запросе для решения данной задачи.

Этот запрос выбирает последние документы по всем контрагентам.

Оцените статью
ПК Знаток
Добавить комментарий

Adblock
detector