Как сделать период в запросе

Добавил пользователь Skiper
Обновлено: 10.09.2024

Очень часто в запросах 1С приходится работать с датами. Особенно когда запрос строится к объектам метаданных в которых содержится периодическая информация. Как правило это регистры (сведений, накопления, расчета, бухгалтерии). Рассмотрим наиболее часто используемые функции языка запросов 1С для работы с датами. Примеры будем строить на основе регистра сведений РаботникиОрганизаций Конфигурации ЗУП редакция 2.5.

ДАТАВРЕМЯ

Позволяет получить в запросе дату (со временем или без) путем указания года, месяца, дня, часа, минуты, секунды.
Синтаксис:
ДАТАВРЕМЯ(Год, Месяц, День, Час, Минута, Секунда)
Обычно час, минута и секунда не указываются. Давайте приведем мини пример. Введите в консоли запросов следующий текст:

В результате выполнения запроса получаем дату – 01.01.2016
На самом деле трудно представить ситуацию в которой в запросе дата будет указываться таким образом. Ведь когда надо указать период используются параметры. Но есть случай когда эта функция представляет особую ценность. Это когда нам надо в полях или в условиях запроса указать пустую дату. Напомню, что для языка 1С пустая дата имеет вид – 0001.01.01. Таким образом, чтобы получить пустую дату в запросе достаточно указать ДАТАВРЕМЯ(1, 1, 1). В качестве примера выберем из регистра сведений РаботникиОрганизаций записи у которых не заполнен ПериодЗавершения:

НАЧАЛОПЕРИОДА

Для указанной даты возвращает начало периода в который она входит.
Синтаксис:
НАЧАЛОПЕРИОДА(Дата, ТипПериода)
ТипПериода может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ
В консоли запросов введите:

Запрос вернет – 01.01.2016
А теперь пример. Как известно периодичность у регистра РаботникиОрганизаций один день. Составим запрос в котором вместо действительного периода записей будет отображаться дата начала месяца.

КОНЕЦПЕРИОДА

Синтаксис такой же как и у начала периода. И как ясно из названия возвращает конец периода по дате и типу периода. Подробно рассматривать не будем. Ограничимся мини примером.
Запрос:

ДОБАВИТЬКДАТЕ

Добавляет к дате указанное количество временных интервалов.
Синтаксис:
ДОБАВИТЬКДАТЕ(Дата, ТипПериода, Количество)
ТипПериода принимает те же значения, что и для функции НАЧАЛОПЕРИОДА
Для примера выберем февральскую дату:

РАЗНОСТЬДАТ

Расчитыват разность между двумя датами в указанных единицах измерения.
Синтаксис:
РАЗНОСТЬДАТ(ДатаНачала, ДатаОкончания, ТипПериода)
Тип периода может принимать значения: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД
Например:

Здесь были рассмотрены наиболее часто употребляемые функции языка запросов 1С. Остальные применяются достаточно редко. При необходимости примеры работы с ними можно посмотреть в справке, встроенной в платформу 1С.

Оказывается, это очень просто сделать в механизме 1С СКД, сейчас расскажу.

Сначала создадим новый отчет и зайдем в систему компоновки данных. Напишем простенький запрос с параметрами, задающими период. Например, выведем остатки и обороты за какой-то промежуток времени:

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

РегистрНакопления.СвободныеОстатки.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, ) КАК СвободныеОстаткиОбороты

создание нового стандартного периода

включать в пользовательские настройки отчета в 1С

После всего проделанного сохраняем отчет и открываем его в режиме предприятия. Теперь мы можем выбирать дату следующим образом:

выбор периода в отчете на СКД в 1С 8.3

Следует заметить, что при выборе стандартного периода конечная дата всегда будет 23:59:59 (включая последнюю секунду).

В запросах 1С, так же как и во встроенном языке платформы 1С:Предприятие, есть функции для работы с датами. Они помогают упростить преобразования дат в запросах, избежать использования большого количества параметров. Рассмотрим эти функции.

Как задать дату в запросах 1С в виде константы

Для этого используется функция ДАТАВРЕМЯ (Год, Месяц, День, Час, Минута, Секунда). Параметры Год, Месяц и День являются обязательными, остальные — нет. Если не указать время, то системой будет установлено начало дня.

Кроме того, в качестве параметров этой функции могут быть указаны только числа в явном виде. Нельзя в качестве параметров указывать значения других функций. Например, такая конструкция работать не будет:

Запрос . Текст = "ВЫБРАТЬ
ДАТАВРЕМЯ (Год (Источник.Дата),09,28,12,22,00)
Из Справочник.Источник КАК Источник" ;

Как получить начало или конец года, полугодия, квартала, месяца, декады, недели, дня, часа, минуты в запросах 1С

Для этого используются соответственно функции:

  • НачалоПериода (Дата, Период)
  • КонецПериода (Дата, Период)

В качестве параметра Дата передается значение с типом Дата. Параметр Период может принимать одно из следующих значений: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, ДЕКАДА, МЕСЯЦ, КВАРТАЛ, ПОЛУГОДИЕ, ГОД.

Запрос . Текст = "ВЫБРАТЬ
НачалоПериода(ДАТАВРЕМЯ (2016,09,28,12,22,00), ДЕКАДА)" ; // Результат: 21 сентября 2016 0:00:00

Запрос . Текст = "ВЫБРАТЬ
КонецПериода(ДАТАВРЕМЯ (2016,09,28,12,22,00), КВАРТАЛ)" ; // Результат: 30 сентября 2016 23:59:59

Как видно из примеров, в этих функциях можно использовать другие, вложенные, функции.

Как получить в запросах 1С год, день года, квартал, месяц, неделю, день недели, день, час, минуту, секунду из даты

Для этого существуют соответствующие функции, в которые нужно передать дату в качестве параметра.

  • Функция ГОД (Дата) — возвращает номер года;
  • Функция ДЕНЬГОДА (Дата) — возаращает номер дня в году;
  • Функция КВАРТАЛ (Дата) — возвращает номер квартала;
  • Функция МЕСЯЦ (Дата) — возвращает номер месяца;
  • Функция НЕДЕЛЯ (Дата) — возвращает номер недели в году;
  • Функция ДЕНЬНЕДЕЛИ (Дата) — возвращает номер дня в неделе (понедельник — 1, воскресенье — 7);
  • Функция ДЕНЬ (Дата) — возвращает номер дня в месяце;
  • Функция ЧАС (Дата) — возвращает час;
  • Функция МИНУТА (Дата) — возвращает минуты;
  • Функция СЕКУНДА (Дата) — возвращает секунды.

Запрос . Текст = "ВЫБРАТЬ
ГОД(ДАТАВРЕМЯ (2016,09,28,12,22,00))" ; // Результат: 2016

Запрос . Текст = "ВЫБРАТЬ
НЕДЕЛЯ(ДАТАВРЕМЯ (2016,09,28,12,22,00))" ; // Результат: 40

Запрос . Текст = "ВЫБРАТЬ
ДЕНЬНЕДЕЛИ(ДАТАВРЕМЯ (2016,09,28,12,22,00))" ; // Результат: 3

Запрос . Текст = "ВЫБРАТЬ
ДЕНЬГОДА(ДАТАВРЕМЯ (2016,09,28,12,22,00))" ; // Результат: 272

Запрос . Текст = "ВЫБРАТЬ
ДЕНЬ(ДАТАВРЕМЯ (2016,09,28,12,22,00))" ; // Результат: 28

Как добавить к дате или отнять от даты год, полугодие, квартал, месяц, декаду, неделю, день, час, минуту, секунду в запросах 1С

Для этого используется функция ДобавитьКДате (Дата, Период, Значение).

В качестве параметра Дата передается значение с типом Дата. Параметр Период может принимать одно из следующих значений: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, ДЕКАДА, МЕСЯЦ, КВАРТАЛ, ПОЛУГОДИЕ, ГОД.

Параметр Значение показывает количество добавляемых периодов. Если период нужно вычесть, то параметр Значение должен быть отрицательным.

Запрос . Текст = "ВЫБРАТЬ
ДобавитьКДате(ДАТАВРЕМЯ(2016, 9, 28, 12, 22, 0), ПОЛУГОДИЕ, 1)" ; // Результат: 28 марта 2017 12:22:00

Запрос . Текст = "ВЫБРАТЬ
ДобавитьКДате(ДАТАВРЕМЯ(2016, 9, 28, 12, 22, 0), ДЕКАДА, -1)" ; // Результат: 18 сентября 2016 12:22:00

Как вычислить разность дат в запросах 1С

Для этого используется функция РазностьДат (Дата1, Дата2, Период).

Параметр Дата1 — дата, которую вычитают.

Параметр Дата2 — дата, из которой вычитают.

Параметр Период может принимать одно из следующих значений: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД. Он показывает, в каких единицах мы хотим получить результат

Запрос . Текст = "ВЫБРАТЬ
РазностьДат(ДАТАВРЕМЯ(2016, 9, 28, 12, 22, 0), ДАТАВРЕМЯ(2017, 9, 28, 12, 22, 0), КВАРТАЛ)" ; // Результат: 4

Запрос . Текст = "ВЫБРАТЬ
РазностьДат(ДАТАВРЕМЯ(2016, 9, 28, 12, 22, 0), ДАТАВРЕМЯ(2017, 9, 28, 12, 22, 0), Секунда)" ; // Результат: 31 536 000

Во всех функциях, кроме функции ДАТАВРЕМЯ, в качестве параметра Дата может выступать не только конкретное значение даты (константа или параметр запроса), но и поля таблицы источника.

Добавить комментарий Отменить ответ

Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.

Favorite

also Что-то вроде FAQ Отзывов (4) В закладки

Создадим отчет с одни набором данных запрос:


Теперь перейдем на вкладку параметры и увидим что система, помимо нашего параметра &МояДата создала еще и параметр &Период.
Для того, чтобы наглядно наблюдать за периодами, создадим основную форму отчета и поместим на нее табличное поле с данными: КомпоновщикНастроек.Настройки.ПараметрыДанных

Сохраним отчет и откроем его в предприятии. В табличном поле с параметры отображается только параметр &Период:


Соответственно, любое изменение этого параметра не даст нужного результата.

Почему недоступен параметр &МояДата? Конечно же потому что на вкладке параметры у него установлена галку Ограничение доступности.


Снимаем галку. Теперь в доступных параметрах видим оба. Только при формировании отчета увидим, что отчет реагирует на параметр &Период, а не на &МояДата.

В данном примере самое простое переименовать в запросе параметр &МояДата на &Период и добиться нужного результата. Но может быть у Вас запрос, в котором уже использовался параметр &Период, или Ваши религиозные взгляды не разрешают Вам использовать этот параметр, в любом случае можно решить проблему так:

UPD от пользователя Boo:

Есть одно уточнение: Реагирует на &Период при одновременном использовании с &МояДата…А то всю голову сломал – по отдельности нормально реагирует…

Главная проблема при использовании “стандартных” (добавляемых системой) параметров в том что при использовании в отчете нескольких виртуальных таблиц, в случае определения этого параметра, его значение будет использоваться во всех остальных случаях взамен “собственных”.
Приведу пример:
ВЫБРАТЬ
РаботникиОрганизацийСрезПоследних.Сотрудник,
РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния,
РаботникиОрганизацийСрезПоследних.Период,
РаботникиОрганизацийСрезПоследнихДругаяДата.Период КАК Период2,
РаботникиОрганизацийСрезПоследнихДругаяДата.ПричинаИзмененияСостояния КАК ПричинаИзмененияСостояния2
ИЗ
РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, Сотрудник = &Сотрудник) КАК РаботникиОрганизацийСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДругаяДата, ) КАК РаботникиОрганизацийСрезПоследнихДругаяДата
ПО РаботникиОрганизацийСрезПоследних.Сотрудник = РаботникиОрганизацийСрезПоследнихДругаяДата.Сотрудник

Во втором подзапросе, в качестве параметра даты среза будет использовано значение “стандартного” параметра ПЕРИОД, а не значение ДругаяДата.

Данный “глюк” будет наблюдаться даже в том случае если второй подзапрос вывести во второй набор данных и связать уже средствами СКД. Вариант с использованием во втором запросе ваыражения типа “ДОБАВИТЬКДАТЕ(&Период, МЕСЯЦ, -1) ” тоже не сработает, месяц не вычтется. А вот переименование в запросе параметра “Период” в, например, “ПерваяДата”, решает эту проблему.

Кстати, точно такая же проблема наблюдается с виртуальными таблицами регистров накопления и бухгалтерии, используемыми для получения, например, оборотов. Там система добавляет параметры “НачалоПериода” и “КонецПериода”.
Так что в случае запросов даже чуть повышенной сложности, есть смысл выключать доступность и использование “стандартных периодов”.

Читайте также: